domenica 11 luglio 2010

foreach() in JavaScript

Qualche tempo fa il mio collega Jak aveva postato come creare un foreach in Java. Questo tipo di for esiste anche in JavaScript (anche se molti non lo chiamano foreach ma for in). L'idea di fondo è sempre la stessa e può funzionare con qualsiasi tipo di oggetto, non solo arrays:
for(var object in objects){
//fai qualcosa con object
}
Object è chiaramente uno degli oggetti in objects, quindi il for itera lungo il contenuto di objects.
Il problema in JavaScript è che l'enumerazione in questo caso contiene anche funzioni e proprietà del prototype che è presente in JavaScript (per chi non lo sapesse, una specie di superclasse di Java con diverse proprietà). Per filtrare questi valori è necessario aggiungere un paio di controlli:
for(var object in objects){
if(typeof objects[object] !== 'function'){
//fai qualcosa con object
}
}
Ricordiamoci però che con il foreach non abbiamo garanzie sull'ordine degli oggetti all'interno dell'oggetto objects. Per averli estratti in ordine bisognerà utilizzare un for normale.

Hope it helps ;)

sabato 26 giugno 2010

Anatomia di un'applicazione Android

Ho pensato di scrivere questo post perchè nonostante sia da qualche tempo che lavoricchio dietro Android, non mi sono mai interessato veramente a quale sia l'anatomia di un'applicazione.

Dunque, ci sono quattro principali blocchi per la costruzione di un'applicazione per Android. Essi sono:
  • Activity
  • Intent Receiver
  • Service
  • Content Provider
Chiaramente non tutte le applicazioni hanno bisogno di averle tutte e quattro, ma di norma le applicazioni sono una combinazione di queste.
Una volta che si è deciso quali componenti sono necessari per l'applicazione, vanno scritti nel file AndroidManifest.xml. Questo è un file (in formato XML) dove sono dichiarati tutti i componenti delle applicazioni ed i loro requisiti.

Activity

Le activity sono i blocchi più comuni per la creazione di applicazioni. Di norma un'activity è uno schermo singolo dell'applicazione. Ogni activity è implementata in una singola classe che estende la classe Activity e mostra la user interface composta da Views e risponde agli eventi. Molte applicazioni chiaramente consistono di schermi multipli. Per esempio un'applicazione per mandare SMS potrebbe avere uno schermo che mostra la lista di contatti per scegliere il destinatario di un messaggio, un secondo schermo per scrivere il messaggio al contatto ed altri schermi per vedere i messaggi già mandati. Ognuno di questi schermi deve essere implementato come Activity. Muoversi da uno schermo all'altro si esegue semplicemente startando una nuova activity. In alcuni casi un'activity può ritornare dei valori all'activity precedente. Per esempio un'activity che sceglie una foto dalla library ritornerà all'activity precedente la foto scelta.
Quando un nuovo schermo si apre, lo schermo precedente si mette in pausa ed è messo su una stack history. L'user può comunque navigare indietro, in schermi precedentemente aperti. Gli schermi possono anche essere eliminati dalla stack history quando non sono più necessari. Android mantiene la stack history per ogni applicazione lanciata.

Intent and Intent Filters

Android usa una classe speciale chiamata Intent per muoversi da schermo a schermo. Un intent descrive cosa un'applicazione vuole che venga effettuato. Le due parti più importanti della struttura dell'intent sono l'azione e i dati su dove deve agire. I tipici valori per l'azione sono MAIN (la principale per l'activity), VIEW, PICK, EDIT, ecc. I dati sono espressi come URI. Per esempio per vedere le informazioni di una persona (attraverso il contatto nella rubrica), bisogna creare un intent che con l'azione VIEW e con il data settato come URI che rappresenta quella persona.
C'è una classe legata all'intent che è l'IntentFilter. Mentre l'intent è l'effettiva richiesta di fare qualcosa, l'intent filter è una descrizione di quali intenti un'activity è capace di manipolare. Un'activity che mostra le informazioni di contatto di una persona pubblicherà un IntentFilter che mostrerà che è capace di manipolare l'azione VIEW quando applicata su un dato che rappresenta una persona. Le activity pubblicano i loro IntentFilters nel file AndroidManifest.xml.
Navigare da schermo a schermo è compiuto risolvendo intenti. Per navigare in avanti, un'activity chiama startActivity(myIntent). Il sistema quindi cerca gli intent filters per tutte le applicazioni installate e prende l'activity per l'acquale l'intent filter combacia meglio con myIntent. La nuova activity è informata dell'intent e la lancia. Il processo di risolvimento di intent avviene in run time quando startActivity è chiamato, il che offre due benefici:
  • Le activity possono riutilizzare funzionalità di altri componenti semplicemente facendo una richiesta nella forma di un intent
  • Le activity possono essere rimpiazzate in qualsiasi momento da una nuova activity con un IntentFilter equivalente

Intent Receiver

L'IntentReceiver è usato quando si vuole far eseguire qualcosa all'applicazione in reazione ad un evento esterno. Per esempio, quando il telefono suona, o quando c'è una rete a cui collegarsi, o quando è mezzanotte. Gli intent receivers non hanno una UI, ma possono usare il NotificationManager per avvertire l'utente se qualcosa di interessante è successo. Anche gli intent receivers sono registrati nell'AndroidManifest.xml, ma si possono anche registrare dal codice usando Context.registerReceiver(). L'applicazione che lancia l'intent receiver non deve star per forza runnando per fare in modo che l'intent receiver sia chiamato: il sistema starterà da solo l'applicazione se necessario quando un intent receiver è eseguito. Le applicazioni possono anche mandare i propri intent ad altre applicazioni attraverso Context.broadcastintent().
Due parole sui Service: un service è un codice che runna senza UI. Un buon esempio è un media player che sta riproducendo delle canzoni da una playlist. In un media player ci saranno una o più activities che permettono all'utente di scegliere le canzoni e farle riprodurre. In ogni caso la musica si suona continuerà a suonare anche se l'utente naviga altrove (in altre applicazioni per esempio), questo perche l'activity del media player può lanciare un service usando Context.startService() in background per fare in modo che la musica continui. La musica continuerà a suonare finchè non finisce. Un'altra cosa interessante è che ci si può connettere ai services attraverso Context.bindService(). Quando connesso ad un service, si può comunicare attraverso un'interfaccia esposta da quest'ultimo. Nell'esempio del media player, questo servizio potrebbe permettere all'utente di fermare o far ricominciare la musica.

Content Provider

Le applicazioni possono conservare dati in files, database SQLite, o ogni altri tipo di meccanismo che ha senso. Un content provider è utile quando si vuole condividere le informazioni di un'applicazione con altre applicazioni. Un content provider è una classe che implementa un set di metodi standard per lasciar depositare e ritirare informazioni dalle altre applicazioni. Per avere più informazioni riguardo al content provider comunque, consiglio di riferirsi all'API di Android sotto Accessing Content Providers.

Hope it helps ;).

