Nato di domenica…

Ho scoperto oggi un trick davvero interessante, che permette in php di creare delle variabili con nomi dinamici… :-O Cosa vorra mai dire tutto ciò? Semplice:
Se io voglio che una variabile prenda il nome del contenuto di un’altra variabile, posso farlo così:

$a="pippo";
${$a}="pluto";
echo $pippo;//a video verrà visualizzato: pluto

Mi sono trovato di fronte a questo problema, quando stamattina dovevo leggere dei records da un db, e creare delle variabili che si chiamassero come i campi del db.

Siccome sono pigro (e da qui il titolo di questo post, infatti mio papà dice che sono nato di domenica :-P), per semplificarmi la vita i campi letti dal db sono all’interno di un array associativo del tipo $array[0][‘campodb’] e scorro i risultati con un:

foreach(array_keys($array[0]) as $k){ ... }

Quindi sfruttando questa piccola scoperta in poche righe mi sono letto i valori dal db e creato le variabili contenenti i valori letti dal db.

Il codice finito risulta una cosa del tipo:

$q="SELECT campo1,campo2,...,campo20 FROM tabella WHERE condizioni";
$db->query($q); /**/
if($db->numRows>0){
   foreach(array_keys($db->rows[$i]) as $k){
      ${$k}=$db->rows[$i];
   }
}

Alla fine della fiera avrò una variabile per ogni campo presente nella SELECT con all’interno il valore letto dal db ($campo1, $campo2, … , $campo20).
In alternativa qui sotto ci sono alcuni esempi dell’utilizzo di questa features in php (direttamente da php.net)

define('ONE', 1);
function one() {
    return 1;
}
$one = 1;

${"foo$one"} = 'foo';
echo $foo1; // foo
${'foo' . ONE} = 'bar';
echo $foo1; // bar
${'foo' . one()} = 'baz';
echo $foo1; // baz

Sapevate già tutto? D’oh! Sono sempre l’ultimo a scoprire le cose interessanti! ;-(
[ad]

Istruzioni per l’uso…

Da alcuni giorni discuto con alcuni di voi (Denny e Axel), su come avvisarvi ogni volta che qualcuno posta un nuovo commento ad un mio articolo…

In particolare, come diceva Alex sarebbe comodo ricevere una mail per ogni commento su ogni post del blog. Questo avviene per i proprietari di un blog ma non per tutti gli altri. Dopo aver cercato varie soluzioni ho deciso di installare questo plugin Subscribe To Comments.

Sembra il meno “invasivo” di tutti e lascia alla volontà del lettore la decisione di ricevere una mail per ogni commento oppure no…

L’unica cosa da fare è spuntare la voce “Notificami via mail i prossimi commenti a questo post” al momento dell’inserimento del primo commento, e si riceveranno tutti gli aggiornamenti del post.

Spero sia la soluzione più giusta, ma se avete suggerimenti o idee come sempre sono le benvenute…

Tra l’altro ho anche aggiunto un plugin per Google Friend Connect, così potete usare il vostro account google per commentare :-)
[ad]

Non ci credi che lavoro a facebook? guarda qui! ora ci credi?

Un’azienda vincente si vede anche dalle piccole cose, e questa è una di quelle piccole cose che rendono grande una società…
Ovviamente sto di nuovo parlando di Facebook e questo video è davvero divertente a mio parere…
Pratica comune dei fratelli minori (anche se non ne ho uno, ma ho amici che lo sono) è quella di raccontare frottole ai loro amichetti per vantarsi… Bene cosa va dicendo il fratello di un certo “Dan Muriello”? “Mio fratello lavora a Facebook!”… nessuno gli crede, perciò decide di intervenire il fratellone, pubblicando questo simpatico video:

Che c’è di strano? Be’ in un’azienda di 900 persone, non vi pare anomalo che il CEO della società “perda” 1 minuto per uno stupido video?

