Il software nel 2007: stato dell’arte e scenari futuri

 

Visto che il mio purgatorio (alias astinenza da internet) sembra dover durare ancora per tanto (Telecom se non esistessi vivremmo tutti meglio) ho realizzato nei piccoli ritagli di tempo, questo post, raccogliendo le solite impressioni e idee che mi sono venute in mente nell’ultimo periodo.

Da utilizzatore di software, ma anche da piccolo sviluppatore, ho maturato esperienza dopo esperienza diverse convinzioni informatiche; inevitabilmente molte di questa riguarda il lato software.

La prima cosa che mi fa pensare è come negli anni sia aumentato il divario di competenze tra chi il software lo sviluppa e chi ne è semplice utilizzatore; se da un lato può sembrare naturale che un semplice utilizzatore non conosca le problematiche con cui deve scontrarsi uno sviluppatore, tutto diventa meno naturale se pensiamo che molti utilizzatori commissionano dei software e dunque si trovano a far delle richieste ben precise e spesso irrealizzabili.

Pensando invece agli sviluppatori mi viene in mente come sia cambiato il modo di sviluppare e come sta cambiando ancora. Senza scomodare i tempi dell’assembler vorrei farvi notare come ieri lo sviluppatore prediligeva, per l’80% dei casi un linguaggio compilato, oggi la scelta è oltre che molto più ampia di un tempo, anche meno scontata.

Entrando più nel dettaglio, se ai tempi dell’assembler la riutilizzabilità del codice era quasi nulla, i tempi di sviluppo alti e la complessità di realizzazione e di manutenzione era alle stelle, la nascita della programmazione procedurale e in seguito quella ad oggetti, ha semplificato di tanto lo sviluppo. Oggi siamo in piena era framework, molti sviluppatori hanno rivisto il loro modo di sviluppare e ne sono entusiasti, altri come sempre accade quando ci si trova di fronte una novità, restano ancorati al modo di fare, alla via tradizionale, rimandando (a mio parere) ciò che finiranno per fare quando sarà oramai troppo tardi.

Notiamo poi che moltissimi framework sono realizzati per il Web, quelli che non lo sono si sono affrettati a fornire ai propri utilizzatori gli strumenti adatti per una perfetta integrazione. Ad oggi il Web diventa sempre più importante, ricordo che tempo fa mi meravigliò molto il vedere realizzati dei gestionali o delle interfacce utente per controllare l’hardware (sto pensando alle interfacce di gestione dei comuni AP o router o persino i driver per l’utilizzo del firewall integrato nVidia) con un linguaggio di scripting lato server (generalmente PHP), oggi mi meraviglia vedere ancora del software compilato (da questo discorso è escluso il sistema operativo, almeno per ora…).

Sembra dunque che le aziende siano orientate verso ciò che penso, ovvero la quasi completa realizzazione di prodotti software sul web (iniziai a parlarne tempo fa rispondendo quì). Come spesso accade i primi a percorrere questa strada sono stati quelli di Google (con gli oramai stranoti Spreadsheet & Doc) e di Zoho (vi consiglio di approfondire i sui strumenti, meritano sul serio tanto), poi potremmo metterci Yahoo (Flickr, Pipes) fino alla notizia di qualche settimana fa della in cui apprendiamo che prima Corel mette a disposizione sul web il suo editor di testo online, poi l’annuncio da parte di Adobe di una versione di Photoshop anche questa online.

Magari mi sbaglio ma non penso sia un caso che due grosse aziende inizino la sperimentazione di un proprio prodotto online, nel caso di Adobe poi è uno dei prodotti di punta della casa.

Io sono sempre più convinto che questa sarà la strada da seguire, nel mio piccolo cerco di essere sempre più sensibile ai cambiamenti inerenti lo sviluppo web, per me innovare e rinnovarsi restano sempre dei cardini, se potessi investirei in questa direzione; non nascondo però la curiosità su come si evolverà il mondo dell’hardware proprio in funzione di queste nostre nuove esigenze.

Vista ci ha ricordato un concetto (conseguenza) che chi conosce la legge di Moore ricorda bene, per giustificare gli straordinari progressi dell’hardware si ottimizza sempre meno il software, ma con una probabile decentralizzazione del software, come giustificherebbero una nuova CPU il 35/40 % migliore della precedente ogni 6 mesi? Se il sistema operativo tra qualche anno avrà ancora la “forma attuale”, il vero e forse unico applicativo di cui avremo bisogno sarà il browser, anche se dovesse essere scritto male non giustifica l’hardware di un comune pc già oggi.

