ThinkCode.TV, screencast di programmazione in italiano


Un paio di mesi fà mi sono imbattuto in ThinkCode.TV, una startup nordamericana fondata da tre italiani con l’obiettivo di creare e vendere screencasts di programmazione in italiano. La cosa che inizialmente mi ha fatto riflettere è che la tendenza a lasciare il “bel” paese per  motivi di lavoro “purtroppo” non si arresta, contribuendo di fatto ad un ulteriore impoverimento nazionale. 

A livello tecnico, la cosa che mi ha incuriosito è stata la varietà di tematiche offerte dagli screencasts; si passa infatti attraverso SmallTalk, Python, Jquery, Silverlight fino ad arrivare al TDD. Dopo essere entrato in contatto con gli autori per avere alcune informazioni sia sulla loro esperienza di vita e professionale oltreoceano sia sugli screencast legati al TDD, ho ricevuto un paio di screencast come review copies. Come reviewer ed ancor prima come utente quello che ho notato da subito è stata la trasparenza ed accessibilità dei prezzi e la fiducia che i ragazzi di ThinkCode ripongono nei propri clienti in quanto:

  • L’intero percorso formativo sul TDD (11 lezioni), viene offerto ad un prezzo molto abbordabile di 47 € iva inclusa.
  • E’ possibile acquistare le singole videolezioni ad un prezzo di circa 7€ (anzi 6.99€ LOL)
  • Gli screencast, registrati in vari formati e scaricabili in alta definizione (HD 720p), sono liberi da DRM
  • E’ possibile per ogni screencast visionare una preview di un paio di minuti

Quello che mi ha colpito durante la visione degli screencasts è l’approccio utilizzato: inizialmente vengono proposte alcune slides introduttive (necessarie per fissare sin da subito alcuni concetti) e successivamente vengono mostrati i relativi samples attraverso molteplici linguaggi di programmazione ed ambienti di sviluppo; quest’ultimo aspetto aiuta secondo me a mantenere una concentrazione maggiore proprio perchè non si ha la classica sensazione di “familiarità” (tipo la classica coppia C# & VS) che spesso porta ad una minore attenzione. A livello universitario ad esempio un corso del genere sul TDD dovrebbe IMVHO essere introdotto all’interno di un corso di ingegneria del software. L’unico appunto che mi sento di fare ai ragazzi è di essere più celeri nella preparazione dei percorsi formativi in quanto ad oggi ancora molti screencast sono in fase di preparazione.

author: Luca Del Tongo | posted @ venerdì 5 marzo 2010 11.38 | Feedback (4)

Emgu CV: A computer vision Library


In questi ultimi mesi mi sto interessando di Computer Vision. Sto cercando di sfruttare gli ultimi mesi ed esami universitari per cercare di capire quale siano le varie aree di ricerca che maggiormente mi interessano e le prospettive presenti sul panorama nazionale.  Dopo essermi concentrato sugli algoritmi e le strutture dati, aver studiato ed implementato alcuni algoritmi di data mining e business intelligence, l’ultimo elaborato che ho svolto per un progetto universitario riguarda proprio la computer vision, in particolar modo il riconoscimento di oggetti. Attualmente sono davvero poche le librerie ed i wrapper C# che implementano algoritmi di computer vision. La libreria che preferisco e che ho utilizzato per alcuni esperimenti piuttosto interessanti è Emgu CV.

Emgu CV è un wrapper .Net della famosa libreria Intel OpenCV. Tra i punti di forza di Emgu CV sicuramente il fatto che sia cross platform e che l’autore abbia un ciclo di sviluppo piuttosto agile; nuove release frequenti corredate da unit test. Gli esperimenti corredati da codice c# realizzati utilizzando Emgu, li potete trovate all’interno della sezione di Emgu CV (di cui sono moderatore) del più importante forum di computer vision, ovvero il forum di Flavio Bernardotti. All’interno del forum ho mostrato esempi di come calcolare il flusso ottico all’interno di un semplice video, di come realizzare riconoscimento facciale etc etc. Ho poi registrato alcuni tutorial in inglese in cui mostro ad esempio come eseguire eye detection oppure come controllare all’interno di una windows form la posizione del mouse semplicemente muovendo la testa.

Chiunque abbia esperienze e/o suggerimenti anche con altre librerie (Aforge.Net su tutte), si faccia vivo :)

 

author: Luca Del Tongo | posted @ domenica 30 agosto 2009 14.44 | Feedback (4)

SSAS: SVM algorithm Plugin


