martedì 24 febbraio 2015

Treemap e l'avventura con IOS

Un caloroso saluto a tutti!

L'ospite della puntata odierna è la treemap, un metodo di visualizzazione di dati gerarchici tramite l'uso di rettangoli la cui grandezza è basata sul peso del dato nell'insieme.

Per darvi un'idea approssimativa del risultato finale vi fornisco di seguito una piccola treemap di esempio generata con Google Charts.



Da un punto di vista prettamente accademico, esistono diversi algoritmi che consentono di ottenere una treemap, ma per una dissertazione di questo tipo vi rimando direttamente all'ottima pagina di spiegazione della sempre bianca Wikipedia.

Quello che mi interessa farvi conoscere su questo blog è il metodo di approccio ad una soluzione del genere in un ambiente che al momento fornisce poche soluzioni già fatte, non sempre flessibili e spesso a pagamento. Sto ovviamente parlando di iOS.

Recentemente infatti ho dovuto impelagarmi nello sviluppo di una treemap piuttosto complicata che necessitava anche di interattività da parte dell'utente: stiamo parlando di un'app, quindi se non tappi, swipi o altro non sei contento.
In realtà la soluzione a me richiesta può essere definita come una treemap con treemap innestate, quindi una rottura di scatole di secondo livello.

Visto che in programmazione si deve sempre tendere a non scoprire l'acqua calda, per prima cosa ho analizzato lo stato dell'arte delle treemap per iOS: si partiva da codice troppo obsoleto per essere usato in iOS 8, fino a realizzazioni graficamente interessanti ma completamente prive di interattività.
Risultato?
Me la sono dovuta fare io.

Innanzitutto sono partita da un documento accademico, per capire effettivamente cosa significa in termini matematici realizzare una treemap. Questo perché siamo programmatori di un calcolatore e solo se si conosce approfonditamente il ragionamento matematico e logico di un problema si può fare del buon codice.
Comunque!
Dopo una rapida lettura dell'illuminante Squarified Treemaps di Bruls, Huizing e van Wijk dell'Eindhoven University of Technology, mi sono lanciata nell'analisi di altri script basati su questo specifico algoritmo.

Alcune soluzioni erano molto carine, quindi ho deciso di concentrarmi su una in particolare, in javascript, che implementava perfettamente la procedura sopra citata.
Devo ammettere che è stato divertente partire dal javascript come base per passare a scrivere una libreria in Swift, cercando di sfruttare pienamente tutte le funzioni che non esistono nel primo ma che risolvono parecchi grattacapi nel secondo.

Alla fine sono giunta alle seguenti conclusioni!
Per una treemap la soluzione migliore è una UICollectionView con un layout custom che estende un UICollectionViewFlowLayout. In questo modo potete separare lo strato dei dati, che gestirete nella view, e l'algoritmo di posizionamento dei singoli box, che invece sarà compito del layout.
Per l'interazione invece potete delegare tutto al UIViewController che avrà al suo interno la UICollectionView: UICollectionViewDelegate con implementazione del didSselectItemAtIndexPath e passa la paura.

Per una gestione migliore dei dati, conviene fare una classe ad hoc, senza quindi passare brutalmente un array di CGFloat: nella nostra UICollectionView potremo farci delle funzioni per gestire eventuali conversioni, dato comunque che lo stesso set di dati deve essere normalizzato prima di entrare in gioco attivamente.
Nel layout vi conviene comunque ragionare in termini di CGRect, visto comunque che l'obiettivo finale dell'elaborazione dovrà essere un array di rettangoli.

Graficamente parlando, avendo scelto una UICollectionView, ogni elemento della nostra treemap sarà una cella, quindi potremo impostare un colore di background, mettere o meno un bordo ed inserire anche una legenda. In questo caso possiamo addirittura fare uno xib da usare come base per una successiva personalizzazione via codice.

Come avete ben potuto capire, non posso svelare per filo e per segno il codice che ho sviluppato: non è stato scritto con logica opensource, ma comunque posso ugualmente dare consigli in merito.
Quindi sono disponibile a chiarire eventuali dubbi durante il vostro sviluppo o, se proprio avete fretta e dovete realizzare una treemap in tempi brevi, posso mettervi in contatto con il commerciale dell'azienda per cui lavoro.

Che il potere del bit sia con voi!

lunedì 9 febbraio 2015

Inaugurazione

Un caro saluto su queste lande digitali!

Era da parecchio tempo che volevo creare un blog a carattere prettamente informatico, parallelamente al mio affezionatissimo Bestiario, e finalmente ho avuto il coraggio di cliccare su due tasti e dargli vita.

Innanzitutto parliamo del titolo: 64 Sfumature di Bit.

Perché? Semplice! Basta guardare per sbaglio la tv o andare al cinema o in libreria per capire che qualcosa con un titolo simile sta facendo parlare di sé. Qualcosa praticamente nulla ha a che vedere con il mondo dell'informatica, decisamente più immateriale.
Il fatto più interessante è che pare che le donne impazziscano sia per la versione cartacea che per la resa cinematografica dell'opera precedentemente lasciata intuire.

Un attimo! (come disse Phoenix Wright)

Io sono una donna (fino a prova contraria e non ho alcuna intenzione di cambiare)!
E quindi...?
Quindi non mi interessa! Preferisco le 64 sfumature di bit!
Vuoi mettere il piacere di sviluppare uno script, di mandare in overload i neuroni anche solo per il gusto di infondere la vita ad una sequenza di bit?
E l'emozione del primo Hello World?

Basta, mi avete capita, non devo aggiungere altro.

Una domanda però sorge spontanea: che tipo di testo verrà salvato nei record della tabella dei post legata a questo blog?

Appunti, memento, spiegazioni. Ovvero userò questo spazio come diario di bordo, strumento di divulgazione e blocco di carta.

Per il momento la chiudo qui perché ho altro da fare! XD

SYS! (See You Soon)




P.S. Sì, lo so, la grafica fa letteralmente vomitare, ma abbiate pazienza: prima o poi la cambierò!