E ancora, il divario digitale tra i vari paesi sarà più marcato o si ridurrà? Avremo sempre più bisogno di linee affidabili e veloci, noi abbiamo grossi problemi da questo punto di vista, ricordo a tutti che in tante piccole città e paesi non vi è ancora l’ADSL, tutto ciò stimolerà gli operatori o come temo avremo i soliti pessimi servizi a prezzi alti?

Gli interrogativi sono tanti non resta che attendere e sperare in una rivoluzione positiva per noi utenti.

Annunci

Ruby: infarinatura generale sugli oggetti

Chi si avvicina per la prima volta a Ruby noterà sicuramente che tutto è un oggetto, non resta dunque che approfondire come avviene il loro utilizzo in Ruby; ricordo inoltre che la seguente non vuole essere una guida ma è solo una sintesi di un mio studio fatto per iniziare a sviluppare con Ruby on Rails.

I Metodi

Possiamo definire in maniera abbastanza semplificata un metodo come un operazione che ci è permesso di far svolgere ad un oggetto. L’utilizzo dei metodi avviene con la sintassi

oggetto.metodo

oppure se il metodo lo richiede si possono passare anche i parametri con la sintassi

oggetto.metodo(param1, param2,…)

oggetto metodo param1, param2 … …

in Ruby anche scritture come la seguente sono permesse

“cde”.length

cde è comunque trattato come un oggetto e possiede il metodo length, il risultato sarà

ruby> “cde”.length

6

Creare un oggetto

La creazione di un oggetto avviene mediante la realizzazione di una classe, la sintassi è la seguente

class nome_classe

def nome_metodo

end

….

….

end

per utilizzare la classe si utilizza la sintasse classica

nome_ogg = nome_classe.new

per utilizzare i metodi della classe come scritto prima

nome_ogg.nome_metodo

Ereditarietà

Capita spesso di dover creare una classe che si differenzia da una esistente per pochi metodi, ci è quindi comodo far ereditare da una classe i metodi esistenti così da poterli integrare con ciò che ci serve senza doverli riscrivere, in Ruby ciò avviene nel seguente modo

class nome_classe < classe_da_ereditare

def metodo1

end

end

l’istanza della classe nome_classe erediterà anche i metodi di classe_da_ereditare. Potremmo però non voler ereditare completamente i metodi di una classe ma solo in parte dovremo operare nel seguente modo

class uno

def metodo1

….

end

def metodo2

….

end

end

class due < uno

def tre

end

def due

fail

end

end

in questo modo non erediterà il metodo due.

ActiveRecord: un modo nuovo di gestire i database

Quando si sviluppa una qualche applicazione che fa uso dei database capita spessissimo di dover scrivere codice che è concettualmente lo stesso per diverse volte, basti pensare alle classiche operazioni di inserimento o di lettura dati , le query sono sempre le stesse, ciò che cambia è generalmente il contenuto.

Per semplificare e od ottimizzare questa situazione può esserci di aiuto il pattern ActiveRecord, in esso la riga di una tabella o di una vista contenuti in un database rappresenta un oggetto, sull’oggetto (dunque sulla riga) sono possibili le classiche operazioni di lettura, scrittura, cancellazione ed aggiornamento del dato. L’applicazione di queste operazioni sono rese possibili da una classe astratta di operazioni base che gestiscono l’accesso al database ereditata da ogni oggetto.

Questo pattern è utilizzato da molti framework ed è ciò che contribuisce a rendere la scrittura del codice mediante gli stessi più veloce, vi invito a guardare gli screencast di RubyOnRails per rendervi conto dell’utilità di questa soluzione.

Pattern MVC: un modo nuovo di sviluppare

Nel mio personalissimo percorso di avvicinamento all’utilizzo dei framework ho incontrato come prima fermata la metodologia di sviluppo MVC, ecco quindi un sunto del mio approfondimento.

MVC è l’acronimo di Model – View – Controller ed indica una metodologia di sviluppo ad oggetti nella realizzazione di software. Questa metodologia di sviluppo è stata introdotta neglòi anni 70 quando allo Xerox PARC fu realizzato il linguaggio di programmazione orientato agli oggetti Smalltalk è però diventato famoso grazie J2EE.