Difficilmente posto news, stavolta però farò un eccezione in quanto su codeplex, alcuni sviluppatori di Avanade hanno realizzato un plugin per Sql Server hostato su codeplex che implementa una SVM. Al momento attuale può essere utilizzato per eseguire classificazione confrontando le prestazioni del modello con gli altri che si possono costruire usando gli algoritmi inclusi in SSAS(Decision Trees, Naive Bayes, Neural Network ); ho condotto alcuni esperimenti e devo dire che l'implementazione dell'algoritmo è buona anche se come ho suggerito nel forum è necessario inserire un modo per calcolare i parametri ottimali per l'addestramento della macchina; il mio suggerimento è stato quello di eseguire un ricerca dei parametri utilizzando una grid search verificando la bontà dei parametri utilizzando la cross validazione (quest'ultima inclusa in Sql Server 2008)... insomma un in bocca al lupo ai developer per la bella iniziativa... magari se trovo un pò di tempo sarebbe bello fare una comparazione delle prestazioni tra il plugin e libsvm ma ancora il plugin è giovane e di strada ne dovrà fare molta....

Ad maiora

author: Luca Del Tongo | posted @ giovedì 5 febbraio 2009 21.54 | Feedback (1)

Microsoft Robotics Studio: Custom Drive by Wire


Apro questo post ringraziando gli amici che hanno accompagnato la mia avventura da student partner, bella esperienza terminata lo scorso anno... non voglio dilungarmi sulle motivazioni di questa decisione, resta il fatto che il bello di essere studenti DOVREBBE essere quello di avere la libertà di scegliere senza avere vincoli o restrizioni del caso... detto questo lo scorso fine settimana è arrivato il premio per il "lavoro" che ho svolto da MSP... un bel Lego Mindstorm NXT!!!! Il kit è davvero bello e dopo aver preso contatto con i vari sensori e aver costruito il primo semplice robottino ho deciso di creare la prima applicazioncina VPL, la classica drive by wire.... ora nei tutorial presenti dentro la documentazione di MSRS è presente un diagramma VPL drive by wire ma dato che non ho condiviso alcune scelte che hanno fatto, ho deciso di crearne uno modificato (in meglio spero) che permetta di pilotare il robottino a proprio piacimento!!!! Allego lo screenshot del VPL per chi fosse interessato :)

author: Luca Del Tongo | posted @ lunedì 26 gennaio 2009 17.50 | Feedback (3)

Aggiornamento Data Structure and Algorithms Book


Proprio prima di Natale, con il mio amico Granville abbiamo rilasciato un aggiornamento del libro gratuito che abbiamo scritto su algoritmi e strutture dati. Sono stati introdotti alcuni capitoli aggiuntivi e revisionati quelli già presenti nella prima release. I numeri lasciano spesso il tempo che trovano però aver ricevuto oltre 14.000 download per l'ultima release fà davvero piacere.

Data Structures and Algorithms: Annotated Reference with Examples

dsa

Technorati Tag: ,

author: Luca Del Tongo | posted @ venerdì 19 dicembre 2008 10.00 | Feedback (5)

Braincode: gli artigiani del codice


Molto spesso frequentando le community di webdesigner e sviluppo web in generale mi sono imbattuto in banner pubblicitari che effettuano il famoso servizio di conversione PSD-to-HTML. Finalmente anche nel panorama italiano, nasce un progetto piuttosto ambizioso, codename Braincode , creato da una web agency italiana X-brain. Il servizio offerto permette di trasformare formati grafici quali psd, jpeg, png in pagine xhtml e css, promettendo una conversione piuttosto rapida nell' arco di 2/3 giorni lavorativi, in base alla complessità del progetto. La prima cosa che ho fatto per verificare se davvero fossero artigiani del codice come da slogan è stata quella di spulciare attraverso il portfolio, il codice che hanno prodotto per i clienti e devo dire che in effetti il codice è davvero ben fatto.... ritengo quindi utile avere un servizio del genere per chi sviluppa web sia perchè velocizza lo sviluppo sia perchè avere un codice statico ben fatto fornisce secondo me quello che deve essere cmq l'output generato utilizzando cmq asp.net. E' proprio per questo che il mio migliore amico come al solito è il Repeater!!!

Per concludere, altrimenti sembra pubblicità occulta, è possibile avere integrazione con diversi cmq, per la verità adesso Joomla! e Wordpress ma sembra che il supporto venga esteso anche a cms a noi più congeniali, poi alla fin fine l'integrazione la possiamo fare anche da soli :)

author: Luca Del Tongo | posted @ mercoledì 29 ottobre 2008 17.32 | Feedback (5)

Data Structures and Algorithms 0.6 released!


Abbiamo appena rilasciato la versione 0.6 della nostra libreria Data Structure and Algorithms. Questa nuove release include come feature principali:

  • AVL Tree (albero bilanciato)
  • Deque (double ended queue)
  • Radix Sort (algoritmo ordinamento)

Download Data Structures and Algorithms 0.6!

