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.

Soundex, Metaphone: come funzionano

Ho più volte parlato di queste due funzioni, oramai sappiamo che sono dei codifici fonetici che permettono di indicizzare le stringhe in base alloro suono. Un pò per curiosità, un pò perchè voglio avere sempre tutto sotto controllo mi sono chiesto come realizzano l’hash sonoro di una stringa, anche per capire se e come sono vincolati da una lingua, così dopo un pò di ricerche in rete ho capito le cose che vado a scrivere di seguito.

Iniziamo con il soundex, sappiamo che produce un codice formato da una lettere (la prima della paroloa) e da 3 cifre, ogni cifra rappresenta uno dei sei codici consonantici. La procedura per ottenere il soundex è la seguente:

  • prendiamo la prima lettera, essa come detto rappresenta la prima posizione del soundex
  • quando incontriamo uno dei seguenti caratteri los ostituiamo con il rispettivo valore

B, F, P, V => 1

C, G, J, K, Q, S, X, Z => 2

D, T => 3

L => 4

M, N => 5

R => 6

  • Eliminiamo le lettere adiacenti con lo stesso codice
  • Eliminiamo le lettere A, E, I, O, U, Y, W e H se non sono iniziali
  • Prendiamo i primi 3 numeri ottenuti riempendo eventualmente le posizioni rimanenti con degli zeri

i pro dell’utilizzo del soundex li ho già evidenziati negli altri post, vorreim sottolineare i contro. Il primo inconveniente è che il soundex è stato sviluppato per la lingua inglese (in particolare il contesto è quello statunitense), nella quale il rapporto di corrispondenza tra i suoni ed i simboli scritti è piutosto libero e la fonetica ricopre un ruolo molto importante (lo vedremo con il metaphone). Possiamo però dire che per sua natura o meglio, per la procedura che utilizzare per ottenere l’hash è l’agoritmo che meglio si presta nell’utilizzo con le lingue latine. Il secondo inconveniente è rappresentato dal rapporto stringa estesa caratteri del sounex, ipotizziamo di trattare un indirizzo, per sua natura sarà sicuramente composto da un prefisso (via, viale, piazza ecc), dal nome della via e spesso dal civico (ipotizziamo di non voler separare quest’ultimo dalla stringa). Se decidiamo di non dare peso al prefisso perchè il contenuto informativo più importante è rappresentato dal nome, potremmo trovarci in un caso del tipo

via alessandro volta 3

via volta 3

nel primo caso la parola alesandro ci permette di ottenere un soundex e di conseguenza di non avere traccia della parola volta nello stesso. Nel secondo caso il soundex si forma proprio sulla parola volta, in questo modo il match non avverrà e non potrebbe avvenire neanche utilizzando il metaphone.

Con il metaphone abbiamo 16 suoni consonantici:

B, X (rappresenta il suono Sh), S, K, J, T, F, H, L, M, N, P, R, 0 (inteso come zero e rappresenta il suono Th), W, Y

e segue le seguenti regole:

  • Eliminiamo le doppie cancellando una delle due lettere in tutti i casi tranne che con la C
  • Eliminiamo la prima lettere delle parole che iniziano per KN, GN, PN, AE e WR
  • Eliminiamo la B alla fine della parola dopo la M.
  • Cambiamo le lettere C => X in CIA o CH; C => S in CI, CE o CY; C => K neglia ltri casi
  • Cambiamo le lettere D => J in DGE, DGY o DGI; D => T negli altri casi
  • Eliminiamo la G in GH e se non si trova alla fine della parola o prima di una vocale in GN o GNED; G => J prima di I o E o Y se non doppia GG; G → K negli altri casi
  • Eliminiamo H dopo una vocale e se non seguita da una vocale
  • Eliminiamo K dopo C
  • Cambiamo:

P => F in PH

Q => K.

S => X in SH o SIO o SIA

T => X in TIA o TIO; T => 0 in TH; T viene eliminata in TCH

V => F

  • Se la parola comincia con WH eliminiamo H; eliminiamo W se non èseguita da una vocale
  • Se la parola comincia con X, X => S; X => KS negli altri casi
  • Eliminiamo Y se non è seguita da una vocale
  • Z => S
  • Le vocali restano solo quando si trovano nella prima posizione