Molto probabilmente è proprio questa propensione alla normalità dei suoi fondatori, che facebook è diventato quello che è oggi…
[ad#ad-1]

Indici Full Text in MySQL

Post da nerd, astenersi perditempo… :-P

[NERD MODE ON]

Alcuni giorni fa sul lavoro mi sono cimentato in un nuovo esperimento.

Tutto è partito dal problema di dover indicizzare dei contenuti, sui quali poi eseguira una ricerca “generica” in stile google (ovvero un unico campo che riceve un insieme di parole, che possono corrispondere a diversi campi del db).

Bene non voglio stare qui a spiegare nei dettagli la soluzione che abbiamo deciso di adottare, ma in sostanza mi sono ritrovato con un campo testuale con dentro tutte le parole che corrispondono ad una chiave.

Ok, e ora? L’idea iniziale è stata quella di eseguire una query con ” LIKE ‘%parola%’ ” in OR con altre LIKE simili, per ogni parola inserita dall’utente. Una volta implementata, tutto funzionava (avevo 3 record in quella tabella). Siccome per scrupolo avevo anche implementato un timer che misurasse il tempo di esecuzione, ho provato a fare un test pesante… Con python mi sono creato un programma per scrivere su file qualche centinaia di query di inserimento su quella tabella, lo eseguo e popolo il db. Ora ci sono 1000 record (non sono ancora abbastanza ma rende già l’idea), rilancio la ricerca e il timer segna 0,3 secondi. Buono no? sì ma sono 1000 record, se mai i record dovessero essere 100K o ancora di più? Mmm non mi soddisfa questa cosa. *Googleing*….*Googleing*….*Googleing* FULL TEXT INDEX

Cos’è? In MySQL è possibile definire su un campo di una tabella, un indice FULL TEXT, ovvero una struttura che indicizza in maniera ottimale tutte le parole presenti in uno o più campi. Ci sono alcune restrizioni però. Quella più importante è che la tabella non può essere creata con il motore InnoDB (il più comune perchè supporta query multiple in una singola transazione). Inoltre le stringhe da cercare con le query dovranno avere più di 3 caratteri (altrimenti bisogna andare a modificare le impostazioni di MySQL, cosa impossibile se non si ha accesso al server, e comunque relativamente complicata da fare).

Detto ciò i passi da fare sono i seguenti:
Definiamo la tabella e l’indice:

CREATE TABLE test (
id INT UNSIGNED   AUTO_INCREMENT NOT NULL PRIMARY KEY,
keywords TEXT,
[keywords2] VARCHAR(255),
FULLTEXT (keywords[,keywords2])
);

[Tra le parentesi quadre ho messo il secondo campo, spero si capisca che è opzionale…]

Fatto questo e dopo aver popolato la tabella, possiamo provare la nostra ricerca con la seguente query:

SELECT * FROM test WHERE MATCH(keywords) AGAINST('pippo')

In questo modo andremo a dire a MySQL di cercarci l’esatta parola ‘pippo’ all’interno del campo keywords.

Una cosa che non si trova facilmente nelle guide che ho seguito (ho fatto perciò riferimento alla documentazione ufficiale di MySQL) è che così facendo si effettua una ricerca in linguaggio naturale, che è ottimale per indicizzare frasi di senso (più o meno) compiuto. Il “difetto” se può definirsi così, è che con questo tipo di ricerca alcune parole non verranno trovate, infatti MySQL utilizza un array di stopwords che verranno saltate a piè pari dalla ricerca. Per effettuare una ricerca su tutte le parole e utilizzando operatori logici (ad esempio “+” significa OR mentre “-” esclude la parole che segue questo simbolo) bisogna effettuare una ricerca IN BOOLEAN MODE, più lenta, ma più efficace. La nostra query dovrà quindi essere modificata in:

SELECT * FROM test WHERE MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE)

In questo modo si effettua una ricerca all’interno del campo keywords, delle parole che contengono al loro interno “pippo” o “pluto”. Il carattere “*” funziona un po’ come il “%” nelle LIKE.

A questo punto manca un ultima chicca. La funzione MATCH (..) AGAINST(..) ritorna un valore che rappresenta la pertinenza delle parole cercate nel campo. Nel BOOLEAN MODE sarà il numero di parole trovate nel campo, mentre con la ricerca in linguaggio naturale ci sarà un algoritmo che calcola la pertinenza con delle regole strane ma che funzionano ;)

Quindi per sfruttare al massimo questo algoritmo bisognerà scrivere la query con:

SELECT *, MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE) as pertinenza FROM test WHERE MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE) ORDER BY pertinenza DESC

Così facendo ordiniamo i risultati dal più pertinente, a quello meno.

Risultato? sui miei 1000 records il tempo si è dimezzato, nel caso peggiore… Risultato accettabile no? :-)

Non vi resta che provare per credere, buon divertimento!

