Claudio Cherubino's blog Life of a Googler

5Nov/083

Vietato guardare i cartoni animati

Uno dei film più attesi del 2008 è stato sicuramente Wall-e e le critiche che ha ricevuto in tutto il mondo sono state assolutamente entusiaste, eppure nel nostro paese i risultati di pubblico non sono stati per niente al livello delle aspettative.

Fino a ieri mi chiedevo il perchè di questa differenza rispetto al resto del mondo, poi ho finalmente compreso la motivazione.

I miei programmi di ieri sera prevedevano proprio di andare a vedere il nuovo film della Pixar, peccato aver scoperto che nessun cinema della mia città (Catania) lo proponeva più in prima serata, e tutto ciò dopo poco più di una settimana dal debutto!

Come sempre in Italia vale l'equazione "cartone animato = prodotto per bambini" e quindi l'ultimo spettacolo utile era quello delle 18.30.

In compenso potevo godermi ben quattro spettacoli di quel capolavoro che è High School Musical 3, anche con inizio alle 22.45!

Senza pensare che fra poco al cinema non ci sarà altro che Massimo Boldi o Christian De Sica per sbancare il botteghino di Natale come ogni anno.

Come fare adesso a criticare quelli che Wall-e se lo scarichereranno illegalmente? :mrgreen:

16Jan/080

Sun compra MySQL!

E' stato appena annunciato l'accordo che permette a Sun Microsystems di acquistare MySQL per un miliardo di dollari.

Si tratta di una grossa sorpresa nel mondo dell'informatica perchè non era mai trapelato nulla al riguardo e anzi si parlava sempre più spesso di un prossimo sbarco in borsa da parte di MySQL.

Bisognerà capire adesso quali saranno i piani di Sun per l'azienda che ha appena acquisito.
Il mondo open-source si augura che sostanzialmente non cambi nulla e pare che la strada che verrà percorsa sarà proprio questa.

Di sicuro verrà prevista una migliore integrazione fra Java e MySQL, ma c'è da stare tranquilli dato che Sun ha una grossa esperienza in progetti open-source, a partire da Java stesso per arrivare a Solaris e StarOffice/OpenOffice.

Come la penso? MySQL sta andando fortissimo, speriamo che non ci siano stravolgimenti, per dirla come nel Gattopardo: "Tutto deve cambiare perché nulla cambi".

29Nov/070

Fixare i bug di PHP e MySQL

Nell'ultimo periodo ho dedicato buona parte del mio tempo libero allo studio di alcuni dei più importanti progetti open-source esistenti, tra cui PHP e MySQL, in modo da partecipare allo sviluppo.

Devo ammettere che giàla fase di build dei sorgenti ha richiesto del tempo per essere acquisita.
Ogni progetto prevede il proprio sistema di controllo della versione (CVS, SVN o Bitkeeper) e la sua procedura per la configurazione, compilazione e installazione.

Anzi, se pensate che possa interessare, magari potrei provare a scrivere una guida passo-passo per la compilazione di PHP o MySQL su Ubuntu 7.10, che è la piattaforma di sviluppo che ho adottato.

Una volta che si riesce a compilare il sorgente, il passo successivo è trovare un bug da studiare e tentare di fixare.

Niente di complicato, basta visitare il bug-tracker di PHP o MySQL e scegliere uno dei bug ancora aperti.

Identificato il bug si deve cercare di riprodurlo nella propria macchina.

Se il problema si verifica come descritto, allora si passa allo studio del codice per capire dove intervenire e in che modo.

Ovviamente conviene cominciare da qualche bug facile, in modo da cominciare a conoscere il codice, che in progetti come questi è sicuramente complesso.

Nel mio caso, ho scelto un bug di PHP e uno di MySQL, e sono riuscito a chiuderli entrambi.

Volete mettere la soddisfazione personale di vedere il proprio nome nel codice di PHP, come si vede in questo log?

revision 1.656
date: 2007/11/21 02:27:07; author: stas; state: Exp; lines: +2 -2
fix #42866, from Claudio Cherubino

Il bug in questione è il seguente, e riguardava il supporto per UNICODE nella futura release 6 di PHP:

http://bugs.php.net/bug.php?id=42866

Per quanto riguarda MySQL, invece, il bug riguardava la funzione LAST_DAY():

http://bugs.mysql.com/bug.php?id=32770

ed ecco qui la la descrizione della mia patch, compresa di codice e test case:

http://lists.mysql.com/internals/35187

Lo so che si tratta di piccole cose, ma è sempre un inizio, e anche se la comunitàopen-source non mi saràdebitrice a vita, sicuramente il mio orgoglio di informatico se la passa molto bene...

27Nov/070

I miei progetti

Quando per la prima volta mi è stato richiesto un portfolio da sviluppatore sono stato sicuramente preso alla sprovvista, ma non posso negare che la cosa mi ha fatto riflettere.