Utilizzando questa metodologia abbiamo un buon livello di separazione tra il codice che si occupa della gestione dei dati, da quello che presenta gli stessi all’utente permettendo inoltre di ridurre la scrittura del codice più utilizzato. Un’applicazione realizzata secondo questo pattern viene così divisa concettualmente in 3 parti: i Model, le View e i Controller:

  • i Model contengono le operazioni che possono essere eseguite sui dati
  • le View sono le GUI da mostrare agli utenti con cui gli stessi interagiscono
  • i Controller trasformano le interazioni tra l’utente che avvengono attraverso le View in operazioni eseguite dai Model

prendo in prestito da wikipedia lo schema:

oggi praticamente tutti i framework utilizzano questo design pattern per lo sviluppo, per utilizzarli bisogna quindi imparare a sviluppare in questo modo.

Ruby on Rails, Django, Symphony,Zend: perchè dovrei fare uso dei framework?

In ambito informatico per framework intendiamo un’insieme di classi e funzioni organizzate in maniera tale da ridurre la scrittura del codice (cercando quindi di riutilizzare il più possibile il codice) sulle quali poter basare il nostro software. La loro funzione è quindi quella di velocizzare lo sviluppo ma anche renderlo meno complesso.

Questo è ciò che in maniera teorica rappresenta un framework, come sempre bisogna valutare i pro e i contro di ogni cosa, io in questo momento ho solo alcune riflessioni da sviluppatore che non ha ancora fatto uso di questi framework e sta valutando se e quale provare; troverete quindi diversi dubbi, domande e quant’altro mi viene in mente.

La prima considerazione che faccio è sui tempi di apprendimento, se uno sviluppatore è abituato a sviluppare con un linguaggio il tempo necessario per l’apprendimento sarà si dipendente dallo sviluppatore ma anche dalla bontà del framework. La cosa più logica da pensare dovrebbe essere quella di utilizzare un framawork basato sul linguaggio che si è soliti usare, così chi conosce il php potrebbe usare Zend o Symphony che sono basati su PHP5 oppure Django basato su Python e tanti altri. In questo modo i tempi di apprendimento dovrebbero ridursi, resta da valutare se il framework mette a disposizione ciò che cerchiamo, altrimenti le strade da intraprendere sarebbero due, arricchire il framework con le proprie librerie (a quel punto non so quanto sia utile utilizzarlo) oppure cambiare linguaggio (quì il tempo di apprendimento potrebbe aumentare parecchio quindi difficilmente lo si fa).

La seconda considerazione riguarda la qualità del prodotto, se progetto e realizzo un sistema da zero ho il controllo su tutto proprio perchè l’ho realizzato io, secondo una mia logica (giusta o sbagliata che sia) seconod il mio modo di sviluppare. A molti sarà capitato nell’utilizzare anche solo una funzione realizzata da terzi di non essere convinti fino in fondo, cè sempre quel filo di diffidenza o magari anche presunzione che ci porta a pensare a quella parte del progeto come al punto debole dell’intero sistema, io personalmente se devo usare del codice non realizzato da me cerco il più possibile di capire le operazioni che fa (non scandalizzatevi e non date per scontato questa cosa se si utilizza il codice degli altri è per ridurre i tempi quindi può anche capitare di non badare tanto al contenuto) e chi è l’autore (la fiducia scaturita dal rapporto professionale ha per me un grosso valore).

L’altra riflessione è sulle prestazioni e la pulizia del sistema; abbiamo detto che i framework sono un insieme di librerie (classi, funzioni ecc) ed il loro utilizzo ci vincola ad installarle tutte sulla macchina che deve ospitare il sistema, questo può essere considerato poco pulito?O comunque coerente perchè se non si utilizza una libreria non la si carica in memoria (o almeno è ciò che ci auguriamo)?

L’ultima cosa che mi domando riguarda i servizi di hosting, se si deve realizzare un sistema raggiungibile in internet, generalmente si compra il servizio di hosting, da una ricerca poco approfondita non ho notato nel listino dei venditori più comuni la possibilità di aggiunta di framework.

Come sempre tempo permettendo proverò ad approfondire ogni riflessione, se ciò che si dice di buono sui framework risulterà vero o quantomeno utilizzabile per i miei scopi avrò in bel incremento della produttività personale.

