tag:blogger.com,1999:blog-30198165797313256822024-03-13T19:30:11.471+01:00L'incantatore di datiTalvolta i dati sembrano avere una vita propria e non si comportano come vorremmo.
In questi casi, occorre una mano ferma per addomesticarli.Giuseppe Maxiahttp://www.blogger.com/profile/15801583338057324813noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-3019816579731325682.post-62834182034938685152009-10-14T17:53:00.008+02:002010-05-06T11:42:15.320+02:00ECDL e software libero: Caccia all'errore<a href="http://www.flickr.com/photos/datacharmer/4011827854/sizes/o/" title="ecdl by datacharmer, on Flickr"><img src="http://farm3.static.flickr.com/2670/4011827854_526f5bc429_o.jpg" width="400" alt="ecdl" /></a><br />Queste sono due pagine dell'<a href="http://www.gorilla.it/libri/ecdl-syllabus-per-windows-vista/9788838664120">ECDL Syllabus 5.0, edito da McGraw Hill</a>. (click sulla foto per la versione ingrandita)<br />A leggere queste pagine, mi ha colpito il numero di castronerie scritte in merito al software libero.<br />Per cominciare, questa perla:<br /><blockquote><i>shareware, ovvero programmi che vengono scambiati in cambio di programmi dello stesso tipo.</i></blockquote><br />Chi ha scritto questa idiozia è un ignorante così pigro da non curarsi di cercare con google o wikipedia i termini di cui dimostra totale incompetenza.<br />Già questo svarione basterebbe per squalificare il libro (e l'esame stesso, che non è altro che un corso di utenza bovina asservita a prodotti Microsoft), ce ne sono molti altri. Ma non voglio togliere ai lettori il piacere della scoperta, e quindi invito tutti a porre commenti con gli errori rilevati in queste pagine.Giuseppe Maxiahttp://www.blogger.com/profile/15801583338057324813noreply@blogger.com0tag:blogger.com,1999:blog-3019816579731325682.post-37622992924653322352009-01-13T22:22:00.002+01:002009-01-13T22:34:42.939+01:00Il progetto Drizzle cerca programmatoriIl progetto <a href="http://launchpad.net/drizzle">Drizzle</a>, derivato da MySQL con l'ambizione di sviluppare un database adatto per il cloud computing, <a href="http://www.sun.com/corp_emp/search.cgi?keyword=561920&jpp=50">cerca sviluppatori</a>.<br />I candidati devono avere una certa esperienza, e preferibilmente devono essere già inseriti nel progetto come collaboratori esterni. In pratica, il progetto denderà a favorire coloro che hanno già collaborato su base volontaria.<br />Per saperne di più sui criteri di selezione, potete vedere le <a href="http://krow.livejournal.com/630177.html">aspettative di Brian Aker</a> l'ideatore del progetto.Giuseppe Maxiahttp://www.blogger.com/profile/15801583338057324813noreply@blogger.com0tag:blogger.com,1999:blog-3019816579731325682.post-75235501395026813692008-12-09T21:00:00.000+01:002008-12-09T21:46:23.211+01:00Planet MySQL in italiano<a href="http://planetmysql.com"><img src="http://blogs.sun.com/datacharmer/resource/planet_mysql_en_it.png" width="750" border="0"></a><br />Nuove funzionalità per <a href="http://planetmysql.org">Planet MySQL</a>.</p><br /><a href="http://www.lenzg.org/">Lenz</a> ha aperto una nuova <a href="http://it.planetmysql.org">sezione per blog italiani </a> (dovrei dire <i>blog in italiano</i>, visto che ci sono blog che <a href="http://blogs.mysql.com/kaj/2008/10/25/im-blogging-in-italian/">non si prestano a definizioni tradizionali</a>).</p><br />Grazie, Lenz. Cercheremo di riempire la nuova sezione con contenuti adeguati.<br />Nel frattempo, <a href="http://blogs.sun.com/dups">Dups</a> ha creato una nuova funzionalità per il Pianeta MySQL. <a href="http://blogs.sun.com/dups/entry/mysql_buzz">MySQL Buzz</a>, o <i>le voci di MySQL</i> è una finestra sui contenuti dal vivo su MySQL, dai post nei forum ai blog, alle notizie e video.<br /><a href="planetmysql.org/buzz.php"><img src="http://blogs.sun.com/datacharmer/resource/planet_buzz.png" border="0"></a><br />Il <i>Buzz</i> ha un aspetto ludico. C'è una nuvola di parole più frequenti. Se guardate attentamente la nuvola dei forum, potrete vedere un <b>THANKS</b>. I Forum sono sostenuti dalla comunità. Gentilezza inclusa!</p>Giuseppe Maxiahttp://www.blogger.com/profile/15801583338057324813noreply@blogger.com0tag:blogger.com,1999:blog-3019816579731325682.post-77248445668338255702008-12-07T14:20:00.007+01:002008-12-07T15:41:55.691+01:00MySQL 5.1 per l'impaziente<h2>Novità</h2>Il recente rilascio di <a href="http://dev.mysql/com/downloads/mysql/5.1.html">MySQL 5.1</a> porta a chiedersi cosa si può fare con la nuova versione, e se valga la pena aggiornare dalla 5.0. Vediamo rapidamente quali sono le novità principali.<br /><ul><li>Il partizionamento di tabelle. Si tratta di un meccanismo per dividere le tabelle in porzioni logiche, che rendono più veloce l'inserimento e la ricerca dei dati, in maniera trasparente per l'utente.</li><li>Un gestore di eventi (event scheduler) che consente la definizione di comandi da eseguire in una certa data e ora, oppure a intervalli regolari. Il tutti è integrato nel database, e funziona a prescindere dal sistema operativo adottato.</li><li>Un'interfaccia plugin dinamica. Questo è un cambiamento architetturale che facilita la creazione di "storage engines" o di funzionalità aggiuntive. Grazie a questo meccanismo, sono ora disponibili diversi plugin creati da terze parti.</li><li>La replicazione "row-based", che migliora e fa da complemento all'attuale replicazione. Nel sistema tradizionale, ci sono alcune incongruenze, che vengono sanate da questo nuovo modello.</li><li>I "log" a richiesta. Fino alla versione 5.0, per attivare il "general log" o il log delle query lente, bisogna riavviare il server. Nella versione 5.1, non è necessario il riavvio. Tali log possono essere avviati e fermati a piacere.</li></ul><br />Il motivo principale per usare la 5.1 è sicuramnte un aumento di prestazioni grazie alle partizioni. Ma anche gli eventi sono molto richiesti. Recentemente, è stato lanciato un concorso per i migliori casi di uso della versione 5.1 fra gli utenti che hanno l'adottata prima che fosse dichiarata GA. Gli articoli sono pubblicati nel <a href="http://dev.mysql.com/tech-resources/articles/">sito di MySQL</a>. Fra gli avanguardisti premiati, c'e' anche un sito italiano (<a href="http://www.inter.it/">www.inter.it</a>).<br />Per l'elenco completo delle novità, si veda <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-nutshell.html">il manuale</a>.<br /><h2>Alcuni esempi pratici</h2><h3>Partizioni a intervalli</h3>Questa funzionalità consente un aumento di prestazioni quando si debba lavorare su tabelle di grosse dimensioni. Esistono diversi tipi di partizioni (intervallo, lista, chiave, hash). Il più comune, quando si tratti di archivi storici, è il partizionamento a intervallo (<i>range partitioning</i>).<br />Per partizionare a intervalli, si identifica una colonna che abbia una buona distribuzione di valori, e la si usa come elemento di partizionamento. Per esempio, una tabella di clienti potrebbe essere partizionata per nazione/regione o per fascia di fatturato. Una tabella di ordini potrebbe essere partizionata per anno o mese di emissione.<br />Per esemplificare, si consideri questa tabella:<br /><pre><code><br />CREATE TABLE prestiti<br />(<br /> ID_libro INT not null,<br /> ID_utente INT not null,<br /> data_prestito date not null,<br /> ID_filiale INT not null,<br /> annotazioni text,<br /> PRIMARY KEY (ID_libro, ID_utente, data_prestito) <br />);<br /></code></pre><br />Se si hanno 5.000 utenti e si prevede di crescere fino a 20.000, si può partizionare in questo modo:<br /><pre><code><br />ALTER TABLE prestiti<br />PARTITION BY RANGE (ID_utente)<br />(<br /> PARTITION p01 VALUES LESS THAN ( 2000),<br /> PARTITION p02 VALUES LESS THAN ( 4000),<br /> PARTITION p03 VALUES LESS THAN ( 6000),<br /> PARTITION p04 VALUES LESS THAN ( 8000),<br /> PARTITION p05 VALUES LESS THAN (10000),<br /> PARTITION p06 VALUES LESS THAN (12000),<br /> PARTITION p07 VALUES LESS THAN (14000),<br /> PARTITION p08 VALUES LESS THAN (16000),<br /> PARTITION p09 VALUES LESS THAN (18000),<br /> PARTITION p10 VALUES LESS THAN (MAXVALUE)<br />);<br /></code></pre>Oppure, se i prestiti fossero sparsi in diversi anni, potremmo usare la data:<br /><pre><code>ALTER TABLE prestiti<br />PARTITION BY RANGE (YEAR(data_prestito))<br />(<br /> PARTITION p01 VALUES LESS THAN (1990),<br /> PARTITION p02 VALUES LESS THAN (1991),<br /> PARTITION p03 VALUES LESS THAN (1992),<br /> PARTITION p04 VALUES LESS THAN (1993),<br /> PARTITION p05 VALUES LESS THAN (1994),<br /> PARTITION p06 VALUES LESS THAN (1995),<br /> PARTITION p07 VALUES LESS THAN (1996),<br /> PARTITION p08 VALUES LESS THAN (1997),<br /> PARTITION p09 VALUES LESS THAN (1998),<br /> PARTITION p10 VALUES LESS THAN (1999),<br /> PARTITION p11 VALUES LESS THAN (2000),<br /> PARTITION p12 VALUES LESS THAN (2001),<br /> PARTITION p13 VALUES LESS THAN (2002),<br /> PARTITION p14 VALUES LESS THAN (2003),<br /> PARTITION p15 VALUES LESS THAN (2004),<br /> PARTITION p16 VALUES LESS THAN (2005),<br /> PARTITION p17 VALUES LESS THAN (2006),<br /> PARTITION p18 VALUES LESS THAN (2007),<br /> PARTITION p19 VALUES LESS THAN (2008),<br /> PARTITION p20 VALUES LESS THAN (2009),<br /> PARTITION p21 VALUES LESS THAN (MAXVALUE)<br />);<br /></code></pre>È importante fare dei test di efficienza prima di adottare le partizioni. In entrambi i casi, si noti che la ricerca di una tabella partizionata sarà più efficace di una tabella senza partizioni solo se la query usa la colonna di partizionamento. Per esempio, questa query non sfrutta le partizioni:<br /><pre><code>SELECT COUNT(*) FROM prestiti WHERE ID_libro = 100;<br /></code></pre>Questa sfrutta le partizioni con il primo schema:<br /><pre><code>SELECT COUNT(*) FROM prestiti WHERE ID_cliente = 10 AND ID_libro = 100;<br /></code></pre>Questa sfrutta le partizioni con il primo schema:<br /><pre><code>SELECT COUNT(*) FROM prestiti<br />WHERE data_prestito BETWEEN '2005-01-01'<br />AND '2006-10-31' ID_libro = 100;<br /></code></pre>Per maggiori dettagli sull'uso delle partizioni in pratica, si veda l'articolo <a href="http://dev.mysql.com/tech-resources/articles/testing-partitions-large-db.html">MySQL 5.1 partitions in practice</a> (in inglese).<br /><h3>Gestione degli eventi</h3>Il gestore degli eventi è un grande aiuto per l'amministratore. Se si devono gestire database su diversi sistemi operativi, il gestore integrato è un potente alleato.<br />Gli eventi si definiscono con un comando SQL. Si può impostare un evento a un orario predefinito o a intervalli regolari. Per esempio, per eseguire un comando specifico il 31 gennaio 2009 alle 10 di mattina, si usa:<br /><pre><code><br />CREATE EVENT nome_evento<br />ON SCHEDULE AT '2009-01-31 10:00:00'<br />DO<br />CALL fine_servizio_attivo(12345);<br /></code></pre>Invece di richiamare una procedura specifica, si può usare un blocco <code>BEGIN ... END</code>.<br /><pre><code>CREATE EVENT nome_evento<br />ON SCHEDULE AT '2009-01-31 10:00:00'<br />DO<br />BEGIN<br /> UPDATE impiegati<br /> SET stato = 'in pensione'<br /> WHERE ID_impiegato = 12345;<br /> COMMIT;<br />END;<br /></code></pre>La sintassi per l'esecuzione periodica è simile.<br /><pre><code>CREATE EVENT nome_evento<br />ON SCHEDULE EVERY 12 HOUR<br />DO<br />CALL cancella_vecchi_record();<br /></code></pre>Ci sono molti esempi di uso normale e creativo degli eventi nel mio blog in inglese (<a href="http://datacharmer.blogspot.com/search?q=event+scheduler">The Data Charmer</a>) e negli articoli della <a href="http://www2.blogger.com/dev.mysql.com/tech-resources/articles/">Developer's Zone</a>.Giuseppe Maxiahttp://www.blogger.com/profile/15801583338057324813noreply@blogger.com0