Se una persona è appassionata di informatica, molto probabilmente avràavuto a che fare con una serie più o meno lunga di progetti di vario genere.

Anche per me è così, e finalmente mi sono messo all'opera per cercare di razionalizzare ciò che ho fatto.

Ho appena pubblicato una nuova pagina su questo blog chiamata Projects, che è raggiungibile dal link in alto a destra, accanto al link che porta al mio profilo o al form per i contatti.

La pagina Projects è scritta in inglese, sia perchè i progetti sono internazionali, ma anche perchè ritengo che debbano essere accessibili a tutti (sono anche open-source).
Inoltre è sempre un modo per farsi un pò conoscere, giusto?

Per adesso la pagina non è assolutamente completa, ho messo solo due progetti ai quali ho partecipato, spero di trovare il tempo per aggiornarla con una certa frequenza.

Il problema è che in molti casi non è facile ritrovare documentazione sufficiente...

7Nov/076

Tag Cloud per WordPress 2.3

Quando è stata rilasciata la versione 2.3 di WordPress, una delle novità  più importanti (e pubblicizzata) era costituita dall'introduzione di una soluzione nativa per il tagging dei post, cioè di un sistema che permetta di etichettare gli articoli con delle keyword, esattamente come si fa con del.icio.us.

Da quando questi tag hanno preso piede, la forma migliore per rappresentarli è sempre stata una tag cloud, una nuvola i cui elementi sono tanto più grandi quanto il tag è presente all'interno del sito.

Usando WordPress aggiungere una tag cloud al proprio blog (come quella che trovate nella colonna di destra di questo sito) è veramente facile, basta sfruttare la funzione wp_tag_cloud, che accetta i seguenti parametri:

  • smallest - la dimensione del font da usare per i tag che hanno minore frequenza
  • largest - la dimensione del font da usare per i tag con maggiore frequenza
  • unit - l'unità  di misura delle dimensioni dei font. Si usi 'pt' per i punti
  • number - il numero massimo di tag da mostrare
  • format - formato della nuvola. Può essere 'flat' (di default) per separare i tag con spazi bianchi, 'list' per usare il tag UL all'interno di una class 'wp-tag-cloud' e 'array' per racchiudere i tag in un array
  • orderby - specifica il campo secondo cui ordinare i tag. Può assumere il valore 'name' o 'count'
  • order - ordine ascendente (ASC) o discendente (DESC)
  • exclude - lista separata da virgole di tag da escludere. Per default non si esclude alcun tag
  • include - lista separata da virgole di tag da includere. Per default si includono tutti i tag

Nel mio caso il codice usato per ottenere la tag cloud è:

wp_tag_cloud('smallest=8&largest=22&number=30');

Che ne pensate delle tag cloud? Le usate?

31Oct/076

Google mi ha assegnato PageRank 5!

Ultimamente nella blogosfera si parla molto del recente aggiornamento del PageRank di Google, quell'amato/odiato valore compreso fra 0 e 10 che viene usato dal motore di ricerca per classificare i siti.

Era passato molto tempo dall'ultimo aggiornamento del PageRank, tanto che questo sito non era mai stato ancora valutato dalla sua nascita, ed è anche per questo che mi sono fortemente stupito quando ho scoperto che mi era stato assegnato un rating di 5/10, che è ottimo, soprattutto per un blog come questo.

Comunque non è tutto rose e fiori, molti blogger (ad esempio Napolux) sono stati penalizzati per aver inserito nelle proprie pagine dei link a pagamento, e sempre più gente chiede di abolire il PageRank.

Speriamo non lo facciano presto, vorrei godermi ancora un pò questo risultato! :mrgreen:

10Sep/071

Aggiornamenti automatici per WordPress

Uno dei "problemi" che ho riscontrato usando WordPress è relativo agli aggiornamenti.

Una volta che sono stati installati numerosi plugin e che si è messo mano al codice o al template, aggiornare il software di questa piattaforma di blogging mette sempre un pò paura, e si è spinti a rischiare qualche eventuale problema solo quando la nuova versione introduce dei cambiamenti sostanziali, trascurando gli aggiornamenti minori.

Fortunatamente si tratta di un problema non solo mio, ed è adesso disponibile un tool per WordPress che si occupa di scaricare ed applicare tutti gli ultimi aggiornamenti, preoccupandosi anche di disattivare e riattivare tutti i plugin installati sul proprio sito.

Questo tool, in realtà  un plugin per WordPress, si chiama WordPress Automatic Upgrade, e può essere scaricato dal sito Techie Buzz.

Dopo averlo installato come un qualunque plugin, basterà  andare su Gestione-Automatic Upgrade e selezionare il tipo di aggiornamento, che può essere automatico o step-by-step.