[NERD MODE OFF]
[ad#ad-1]

Scelta sull’acquisto del nuovo macbook pro = dubbio esistenziale

Come molti di voi ben sapranno, e se non si capisce ancora abbastanza dai miei post su questo blog, vorrei darvene la certezza, sono sempre più impaziente di avere tra le mani un bel portatile della mela… Volendo appunto un portatile (escludo quindi a priori i pur favolosi iMac) la scelta ricade sul Macbook Pro. Sinonimo di alte prestazioni rapportate ad alta mobilità. Che cosa voglio allora? All’apparenza la scelta è fatta… no? No.

Di Macbook Pro ce ne sono di 3 “categorie “(per come la vedo io): 13.3″, 15.4″ e 17”. Escludendo anche qui a priori il 17″ per motivi di portabilità (e di coerenza, così si può continuare a sfottere il Raus con il suo “portabile”) ne rimangono 2:

Il 13.3″ e il 15.4″. Ora viene il bello. Tra queste due “categorie” ci sono un’infinità di configurazioni possibili che mi intrippano assai, e ora ve le elenco con tutte le motivazioni per cui non riesco ad escludere un modello piuttosto che un altro.

  • A)13.3″:2,53GHz Core 2 Duo 3MB L2 Cache + 4GB DDR3 1066MHz SDRAM + 128GB SSD + 256MB di SDRAM DDR3 condivisa=  € 1.611,60 IVA incl.
  • B)15.4″:2,66GHz Core 2 Duo 3MB L2 Cache + 4GB DDR3 1066MHz SDRAM + 320GB SATA 7200rpm + 256MB di SDRAM DDR3 dedicata= € 1.696,80 IVA incl.
  • C)15.4″:2,53GHz Core 2 Duo 3MB L2 Cache + 4GB DDR3 1066MHz SDRAM + 128GB SSD + 256MB di SDRAM DDR3 condivisa= € 1.800,00 IVA incl.
  • D)15.4″:2,80GHz Core 2 Duo 6MB L2 Cache + 4GB DDR3 1066MHz SDRAM + 320GB SATA 7200rpm + 512MB di SDRAM DDR3 dedicata= € 1.890,00 IVA incl.
  • E)15.4″:2,66GHz Core 2 Duo 3MB L2 Cache + 4GB DDR3 1066MHz SDRAM + 128GB SSD + 256MB di SDRAM DDR3 dedicata= € 1.903,20 IVA incl.

Ora, fatte le dovute premesse… chi mi aiuta nella scelta? motivare le risposte (cacchio era da un po’ che non sentivo questa frase!)

Io vi dico la mia su tutti:

A) mi darebbe l’estrema mobilità a discapito di un po’ di prestazioni come CPU ma disco gagliardo e uno schermo ridotto (non ho l’abitudine di collegare monitor esterni)

B) è la mia idea originale, giusto compromesso tra prestazioni, prezzo, mobilità e non-peggioramento della mia cecità

C) manca solo la memoria dedicata alla scheda video, altrimenti col disco SSD sarebbe perfetto

D) CPU all’estrema potenza con 6mb di cache e scheda grafica suprema (ne avrei forse d’avanzo) [prezzo alto]

E) è la mia idea originale tamarrata, mancano solo i 6mb di cache e poi programmerebbe quasi da solo [prezzo estremo]

Help meeeeeeeeeeee please!