come possiamo notare è estremamente legato alla fonetica della lingua inglese e ciò rende meno duttile. Risulta inoltre sensibile al problema evidenziato per il soundex (“eccesso” di caratteri…) nel suo caso a causa del numero variabile di caratteri che formano l’hash.

Linux Different #5: GoboLinux

Tempo fa quando diedi inizio ai post della serie Linux Different parlai della necessità (è un mio personalissimo parere naturalmente) di rivedere il file system adottato dalle distribuzioni GNU/Linux (LFHS).

I motivi sono diversi, penso che l’organizzazione attuale è efficiente e fa benisssimo il suo lavoro ma necessiti di una semplificazione, se poi aggiungiamo una gestione della applicazioni alla klik penso che il quadro sarebbe completo.

Tralasciando le considerazioni personali vorrei parlavi di Gobolinux

prendo dalla sua home page la definizione:

GoboLinux is an alternative Linux distribution which redefines the entire filesystem hierarchy.
In GoboLinux you don’t need a package manager because the filesystem is the package manager: each program resides in its own directory, such as /Programs/Xorg/7.1/ and /Programs/KDE-Libs/3.5.3. Like it?

Gobolinux è una distribuzione GNU/Linux creata from scratch (non si basa quindi su nessuna distribuzione esistente) e presenta un file system di questo tipo

/

Programs

Users

System

Files

Mount

Depot

in Programs troviamo tutti i programmi installati nel sistema organizzati in cartelle (ogni programma una cartella) a loro volta divise in sottocartelle con un organizzazione per versione, ad esempio:

/Programs/Firefox]

2.0

1.5

così facendo è possibile avere due versioni dello stesso applicativo nella stessa installazione, procediamo e troviamo Users dove sono rpesenti tutti gli utenti del sistema, in System i file di sistema, in Files troviamo quei file(s) di sistema che non sono di fondamentale utilizzo come plug-in font aggiuntivi ecc.. in Mount troviamo come di consueto le directory per il mounting dei dispositivi e per concludere in Depot i file degli utenti.

Questo modo di organizzare i file è reso possibile da una serie di link simbolici, l’ideatore della distribuzione ha realizzatom un modulo del kernel per rendere invisibile tale serie di link durante l’utilizzo del file system ma allo stesso tempo rende la distribuzione compatibile con il mondo *nix.

Per l’installazione dei pacchetti Gobolinux utilizza l’InstallPackage script che si occupa di decomprimere i pacchetti in /Programs e di creare i symlinks opportuni in /Systems/Links e /Systems/Settings, la gestione delle dipendenze si realizza attraverso lo script Dependencies che scannerizza tutti i programmi e verifica la dipendenza tra i programmi attraverso link dinamici.

Soffermiamoci ora un pò sulla rimozione dei programmi, essa potrebbe avvenire attraverso il classico rm -rf è però sconsigliato e potrebbe anche non funzionare a causa dell’organizzaizone dei link. Gli sviluppatori di Gobolinux hanno realizzato lo script DisableProgram ed il particolare SymlinkProgram che permette tra le altre cose di ripristinare un programma rimosso. Sempre a proposito del symlink vi è l’opportunità di rimuovere i broken link attraverso RemoveBroken. Per approfondire la questione packages potete consulatere il wiki.

Siamo alla fine di questo breve tour su Gobolinux io personalmente sono contento di questo progetto, magari per qualcuno sembrerà una bestemmia ma questa è la strada che vorrei intraprendessero tutte le distribuzioni, quantomeno il settore desktop.

Alla prossima

Sviluppatori Mac unitevi!

Sperando di poter cambiare presto l’unitevi del titolo in uniamoci vorrei segnalare l’ottima idea di malcom di creare un gruppo di discussione utilizzando google groups con l’intento di riunire gli sviluppatori nostrani e quelli che vorrebbero diventarlo.

Potete seguirlo ed iscrivervi qui il gruppo si chiama Italian Mac [Dev]

P.S: pur non potendomi considerare uno sviluppatore Mac mi sono iscritto al gruppo, lo seguirò per aggiungere questo tassello al mio curriculum, ci sarà tanto da imparare li troverò sicuramente ciò di cui ho bisogno.

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.