author: Luca Del Tongo | posted @ venerdì 12 settembre 2008 15.24 | Feedback (2)

Download gratuto: Data Structure and Algorithms eBook


E' con grande piacere che dopo alcuni mesi di gestazione insieme al mio amico Granville, abbiamo pubblicato il libro

 Data Structures and Algorithms: Annotated Reference with Example.

Allo stato attuale il libro è ancora un work in progress ma personalmente sono soddisftatto di come sia evoluto nel corso del tempo (sono un pò di parte... ). Il libro è rivolto a tutti coloro che conoscono un linguaggio di programmazione ad oggetti, senza particolari requisiti; l'utilizzo dello pseudo codice pone infatti l'attenzione sulla parte algoritmica piuttosto che su quella di implementazione. La scelta di renderlo totalmente free è data dalla convinzione che fosse la cosa più giusta:) Sono ben accetti quindi consigli suggerimenti etc. etc.

A livello personale, scrivere un libro in inglese non è stato cosi semplice ma sicuramente sono esperienze che servono ad ampliare i proprio orizzonti, collaborare poi con Granville per me è un piacere ed uno stimolo ad un continuo miglioramento.... quindi spread the word!!!!

[EDIT] Ricordo che io, e sopratutto Granville, abbiamo provveduto ad implementare in C# tutti gli algoritmi e le strutture dati presenti nel libro; potete trovare l'implementazione su codeplex al  seguente indirizzo

http://codeplex.com/dsa

Technorati Tag: ,

author: Luca Del Tongo | posted @ mercoledì 27 agosto 2008 19.45 | Feedback (14)

Padre e figlio ... le dimensioni e le prestazioni contano


Per il compleanno di mia sorella ed in vista della sua imminente partenza per Dublino, ho deciso di regalarle un Asus Eee PC 900; ho acquistato la versione con installato linux per avere 20 Gb di memorizzazione SSD (2 schede 4+16). Sono molto soddisfatto dell'acquisto fatto anche se ho dovuto sperimentare alcune specifiche non documentate su cui i produttori come al solito giocano un pò. Dato che mia sorella utilizza regolarmente Windows XP ho deciso in un primo momento di installare suddetto OS.... ho così ottenuto un computer con delle buone performance.... qualche cosa però dentro di me mi ha spinto verso una soluzione un pò più estrema.... il risultato lo vedete qui sotto (cliccare sull'immagine per immagine originale)

Analizzando le specifiche tecniche dell' Eee PC 900 possiamo osservare come questo sia dotato di un Gb di RAM e di un Celeron 900... quindi non proprio in linea con i requisti minimi richiesti da Windows Vista..... ma nell'era della customizzazione perchè non scegliere di farsi un bel Vista su misura eseguendone una vera e propria ricompilazione? Eccoci giunti al punto, utilizzando il mitico Vlite. Questo software permette di selezionare le feature di interesse rimuovendo caratteristiche di Windows non necessarie... fatto questo dato che l'eepc non dispone di un lettore CD ho dovuto selezionare una installazione tramite penna USB.... a questo punto eseguo l'installazione di Vista selezionando come disco SSD quello da 16 Gb..... installo tutti i driver e i software necessari (Office 2007, Messenger, Skype etc...) però nota che il sistema è lento .... troppo lento ..... a questo punto mi sono detto... ecco Luca sei il solito testone... ma online ho scoperto che nn solo l'unico... confortato da questo post ho eseguito un breve performance test su entrambi i dispositivi SSD e ho scoperto... che le performance di accesso e trasferimento dati tra i due hanno prestazioni molto diverse... la scheda SSD da 4 Gb offre prestazioni nettamente superiori... quindi l'installazione del' OS deve essere effettuata su quel disco... essendo da 4 Gb è necessario usare VLite per rimuovere le parti nn necessarie... fatto ciò ho eseguito una nuova  installazione, ho ottimizzato la configurazioni dei services, ho ridotto al minimo gli aspetti grafici, ho spostato lo swap file sul disco da 16 Gb e finalmente sono arrivato ad avere un sistema con delle buone performance, come potete osservare nel video che ho registrato :)

author: Luca Del Tongo | posted @ lunedì 30 giugno 2008 14.53 | Feedback (8)

[University Stuff] Simple NAry Tree


In questi giorni, per un esame di algoritmi distribuiti ho avuto la necessità di lavorare con un particolare albero nario. Genericamente un albero nario è un albero in cui ogni nodo presenta al massino n figli. Un albero binario è un caso particolare di albero nario dove n=2; in figura viene mostrato un albero 3ario.