[ad#ad-1]

In arrivo novità da Apple? Sì iMac, Mac mini e Magic Mouse!

In arrivo nuovi prodotti da apple…
Si parla di nuovi iMac(probabilmente con processore più potente e blue ray drive), nuove time capsule, nuovi mac mini e molto altro ancora…
A breve altre news…

[UPDATE]

Dopo più di due ore di store off-line la Apple ha pubblicato gli aggiornamenti sui suoi nuovi prodotti… Aggiornata la linea degli iMac, in cui la news più importante è il nuovo formato (16:9) con modello entry level da 21.5″ e modello più caro da 27″. Aggiornato anche l’hardware reso più prestante e tecnologicamente avanzato.
Stessa cosa succede per i mac mini, di cui è stata creata una versione “server” dove sono presenti due dischi da 500gb ciascuno e con Mac OS X Server.
Un’ulteriore novità è stata portata negli accessori ed in particolare nella periferica di puntamento. Scompare il “Mighty Mouse” e arriva il “Magic Mouse”, completamente multitouch e con nuove “gesture” che riproducono quelle già introdotte dal multi touchpad presente nei mac book pro.
Interessanti novità insomma, tutte da provare. Bisognerà però attendere le prime recensioni per sapere i veri effetti di questi nuovi prodotti!

Prime considerazioni a caldo:

Ha ancora senso comprare un mac book pro da 13″? confrontate le specifiche e poi commentate per farmi sapere la vostra…
[ad#ad-1]

jQuery User Interface: interfacce utente in javascript!

Intanto benvenuti a tutti nel mio nuovo-vecchio blog. Ho solamente cambiato indirizzo, mantenendo tutto il vecchio blog e cambiando la veste grafica… Un piccolo aggiornamento contro la noia, insomma! ;-)

Detto ciò in per inaugurare davideferrero.com, voglio portarvi a conoscenza di un tool molto utile, se non lo conoscete ancora.

Come tutti ormai sapete (non lo sapete? sapevatelo :-P ) sono fan e infognato (leggi “addicted” che fa più figo) di jQuery, un javascript framework molto intuitivo, semplice e abbastanza leggero per animare e migliorare le proprio pagine web.

Bene, usando un po’ jQuery noterete subito di aver bisogno di interfacce grafiche per l’utente, ad esempio per una scelta di date (ne avevo già parlato qui) o per creare dei blocchi trascinabili (drag&drop), barre di caricamento, pulsanti “slider” o dei tabs… Ok, con jQuery UI tutto ciò è possibile, potete crearvi il vostro tema personalizzato scegliendo i colori e le caratteristiche dei vari oggetti e scaricarvi i file (javascript, css e immagini), personalizzandovi il pacchetto di download con solo gli oggetti di cui avete bisogno. Per tutte le personalizzazioni dei vari gadget, troverete un’ampia documentazione che vi aiuterà nel caso aveste problemi a farli funzionare.

Appena pubblicheremo il progetto a cui sto ancora lavorando in ufficio, potrete vedere all’opera alcune di queste UI… a presto per i prossimi aggiornamenti su questo argomento!

PS: aggiornate il feed rss facendolo puntare al nuovo indirizzo se non lo avete ancora fatto, ma soprattutto se vi eravate abbonati a quello vecchio… Se invece non lo avevate aggiunto tra i vostri preferiti, avete un motivo in più per farlo ora! ;-)
[ad#ad-1]

Facebook developer garage a Venezia!


Facebook ha da poco raggiunto i 300 Milioni di utenti e proprio oggi è stata resa nota la presentazione che il VP of Technology, Jeff Rothschild ha tenuto e in cui spiega la tecnologia che sta dietro al social network dai grandi numeri. Una delle cose che più mi mette in imbarazzo sono i dati forniti in questa presentazione: 25 Terabyte di log salvati da facebook ogni giorno, 1miliardo di messaggi di chat inviati ogni giorno, 200 miliardi di pagine viste al mese… Tutto ciò è permesso da un’infrastruttura (i software utilizzati li ho già discussi in questo post) che conta circa 30000 servers….. eeeeeeeh?? Ebbene sì 30mila servers e qui sotto potete notare una foto scattata in uno dei Fb data center…

Cioè…. ma avete idea di cosa vuol dire?

Tutto ciò per fare venire l’acquolina in bocca a chi leggerà questo articolo e far sapere che venerdì 23 ottobre a Venezia ci sarà il Facebook developer garage, un incontro dove verranno spiegate le caratteristiche principali del social network, le peculiarità delle sue API e come utilizzare queste ultime per integrarle nei propri siti web o creare fb application. Come ultimo appuntamento della giornata ci sarà l’intervento di un “facebook engineer” direttamente da Palo Alto (CA, U.S.A)
Buon divertimento! (se pensate di andarci!)
[ad]

La versione open source di Google App Engine? …esiste!

Tornado Web Server

Come qualcuno di voi sa, la mia tesi di laurea riguardava lo studio di Google App Engine e più in generale del Cloud Computing, un argomento che mi ha molto affascinato, e che di questi tempi è sempre più di attualità. Alcuni giorni fa, ho notato tra i vari post sulla mia bacheca di facebook, quello proveniente dalla pagina facebook.com/engineering di cui sono fan (accanito). Questo articolo riguardava la decisione di facebook di rendere open source un progetto molto interessante: Tornado web server. Cos’è Torndado? Semplice! Un web server che supporta un elevato numero di connessioni simultanee, con integrato al suo interno, un web-framework python, del tutto simile a webapp (il web-framework fornito di default con Google App Engine, versione per python). Tornado è stato creato dai fondatori di Friend Feed, e quando facebok ha acquisito questa società, ha pensato bene di arrichire la lista dei suoi progetti rilasciati con licenza open source. Bene, proprio da questa lista, sono venuto a conoscenza di altri progetti molto interessanti, tra cui Hive e Cassandra, ma soprattutto Hadoop, un insieme di software (anch’essi, tutti open source, in cui è compreso anche Hive) che permettono di realizzare un’infrastruttura di server altamente scalabile e distribuita. Da notare inoltre che Cassandra è la versione open source di Big Table, il database ad oggetti utilizzato da google per quasi tutti i suoi progetti più importanti (tra cui la ricerca), nato dalle menti di alcuni ingegneri impiegati presso Big G, e al quale avevo dedicato un capitolo della mia tesi (che potete trovare su sellbook).

Ok e con ciò? Tutto questo era per dire che se vogliamo replicarci un sistema in stile App Engine, ma sui nostri server, è una cosa possibile. Allo stesso modo è possibile utilizzare solo alcuni di questi software, ad esempio Hadoop con mysql e php, oppure Tornado con mysql, ecc ecc…(lascio a voi tutte le altre combinazioni).

Ho riempito questo articolo di link, mi rendo conto che sono un po’ troppi, ma così potete documentarvi a sufficienza su tutti questi progetti, che personalmente mi hanno intrigato parecchio! ;-)

Buon divertimento!
[ad]