martedì 15 giugno 2010

Ubuntu LTS e Virtualbox: ambiente di sviluppo perfetto

Visto che ogni sei mesi Canonical rilascia una nuova versione di Ubuntu, e che di solito ogni versione porta con se numerose novità (oltre alle versioni aggiornate di tutti i pacchetti), di fatto si è costretti a fare un avanzamento di versione ogni volta, o per chi non si fida (come me), una reinstallazione.

Un pc di sviluppo però dovrebbe essere il meno soggetto possibile a cambiamenti, soprattutto se lo usiamo per lavoro (dove il tempo ha un costo preciso) ma anche se programmiamo per hobby, dato che è un'attività nella quale si investono molte ore. Come far convivere quindi la comodità di software sempre aggiornato per un normale utilizzo desktop, con la necessità di un ambiente di sviluppo stabile e sempre funzionante?

giovedì 10 giugno 2010

Cambiare le dimensioni di un'immagine in Android

Ultimamente ho deciso di testare un po' l'API di Android, così ho scaricato il plugin per Eclipse e mi sono messo a scrivere un semplice solitario simile a quello di Windows. Appena cominciato a lavorare sull'interfaccia grafica ho avuto subito un problema: le immagini delle carte erano troppo grandi.
Ho cercato un modo semplice semplice per ridurre le dimensioni di un'immagine, ma non sono riuscito a trovare nulla. Alla fine ho scritto un metodo che lo facesse per me:

foreach() in Java

Oggi ho scoperto con piacere che in Java è possibile usare qualcosa di molto simile al foreach() di PHP.
Sono io che ero male informato oppure questa non è una caratteristica molto conosciuta?

In ogni caso, la sintassi è la seguente:
for (Object single_object : objects_arraylist) {
casted_object = (OriginalClass)single_object;
[...]
}

lunedì 7 giugno 2010

Le meraviglie del multiprocesso di Internet Explorer

Questa vale la pena raccontarla.

Oggi, dopo un sacco di tempo ho fatto il boot di Windows 7. Ebbene, avvio internet explorer (mai usato, tant'è che è comparso il popup di benvenuto) e apro google translate... il browser si congela per sei o sette secondi per poi chiedermi di installare flash player...???

Ora invece sto scrivendo questo post da una revisione minefield di mozilla (3.7a5pre, per la precisione) e tutto procede senza intoppi : D

venerdì 4 giugno 2010

Samsung Galaxy S, da subito anche in Europa e Svizzera

Il maginifico Galaxy S, il terminale di Samsung presentato a Zurigo il 4 giugno, sarà reso disponibile in 110 nazioni contemporaneamente, stando a quando sostiene Korea IT Times.

Gli operatori europei fin qui accertati sono Orange, la quale opera in molti paesi del continente (tra i quali Francia, Inghilterra e Svizzera) e Deutsche Telecom, ma ve ne sono molti altri.
Non sorprende che Samsung abbia pianificato un lancio in grande stile per il suo ultimo terminale: possiede tutte le potenzalità per imporsi sul mercato, in special modo quello europeo dove molti dei migliori smartphone quasi certamente non arriveranno (come HTC Evo 4G e HTC Incredibile, per esempio).