A dire la verità , io ho provato inizialmente con quest'ultimo tipo ma pare che ci sia un errore nel codice, comprensibile visto che siamo solo alla versione 0.4.

Sono quindi passato all'aggiornamento automatico che è stato completato senza alcun problema ed ha anche rimesso in funzione tutti i plugin che avevo installato in precedenza.

D'ora in poi il mio blog sarà  sempre aggiornatissimo, ormai non ho più scuse!

29Aug/075

Il portfolio di uno sviluppatore

Se si vuole avere un'idea ben precisa delle capacità  di un grafico o di un web designer non c'è modo migliore che chiedergli di mostrarvi il suo portfolio.

Non esiste grafico che si rispetti che non abbia una lista di lavori effettuati e che rispecchiano pienamente le sue potenzialità  tecniche.

E se invece del grafico venisse chiesto il portfolio di uno sviluppatore?

Chi di noi sviluppatori non è orgoglioso di qualche programma, classe, libreria o funzione che ha realizzato in passato?

Però, se vi chiedessero di mostrare un portfolio, lo avreste pronto?

A me è capitato, e ho dovuto chiedere del tempo per mettere insieme alcuni pezzi di lavori fatti in precedenza, accorgendomi che molti di questi frammenti perdevano valore se estrapolati dal contesto.

A voi è mai capitato di trovarvi in questa situazione? Come vi siete comportati?

9Aug/0714

Certificazione MySQL 5.0 Developer

Un paio di ore fa ho concluso con successo il secondo esame per Certified MySQL 5.0 Developer e adesso anch'io posso fregiarmi di questo bellissimo logo:


MySQL 5.0 Certified Developer Logo

Rispetto agli esami per le certificazioni Microsoft è stato più complesso, e soprattutto non si trovano in giro i cosiddetti braindump, cioè le risposte alle domande dell'esame, cosa che garantisce sulla serietà  dello stesso.

Per ottenere la certificazione bisogna superare due esami, di 70 domande ciascuno, con una percentuale di risposte esatte superiore al 60%.
Per prepararsi esiste un ottimo testo, la MySQL Certification Study Guide, che copre i concetti dell'esame per Developer ma anche per DBA.

Se volete cimentarvi con questi esami, però, vi suggerisco di farlo solo dopo una lunga esperienza di uso pratico del database, perchè vi posso garantire che la sola guida non basta.

Adesso stiamo a vedere quanto viene richiesta questa certificazione, di sicuro non è diffusissima, in Italia siamo in 7 (me incluso) e nel mondo poco più di 250.

MySQL, per caso vuoi offrirmi un lavoro? :mrgreen:

16Jul/0713

10 trucchi per migliorare le performance di MySQL

Da qualche mese sto studiando per ottenere la certificazione Certified MySQL 5.0 Developer e dopo aver passato il primo dei due esami, mi sto ovviamente concentrando su alcuni aspetti più avanzati, ad esempio l'ottimizzazione delle query e del sistema.

Un paio di giorni fa ho trovato un articolo molto interessante sull'argomento, scritto da Jay Pipes, il Community Relations Manager di MySQL AB, sul suo blog, e ho pensato di tradurlo in italiano e pubblicarlo qui, ovviamente con la benedizione di Jay.

