Claudio Cherubino's blog Life of a Googler

8Sep/080

Songbird, il media player di Mozilla

Chi contribuisce ad un progetto open-source non lo fa, almeno nelle intenzioni iniziali, per ricavarne dei soldi, ma al massimo notorietà o qualche contatto che potrà risultare utile un giorno.

Di sicuro si tratta di un ottimo modo per imparare cose nuove e sperimentare le ultime tecnologie, ed è con questo spirito che personalmente ho dato il mio apporto a MySQL, PHP, WordPress e, più recentemente, Songbird.

Probabilmente conoscerete tutti i primi tre, ma è proprio dell'ultimo che vorrei parlarvi in questa occasione.

Songbird è un media player open-source basato sulla piattaforma XULRunner di Mozilla, in pratica la stessa tecnologia alla base dei ben più noti Firefox e Thunderbird.

Lo sviluppo è arrivato attualmente alla release 0.8pre ma le caratteristiche sono già confrontabili con quelle di iTunes e comprendono anche il supporto per le estensioni (stile Firefox) e i temi, qui chiamati "feathers".

All'interno del sito ufficiale (http://getsongbird.com/) esiste uno sezione dedicata a chi vuole contribuire (http://getsongbird.com/contribute/) che descrive tutte i modi che esistono per supportare il progetto.

Ovviamente il primo tra essi consiste nello scrivere del codice, ma è anche possibile fare la propria parte semplicemente facendo conoscere Songbird o segnalando i bug che si incontrano.

A proposito di ciò, Pioneers Of The Inevitable (l'azienda che sta dietro Songbird) ha costituito il gruppo sb_core, costituito da quegli sviluppatori che si occupano di fixare i bug dell'applicazione.

In cambio, ogni sviluppatore riceve una serie di quei gadget che rendono felice la vita di noi geek.

Io faccio parte di questo gruppo avendo chiuso il mio primo bug una decina di giorni fa e proprio oggi ho trovato nella cassetta delle lettere una busta contenente una maglietta e tonnellate di stickers, spille e cartoline.

Ho fatto una foto a questo ben di dio, chissà che non invogli anche voi a contribuire:

I gadget di Songbird

I gadget di Songbird

All'inizio potrà sembrare molto difficile, ma pian piano si scoprono tanti piccoli trucchetti e soprattutto si comincia a padroneggiare una piattaforma complessa come quella di Mozilla.

Se volete una mano chiedete pure, ma vi consiglio di scoprire da soli la soddisfazione di vedere il proprio codice all'interno di un progetto così vasto e importante...

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...

27Nov/070

Projects

This page aims to be a central point to group all the projects I'm currently involved or I participated in the past.

I started writing this page because I found out that even if I participated in many projects, I don't have a unique point of access to them.

For each one of them I'll publish links to documentation, source code, links and everything else I can collect on it.

The following list is not complete, I'll try to complete it soon, but for now please accept my apologies.

  1. Project Voldemort Ruby client library
  2. Contributions to open-source projects (PHP, MySQL, WordPress, Songbird)
  3. lib_mysqludf_str - A library of MySQL UDFs for working with strings
  4. AMGA PHP API
  5. Google Gadgets
  6. WordPress Plugins
  7. FSharp.it
  8. Articles and books


Project Voldemort Ruby client library

A pure-Ruby client library for Project Voldemort, a distributed key-value storage system based on Amazon Dynamo.
The library uses ruby_protobuf, the Ruby version of Google Protocol Buffers, as a base for the communication protocol.
For further information please visit the project page on Google Code repository:

http://code.google.com/p/voldemort-ruby-client/


Contributions to open-source projects

This list shows some of the patches and code contributions to open-source projects such as MySQL, PHP, WordPress or Songbird:


lib_mysqludf_str

MySQL UDFs offer a powerful way to extend the functionality of your MySQL database.
lib_mysqludf_str aims to offer a library of string functions which can complement the native one, in order to ease the development of MySQL-based applications.
For further information please visit the dedicated page on The MySQL UDF Repository:

http://www.mysqludf.com/lib_mysqludf_str/index.php


AMGA PHP API

AMGA is the gLite Metadata Catalogue, designed to meet the requirements of the EGEE grid-computing applications. Its implementation uses streaming to communicate between client and server which shows a very promising performance.

Initially, access to AMGA was only possible using C/C++, Java or Python, and this library allows the developers to connect to an AMGA metadata server using PHP.

For further information please visit the AMGA website:

http://amga.web.cern.ch/amga/

The PHP API documentation can be found at:

http://amga.web.cern.ch/amga/php/index.html


Google Gadgets

My experiments with the Google Gadgets API:


WordPress Plugins

My open-source extensions to WordPress:


FSharp.it

A blog devoted to functional programming and F#, Microsoft functional programming language based on the .Net framework.

This blog can be found at fsharp.it and despite the domain extension it is entirely written in English.


Articles and books

My adventures in the technical publishing world:



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