Riporto di seguito il nome dei framework attualmente più utilizzati per la realizzazione di applicazioni web based:

Questo framework è basato sul linguaggio Ruby(Wikipedia link) modellato sull’architettura di sviluppo MVC

Framework basatosu PHP, recentemente Yahoo ha annunciato di averlo utilizzato per la realizzazione di Yahoo Bookmarks

Basato su PHP 5 è tra i framawork php più utilizzati in assoluto, di recente nell’ultima Zend Conference Google ha rilasciato un nuovo set di API per l’integrazione con i servizi Google Base, Calendar, Blogger e CodeSearch.

Basato su PHP è modellato sull’architettura di sviluppo MVC.

Questo framework è basato su Python ed è modellato sull’architettura di sviluppo MVC.

Fonetica nel pattern matching con php #2: ridondanza e distanza di Levenshtein

Tempo fa vi ho parlato delle funzioni soundex e metaphone per utilzzare una verifica vocale nel matching tra stringhe di testo. Personalmente dopo alcuni test avevo riscontrato una buona affidabilità di soundex, sono però poi stato smentito, mi è capitato il caso:

via ennio quirino visconti

via m. carucci

soundex mi forniva lo stesso hash mentre sono palesemente differenti, come fare dunque? Dopo alcune prove in cui provavo a capire cosa potesse influenzare il calcolo di soundex ho deciso di provare metaphone.

Metaphone produce un hash variabile (prima differenza con soundex) generato conoscendo le regole di pronuncia della lingua inglese inglese (seconda differenza); le parole utilizzate non sono solo inglesi quindi l’hash potrebbe essere non completamente corretto anche perchè la lingua inglese ha molti termini con una pronuncia simile se non uguale però se serve un hash che non varia per cambiamenti minimi della parola, potrete come sto provando io, provare a concatenare gli effetti di soundex e metaphone per avere un unico hash sicuramente più affidabile del solo soundex.

Per controlli più accurati si può utilizzare la distanza di Levenshtein ovvero il numero minimo (distanza di caratteri) di operazioni (rimozione, aggiunta, spostamento ed eliminazione) che servono per uguagliare due stringhe. In PHP vi è l’omonima funzione:

int levenshtein ( string str1, string str2 [, int cost_ins [, int cost_rep, int cost_del]] )

questa funzione è molto utile e versatile, penso che con un controllo incrociato tra gli hash prodotti dalle funzioni soundex-metaphone e dalla distanza di Levenshtein si può ottenere un buon risultato.

Elaborazione digitale delle immagini: l’istogramma

L’istogramma di un immagine è una stima a posteriori del numero di pixel avente stesso livello di grigio nel caso di un immagine monocromatica e più in generale avente lo stesso valore. Esso risulta molto comodo per diversi scopi dato che fornisce un rappresentazione alternativa e globale dell’immagine, risulta ad esempio utile per comprendere quale algoritmo applicare per il miglioramento di un immagine, per esempio un istogramma di questo tipo

ist.jpg

mostra un gran numero di pixel concentrati nei livelli bassi, l’immagine risulterà molto scura, al contrarioun istogramma di questo tipo

ist2.jpg

indicherà un immagine bilanciata su più livelli.

Possiamo calcolare l’istogramma mediante matlab in due modi, uno seguendo la definizione data all’inizio di questo articolo, uno utilizzando una funzione che matlab ci mette a disposizione. Utilizzando la definizione non dobbiamo far altro che leggere l’immagine e controllare valore per valore assunto dal pixel presente nell’immagine, raggrupparli per valori e tenere il conto, poi non resta che stampare il grafico utilizzando le barre:

%leggo l’immagine
f=imread(‘img.jpg’);
%ottengo le dimensioni e il numero di colori
[m,n,col]=size(f);
%se è monocromatica
if col==1
vet=0;
%analizzo ogni pixel
for i=0:1:255
%cerco nell’immagine altri pixel con lo stesso valore
flag=find(f==i);
%ottengo il numero dei pixel trovati
n=length(flag);
%catalogo il numero
vet(i+1)=num;
end;
%visualizzo l’immagine originale
imshow(f);
%visualizzo l’istogramma mediante le barre
figure, bar(vet);
end

il secondo metodo è quello che prevede l’utilizzo della funzione imhist ben documentata quì.