Si tratta di 10 domande frequenti relative all'ottimizzazione delle query, e in generale di un server MySQL, penso che una lettura possa risultare interessante a qualunque sviluppatore e amministratore che abbia a che fare con questo database:

  1. Quale di queste due query è più veloce?

    SELECT ... WHERE some_col IN (1,2,3) or
    SELECT ... WHERE some_col = 1 OR some_col = 2 OR some_col = 3

    Nessuna. L'ottimizzatore riscrive l'operatore IN() come una serie di condizioni OR, pertanto non ci saranno differenze nelle performance. Si usa IN() per rendere il codice più conciso e leggibile.

  2. Dove vengono memorizzati in cache i record delle tabelle MyISAM?

    Da nessun parte. MyISAM non mette in cache i record delle tabelle come fa InnoDB con il suo innodb_buffer_pool. Invece MyISAM si appoggia sul sistema di buffering del sistema operativo sottostante per bufferizzare i record delle tabelle mentre vengono letti dal file .MYD. Il key_buffer MyISAM memorizza solo i blocchi indice, non i record con i dati.

  3. Quale di queste due query è più veloce?

    SELECT ... FROM t1, t2 WHERE t1.id = t2.id
    SELECT ... FROM t1 INNER JOIN t2 ON t1.id = t2.id

    Nessuna. L'ottimizzatore riscrive la seconda query nella prima forma. Lo stile SQL che adottate, ovviamente, dipende esclusivamente da voi, tuttavia vi consiglio di usare il secondo stile (noto come sintassi ANSI) invece del primo (noto come sintassi Theta) per un paio di ragioni:

    * MySQL supporta esclusivamente inner e cross join con la sintassi Theta. Tuttavia, MySQL supporta anche INNER, CROSS, LEFT e RIGHT join se si usa la sintassi ANSI. Mescolare i due stili può portare a del codice SQL poco leggibile.
    * E' molto facile scordare una condizione di join usando lo stile Theta, specialmente quando si collegano molte tabelle insieme. Dimenticarsi per sbaglio una condizione di join nella clausola WHERE porterà  ad un prodotto cartesiano (e non è buono!). La sintassi ANSI è più esplicita ed è più difficile dimenticarsi di una condizione di join.

  4. InnoDB è più veloce/migliore di MyISAM?

    Dipende. Non piace a nessuno questa risposta, ma è assolutamente vera. Ci sono vantaggi e svantaggi in ogni storage engine storage engine. MyISAM ha delle ottime performance in lettura e nel caso di grossi carichi, e richiede poche risorse. InnoDB, invece, è preferibile nel caso di grossi UPDATE, quando si ha necessità  di avere transazioni, integrità  referenziale e ricerche veloci su singola chiave. Si deve scegliere l'engine in base alle esigenze della propria applicazione e non secondo dei dettami generali del tipo "usate solo l'engine XXX".

  5. CHAR è più veloce di VARCHAR?

    No, non proprio. Se ci sono differenze di performance, sono trascurabili. Usate CHAR se sapete che i vostri dati saranno formati da un determinato numero di caratteri (come un numero di previdenza sociale, ad esempio), altrimenti VARCHAR.

  6. VARCHAR(80) è più veloce di VARCHAR(255)?

    Si, ma probabilmente non nel modo in cui pensate. Per quanto ne so io, non c'è differenza (almeno nelle versioni più recenti di MySQL e InnoDB) nei tempi necessari per recuperare colonne VARCHAR di differente lunghezza dal disco o dalla memoria. C'è invece una grande differenza in uno dei seguenti scenari:

    * Viene creata implicitamente una tabella temporanea per gestire una clausola GROUP BY o ORDER BY ed è presente una colonna VARCHAR nell'istruzione SELECT
    * Viene creata esplicitamente una tabella temporanea che contiene una colonna VARCHAR

    In questi casi la lunghezza della colonna VARCHAR viene presa in considerazione. La motivazione? Le tabelle temporanee in memoria non sono altro che tabelle dello storage engine MEMORY che, per qualche ragione, tratta tutte le colonne VARCHAR(X) come CHAR(X).

    Ciò comporta che se definite due campi, uno come VARCHAR(255) ed un altro come VARCHAR(128), il secondo consumerà  la metà  dello spazio quando viene allocato in una tabella temporanea. Più record possono entrare all'interno di max_heap_table_size, e meno sono le probabilità  di richiedere swapping su disco (cercate SHOW STATUS LIKE 'Created_tmp_disk_';), portando a migliori performance generali.

  7. Ci sono cali di performance quando si effettuano join fra tabelle di storage engine differenti?

    No. Eseguire una SELECT su storage engine multipli va bene. Si hanno risultati impredicibili quando si mescolano engine transazionali e non-transazionali all'interno di una transazione che modifica i dati.

  8. Se cambio una tabella derivata in una vista, le performance migliorano?

    No. Una vista è semplicemente una tabella derivata (almeno quando viene creata usando l'algoritmo TEMPTABLE). Ciò implica che non ci sono differenze di performance fra una normale tabella derivata e una vista. La vista rende semplicemente il codice più leggibile e meno "componentizzato".

  9. Se vedo "Using temporary; Using filesort" nella colonna Extra dell'output di un comando EXPLAIN, vuol dire che è stata creata una tabella temporanea su disco?

    No. Una tabella su disco viene creata solo nelle situazioni seguenti:

    * Quando la dimensione della tabella temporanea creata implicitamente (da un GROUP BY o ORDER BY su una colonna non indicizzata) è maggiore sia di tmp_table_size che di max_heap_table_size
    * Quando ci sono campi di tipo BLOB o TEXT nell'espressione SELECT
    * Quando avviene una scansione completa della tabella che eccede il valore della variabile read_buffer_size (configurata per thread della connessione)

    Questi sono gli scenari (che ho in testa) che possono causare la creazione di tabelle temporanee su disco. Ce ne potrebbero essere altri. In ogni caso la tabella temporanea creata su disco sarà  una tabella MyISAM.

  10. E' possibile effettuare una FULL OUTER JOIN in MySQL?

    Si. Si usino sia LEFT che RIGHT JOIN nella stessa condizione di join della query, in questo modo:

    SELECT *
    FROM A LEFT JOIN B ON A.id = B.id
    UNION ALL
    SELECT *
    FROM A RIGHT JOIN B ON A.id = B.id
    WHERE A.id IS NULL