Vediamo come realizzare un semplice albero nario che permetta di specificare il fattore di ramificazione e che permetta di inserire nodi all'interno dell' albero in modo tale che l'albero venga riempito livello per livello (prima ci creare un nuovo livello si porta a saturazione il livello corrente). Prima di passare alla definizione dell' albero voglio ricordare come un albero nario possa contenere un numero massimo di nodi per una certa altezza h pari a:

MaxNumNodi = N^(h+1)-1/N-1

In riferimento alla figura sopra esposta possiamo osservare che con N=3 ed h=2 otteniamo un numero massimo di nodi pari a 13. Passiamo adesso alla definizione del nostro albero. Per prima cosa definiamo due classi: una container che rappresenta l'albero ed esponde le funzionalità ed una che rappresenta i nodi all'interno di un albero.

   1: public class NAryTree<T> where T:IComparable<T>
   2:     {
   3:         public NAryNode<T> root { get; set; }
   4:         public int branchFactor { get; set; }        
   5:         
   6:         public NAryTree(T rootValue, int BranchFactor)
   7:         {
   8:             branchFactor = BranchFactor;
   9:             root = new NAryNode<T>(rootValue, branchFactor);
  10:         }
  11:         .
  12:         .
  13:         .
  14:     }    

Come possiamo vedere la classe generica NAryTree tiene traccia della radice dell'albero e del fattore di ramificazione (numero di figli o arità). La constraint sul tipo generico in realtà nn viene utilizzata in quanto non si ha ordinamento parziale tra gli elementi ma serve come base per un eventuale albero nario di ricerca. Passiamo adesso alla classe NAryNode:

 

   1: public class NAryNode<T> where T:IComparable<T>
   2:     {
   3:         public T value { get; set; }
   4:         public int childnum { get; set; }
   5:         public NAryNode<T>[] childs { get; set; }
   6:  
   7:         public NAryNode(T Value, int branchFactor)
   8:         {
   9:             value = Value;
  10:             childnum = branchFactor;
  11:             childs = new NAryNode<T>[branchFactor];
  12:         }
  13:     }

Anche la definizione di questa classe risulta abbastanza semplice.... abbiamo una property che memorizza il valore del nodo, un array di nodi figlio ed ancora una proprietà che mi informa sul numero di nodi figlio (proprietà ridondante avendo memorizzato questa info per la classe NaryTree ). Vediamo adesso come inserire per livelli i nodi all'interno dell' albero...

   1: public void Insert(T value)
   2:        {
   3:            NAryNode<T> firstFreeNode = FindFirstFreeNode(root);
   4:            firstFreeNode.childs[CountImmediateChildren(firstFreeNode)] = new NAryNode<T>(value, branchFactor);            
   5:        }
   6:  
   7: private int CountImmediateChildren(NAryNode<T> node)
   8:        {
   9:            int count = 0;
  10:            for (int i = 0; i < node.childnum; i++)
  11:            {
  12:                if (node.childs[i] != default(NAryNode<T>))
  13:                    count++;
  14:            }
  15:            return count;
  16:        }
  17:  
  18:        private NAryNode<T> FindFirstFreeNode(NAryNode<T> root)
  19:        {
  20:            //BREADTH FIRST WAY!!!!
  21:            Queue<NAryNode<T>> row = new Queue<NAryNode<T>>();
  22:            row.Enqueue(root);
  23:            while (row.Count > 0)
  24:            {
  25:                NAryNode<T> currentNode = row.Dequeue();
  26:                if (CountImmediateChildren(currentNode) < root.childs.Length)
  27:                {
  28:                    return currentNode;
  29:                }
  30:                for (int index = 0; index < CountImmediateChildren(currentNode); index++)
  31:                {
  32:                    row.Enqueue(currentNode.childs[index]);
  33:                }
  34:            }
  35:            return default(NAryNode<T>);
  36:        }

Per eseguire l'inserimento ho usato una tecnica molto brute force che nn fa altro che reperire il primo nodo che ha ancora spazio libero tra i propri figli ed eseguire su di esso l' inserimento.... una tecnica più efficiente consiste nel tenere all'interno della classe NaryTree un riferimento all' ultimo nodo inserito in modo tale che ad ogni inserimento non venga fatta una scansione dell' intero albero per trovare il nodo su cui fare l'inserimento. Unica cosa degna di nota è l'ottimizzazione in termini di allocazione dello stack di sistema eseguita all'interno della funzione FindFirstFreeNode grazie all'uso di una coda dove per ogni livello vengono accodati i vari nodi. A questo punto allego la solution dove potete trovare l'intero codice comprensivo di test ed una piccola demo winform che utilizza la libreria GLEE. Se ritenete opportuno avere un'implementazione seria di albero nario lasciate un feedback che magari verrà presa in considerazione come feature da aggiungere all'interno di DSA

author: Luca Del Tongo | posted @ giovedì 26 giugno 2008 19.01 | Feedback (5)