<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>davideferrero.com &#187; MySQL</title>
	<atom:link href="http://blog.davideferrero.com/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.davideferrero.com</link>
	<description>&#62; Web developer for passion</description>
	<lastBuildDate>Sun, 13 Nov 2011 15:55:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Preparare un web server per django su ubuntu server 10.04</title>
		<link>http://blog.davideferrero.com/2010/11/web-server-django-ubuntu-server-10-04-mod-wsgi/</link>
		<comments>http://blog.davideferrero.com/2010/11/web-server-django-ubuntu-server-10-04-mod-wsgi/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 14:11:01 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.davideferrero.com/?p=503</guid>
		<description><![CDATA[Poco tempo fa ho scoperto il favoloso mondo di Django, un web framework che consente di scrivere meno codice e creare applicazioni python davvero molto efficienti. Oltre ad essere un framework che implementa l&#8217;MVC(Model View Controller), la caratteristica che mi ha attratto maggiormente è una fantastica funzionalità di ORM(Object Relational Mapping).. cosa significa? In poche [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Django web framework" src="http://blog.davideferrero.com/image.php?i=42" alt="" width="117" height="41" /></p>
<p>Poco tempo fa ho scoperto il favoloso mondo di <a title="Django web framework" href="http://www.djangoproject.com/" target="_blank">Django</a>, un web framework che consente di scrivere meno codice e creare applicazioni python davvero molto efficienti.</p>
<p>Oltre ad essere un framework che implementa l&#8217;<a title="Model View Controller" href="http://it.wikipedia.org/wiki/Model-View-Controller" target="_blank">MVC</a>(Model View Controller), la caratteristica che mi ha attratto maggiormente è una fantastica funzionalità di <a title="Object Relational Mapping" href="http://it.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a>(Object Relational Mapping).. cosa significa? In poche parole nel file che implementa il &#8220;Model&#8221; (models.py) dovrete dichiarare gli oggetti che verranno trasformati in tabelle del vostro database, al resto penserà django. Infatti una volta collegato un db e scritte le classi del modello, con la funzione syncdb verranno create le tabelle residenti sul db. Vi rimando però al <a title="Django tutorial" href="http://docs.djangoproject.com/en/dev/intro/tutorial01/" target="_blank">tutorial ufficiale</a> per capire davvero qualcosa in più su questo fantastico framework&#8230;</p>
<p>In questo post vi farò vedere i pochi e semplici passi per configurare un web server adatto ad ospitare un&#8217;applicazione django. Ovviamente il server linux girerà grazie ad <a title="Ubuntu Server" href="http://www.ubuntu.com/server" target="_blank">ubuntu server</a> ed in particolare nella versione LTS(long term support) 10.04. Salterò ovviamente i passi dell&#8217;installazione vera e propria del sistema operativo (anche perchè ormai è a prova di win-user :-P ).</p>
<p>Partendo da un sistema pulito, su cui non è stato installato nessun componente, dovremo per prima cosa assicurarci che il sistema sia aggiornato:</p>
<pre class="brush: bash; title: ;">sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get upgrade</pre>
<p>Fatto ciò possiamo procedere con l&#8217;installazione dei componenti necessari a mettere in piedi un server web, il che equivale ovviamente ad installare il buon vecchio <a title="Apache Software Foundation" href="http://www.apache.org/" target="_blank">Apache</a>:</p>
<pre class="brush: bash; title: ;">sudo apt-get install lamp-server^</pre>
<p>In questo modo installeremo tutti i pacchetti per avere un server LAMP ovvero con apache come detto, e con mysql per la parte di database (verrà installato anche php5 per poter utilizzare phpmyadmin, l&#8217;interfaccia per la gestione da web di mysql)</p>
<p>Attesi i dovuti tempi per lo scaricamento, l&#8217;installazione e la configurazione dei vari pacchetti (vi verrà chiesta la password per mysql) dovreste avere il vostro server web funzionante (potete testarlo collegandovi da un qualsiasi browser nella rete all&#8217;indirizzo ip del server es: http://192.168.0.1 ).</p>
<p>Bene, ora manca un ultimo componente per avere il server pronto: il <a title="Mod WSGI" href="http://code.google.com/p/modwsgi/" target="_blank">mod_wsgi</a> ovvero il modulo apache per l&#8217;interpretazione del codice python:</p>
<pre class="brush: bash; title: ;">sudo apt-get install libapache2-mod-wsgi</pre>
<p>Ora non ci resta che installare il driver per fare comunicare python e mysql, che come detto sarà per comodità il nostro dbms:</p>
<pre class="brush: bash; title: ;">sudo apt-get install python-mysqldb</pre>
<p>Ora possiamo procedere al download e installazione del framework dal <a title="Download django" href="http://www.djangoproject.com/download/" target="_blank">sito ufficiale di django</a>(vi risparmio il &#8220;wget&#8221;, mi sembrava troppo da nerd, ma si può fare ;-) ). Trasferite il tar.gz sul server se non è già lì, e scompattatelo (tar -xvzf nomefile.tar.gz per i <em>newbie</em>). Ora entrando nella cartella che avete ottenuto dalla scompattazione potete installare django:</p>
<pre class="brush: bash; title: ;">sudo python setup.py install</pre>
<p>Vi consiglio spassionatamente di installare la release ufficiale di django e non quella dagli archivi ubuntu per un puro fatto di aggiornamento della versione, infatti sul canale ufficiale sarete sicuri di avere l&#8217;ultima stable-release mentre ubuntu è sempre più indietro in queste cose&#8230;</p>
<p>Bene adesso abbiamo tutto ciò che ci serve(r) (battuta di bassissimo umorismo, non ci fate caso, è l&#8217;età :-P ).</p>
<p>Procediamo con la creazione del file python che darà le direttive al mod_wsgi sui percorsi della nostra applicazione, nella cartella del nostro progetto, creiamo il file django.wsgi:</p>
<pre class="brush: bash; title: ;">vim /home/user/py-srv/applicazione1/django.wsgi</pre>
<p>Ipotizzando che la nostra applicazione risieda in /home/user/py-srv/applicazione1 &#8230;</p>
<p>Il file dovrà contenere il seguente codice:</p>
<pre class="brush: python; title: ;">import os
import sys

sys.path.append('/home/user/py-srv/applicazione1')

os.environ['PYTHON_EGG_CACHE'] = '/home/user/py-srv/.python-egg'
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
</pre>
<p>Ora dobbiamo solamente dire ad apache quale sarà la cartella della nostra applicazione. Per fare ciò editiamo il file <em>default</em> nella cartella sites-available di apache (prima però facciamo una copia del file per sicurezza ;-) ) :</p>
<pre class="brush: bash; title: ;">sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default.old
sudo vim /etc/apache2/sites-available/default</pre>
<p>Il file dovrà contenere le seguenti configurazioni:</p>
<pre class="brush: bash; title: ;">&lt;VirtualHost *:80&gt;
   DocumentRoot /home/user/py-srv/applicazione1/public_html

   WSGIScriptAlias / /home/user/py-srv/applicazione1/django.wsgi
   &lt;Directory /home/user/py-srv/applicazione1&gt;
      Order allow,deny
      Allow from all
   &lt;/Directory&gt;

   Alias /favicon.ico /home/user/py-srv/applicazione1/public_html/favicon.ico
   Alias /images /home/user/py-srv/applicazione1/public_html/images
   Alias /static /home/user/py-srv/applicazione1/public_html/static

   ErrorLog /home/user/py-srv/applicazione1/logs/error.log
   CustomLog /home/user/py-srv/applicazione1/logs/access.log combined
&lt;/VirtualHost&gt;
</pre>
<p>Come potete immaginare la cartella &#8220;public_html&#8221; sarà quella che conterrà i file html pubblici, ovvero i file del template della vostra applicazione.</p>
<p>Bene, se avete fatto tutto nel modo giusto, vi basterà collegarvi all&#8217;indirizzo ip che avete già usato prima per testare apache, e vedrete come per magia che funzionerà tutto!</p>
<p>(non funziona? non fate come me che avevo lasciato il vecchio path nel file settings.py, e ci ho perso mezz&#8217;ora per accorgermene :-P )</p>
<p>Buon divertimento!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/2010/11/web-server-django-ubuntu-server-10-04-mod-wsgi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Differenze tra il tipo char e il varchar in MySQL</title>
		<link>http://blog.davideferrero.com/2010/05/differenze-char-varchar-mysql/</link>
		<comments>http://blog.davideferrero.com/2010/05/differenze-char-varchar-mysql/#comments</comments>
		<pubDate>Sun, 30 May 2010 17:28:34 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Char]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Varchar]]></category>

		<guid isPermaLink="false">http://blog.davideferrero.com/?p=451</guid>
		<description><![CDATA[Prosegue il mio lavoro insieme a MySQL, ormai lo sto usando intensamente in molti programmi non solo in php, ma anche nella programmazione in java. Usandolo così massicciamente sto continuando a scoprire cose interessanti. Probabilmente quella di cui vi parlo oggi, non è una novità per qualcuno, ma credo sia bene chiarirla per chi non [...]]]></description>
			<content:encoded><![CDATA[<p>Prosegue il mio lavoro insieme a MySQL, ormai lo sto usando intensamente in molti programmi non solo in php, ma anche nella programmazione in java.</p>
<p>Usandolo così massicciamente sto continuando a scoprire cose interessanti. Probabilmente quella di cui vi parlo oggi, non è una novità per qualcuno, ma credo sia bene chiarirla per chi non lo sapesse.</p>
<p>Qualche giorno fa stavo lavorando su un database che non ho creato io e mi sono imbattuto in un campo <strong>CHAR</strong>. Subito non ci ho fatto caso, ma poi mi è venuto in mente che di solito quando devo dichiarare un campo stringa, uso il tipo <strong>VARCHAR</strong>. Mi sono così documentato un po&#8217;, cercando su google ho trovato diverse spiegazioni su forum, ma come sapete di quello che viene detto sui forum è sempre meglio non fidarsi troppo. Ho fatto quindi direttamente riferimento alla <a title="MySQL reference manual" href="http://dev.mysql.com/doc/refman/5.1/en/" target="_blank">guida ufficiale MySQL (in inglese)</a> e ho scoperto quello che mi interessava.</p>
<p>Innanzitutto prima di MySQL 5.0.3 sia il tipo <strong>char</strong> sia il <strong>varchar</strong> potevano essere dimensionati da 0 a 255 caratteri. Da MySQL 5.0.3 in poi il tipo <strong>varchar</strong> supporta lunghezza da 0 a 65535 caratteri. Oltre a questa differenza di dimensionamento c&#8217;è un&#8217;altra sostanziale differenza: quando dimensionate un campo con il tipo <strong>char</strong>, ad esempio char(4) verrà effettivamente occupato spazio per 4 caratteri, anche se il valore che inserirete nel campo sarà di un solo carattere. Lo spazio rimanente verrà riempito con degli spazi. A differenza del <strong>char</strong>, il <strong>varchar</strong> invece utilizza solamente lo spazio necessario, richiesto dal valore inserito nel campo più un byte (non sono riuscito a trovare il motivo, ma credo sia il famoso &#8220;tappo&#8221; in stile C).</p>
<p>Riepilogando quindi:</p>
<table border="1">
<tbody>
<tr>
<td><strong>Valore</strong></td>
<td><code>CHAR(4)</code></td>
<td><strong>Spazio richiesto<br />
</strong></td>
<td><code>VARCHAR(4)</code></td>
<td><strong>Spazio richiesto<br />
</strong></td>
</tr>
<tr>
<td><code>''</code></td>
<td><code>'    '</code></td>
<td>4 bytes</td>
<td><code>''</code></td>
<td>1 byte</td>
</tr>
<tr>
<td><code>'ab'</code></td>
<td><code>'ab  '</code></td>
<td>4 bytes</td>
<td><code>'ab'</code></td>
<td>3 bytes</td>
</tr>
<tr>
<td><code>'abcd'</code></td>
<td><code>'abcd'</code></td>
<td>4 bytes</td>
<td><code>'abcd'</code></td>
<td>5 bytes</td>
</tr>
<tr>
<td><code>'abcdefgh'</code></td>
<td><code>'abcd'</code></td>
<td>4 bytes</td>
<td><code>'abcd'</code></td>
<td>5 bytes</td>
</tr>
</tbody>
</table>
<p>Per finire, come si può vedere nell&#8217;ultima riga dell&#8217;esempio, per tutti e due i tipi, se il valore supera la lunghezza effettiva dichiarata, esso verrà troncato.</p>
<p>In sostanza se sapete che nel campo che state dichiarando dovrete inserire valori sempre della stessa lunghezza, senza eccezioni, potrebbe essere intelligente dichiararlo <strong>char</strong> mentre invece se, come succede nella stragrande maggioranza dei casi, il campo che state dichiarando conterrà stringhe generiche, allora vi converrà utilizzare il tipo <strong>varchar</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/2010/05/differenze-char-varchar-mysql/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Servire dinamicamente le immagini con php, Mysql e Imagick</title>
		<link>http://blog.davideferrero.com/2010/04/servire-dinamicamente-immagini-php-mysql-imagick/</link>
		<comments>http://blog.davideferrero.com/2010/04/servire-dinamicamente-immagini-php-mysql-imagick/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 15:21:17 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Webmaster Tools]]></category>
		<category><![CDATA[Imagick]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.davideferrero.com/?p=422</guid>
		<description><![CDATA[Nessuno se ne sarà accorto ed effettivamente è un po&#8217; impossibile notarlo se uno non lo sa ;-) Ormai da una settimana però ho messo in funzione uno strumento &#8220;self-made&#8221; per la gestione delle immagini del mio blog. Spulciando un po&#8217; più attentamente google webmaster tools tra le funzioni sperimentali ho trovato un prestazioni del [...]]]></description>
			<content:encoded><![CDATA[<p>Nessuno se ne sarà accorto ed effettivamente è un po&#8217; impossibile notarlo se uno non lo sa ;-)</p>
<p>Ormai da una settimana però ho messo in funzione uno strumento &#8220;self-made&#8221; per la gestione delle immagini del mio blog.</p>
<p>Spulciando un po&#8217; più attentamente <a title="Webmasters Tools" href="http://www.google.com/webmasters/tools/" target="_blank">google webmaster tools</a> tra le <em>funzioni sperimentali</em> ho trovato un <em>prestazioni del sito</em>&#8230;</p>
<p>In questa sezione google presenta un&#8217;analisi delle prestazioni del proprio sito (in termini di tempo e kilobyte di dati) e fornisce consigli su come ridurre i tempi di caricamento.</p>
<p>Siccome il <a title="Infinytech" href="http://www.infinytech.net/" target="_blank">mio hosting</a> mi limita lo spazio web, utilizzavo un piccolo escamotage per caricare le foto del blog: le caricavo su <a title="Picasaweb" href="http://picasaweb.google.com" target="_blank">picasa</a> e sfruttavo i server di google per fornirle. Webmaster tools mi consigliava però di ridurre al minimo le ricerche DNS e infatti molto spesso le foto venivano reperite da diversi server di picasa. Tutto ciò contribuiva ad incrementare il tempo di caricamento del sito per cui ho preso la decisione di <em>darmi da fare</em> :-P</p>
<p>Come detto, il mio hosting mi limita lo spazio web, ma non ho limiti per quanto riguarda il db <a title="MySQL" href="http://www.mysql.com/" target="_blank">MySQL</a>, per cui ho deciso di realizzare una mini-applicazione in php per salvare le immagini su database e servirle dinamicamente. Tutto questo con due funzioni che sfruttano la classe Imagick (installata sul server dove risiede il mio dominio).</p>
<p>Il concetto si basa in sostanza su tre pagine.</p>
<p><strong>La prima</strong> sarà un form per far scegliere all&#8217;utente l&#8217;immagine da uploadare:</p>
<pre class="brush: xml; title: ;">&lt;form action=&quot;.....&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt;.....&lt;/form&gt;</pre>
<p><strong>La seconda</strong>, una pagina che riceve il parametro con l&#8217;immagine e la salva nel database:</p>
<p>il file è contenuto nell&#8217;array</p>
<pre class="brush: php; title: ;">$_FILES['image']['tmp_name']</pre>
<p>dove <em>image</em> è il nome del parametro ricevuto via POST.</p>
<p>Qui ci servirà la prima funzione che sfrutterà la classe Imagick:</p>
<pre class="brush: php; title: ;">
        public static function prepare_image($file){
		$img=new Imagick();
		$handler=fopen($file,'r');
		$ret=null;
		if(!feof($handler)){
			$fstr=fread($handler,filesize($file));
			$img-&gt;readImageBlob($fstr);
			/*Richiamo il metodo resize*/
			$img-&gt;setFormat('jpg');
			$img-&gt;setImageCompression(Imagick::COMPRESSION_JPEG);
			$img-&gt;setImageCompressionQuality(100);
			$ret=addslashes($img-&gt;getImageBlob());
			$img-&gt;destroy();
		}
		fclose($handler);
		return $ret;
	}
</pre>
<p>Dove la variabile <em>$file</em> sarà il contenuto dell&#8217;array di cui parlavamo prima. A questo punto potremo salvare il valore restituito dalla funzione nel database (il campo dovrà essere di tipo blob o meglio ancora longblob).</p>
<p>Fatto ciò possiamo passare alla <strong>terza pagina</strong>, quella che servirà l&#8217;immagine letta dal db.</p>
<p>Quest&#8217;ultima dovrà ricevere come parametro l&#8217;id dell&#8217;immagine da leggere sul db. La query la lascio fare a voi, io vi spiego la seconda funzione che ci servirà ;-) (molto più &#8220;leggera&#8221; della prima):</p>
<pre class="brush: php; title: ;">
        public static function get_image_from_blob($blob){
		 $img=new Imagick();
		 $img-&gt;readImageBlob($blob);
		 $img-&gt;setFormat('jpg');
		 return $img;
	}
</pre>
<p>In questo caso il parametro $blob sarà il valore blob letto dal db, e la funzione ci restituirà l&#8217;immagine. A questo punto non vi resta che stampare l&#8217;immagine:</p>
<pre class="brush: php; title: ;">
header('Content-Type: image/jpeg);
echo $img;
</pre>
<p>Abbastanza semplice no?<br />
E dopo la prima settimana di utilizzo lascio a voi valutare i risultati ;-) :</p>
<p><img class="aligncenter" title="Webmaster tool chart" src="http://blog.davideferrero.com/image.php?i=19" alt="" width="750" height="150" /></p>
<p>Ovviamente tramite Imagick potete anche fare il resize dinamico delle immagini, ma non vorrei confondervi troppo le idee :-P</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/2010/04/servire-dinamicamente-immagini-php-mysql-imagick/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Un tool open source per la progettazione dei database</title>
		<link>http://blog.davideferrero.com/2009/12/un-tool-open-source-per-la-progettazione-dei-database/</link>
		<comments>http://blog.davideferrero.com/2009/12/un-tool-open-source-per-la-progettazione-dei-database/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 15:15:05 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[ER]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[SQL Progettazione]]></category>

		<guid isPermaLink="false">http://blog.davideferrero.com/?p=311</guid>
		<description><![CDATA[Ogni buon programmatore che si rispetti sa che non si può creare un database dal nulla. Proprio i database sono alla base di qualsiasi software degno di nota, e sono indispensabili per la realizzazione di un sito web. Da buon fanatico di progetti open source, ma soprattutto dell&#8217;ambiente php-mysql per la creazione di web application [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="MySQL Workbench" src="http://lh4.ggpht.com/__IYVAt3JPe8/SyUR8pcbT6I/AAAAAAAAB6I/7ONtTszU-x4/s400/workbench.png" alt="" width="400" height="209" /></p>
<p>Ogni buon programmatore che si rispetti sa che non si può creare un database dal nulla. Proprio i database sono alla base di qualsiasi software degno di nota, e sono indispensabili per la realizzazione di un sito web.</p>
<p>Da buon fanatico di progetti open source, ma soprattutto dell&#8217;ambiente php-mysql per la creazione di web application mi sono dato da fare nel <a href="http://en.wikipedia.org/wiki/Google_%28verb%29" target="_blank">mio sport preferito</a> e ho trovato un tool davvero interessante.</p>
<p>Si chiama <a href="http://wb.mysql.com/" target="_blank">MySQL workbench</a> e proviene dagli stessi laboratori dai quali ci viene fornito uno dei DBMS open source più conosciuti al mondo. E&#8217; da qualche mese che lo uso ogni volta in cui ho bisogno di realizzare un db, a lavoro o a casa e lo trovo davvero utile e funzionale. Che cos&#8217;è workbench? Semplice! Un sw che consente di progettare un database, partendo dalla realizzazione dello schema E-R e risparmiando molto lavoro a noi poveri programmatori.</p>
<p style="text-align: center;"><img class="aligncenter" title="ER Schema" src="http://lh4.ggpht.com/__IYVAt3JPe8/SzOEiLMikpI/AAAAAAAAB7Q/AuFJmsTAgrU/s400/workbench_visual_design_linux.png" alt="" width="400" height="296" /></p>
<p>In sostanza basta disegnare lo schema del database inserendo tabelle, chiavi primarie, chiavi esterne, indici, trigger, viste e chi più ne ha più ne metta, e workbench farà per noi tutto il resto. Una volta disegnato lo schema infatti, sarà possibile esportare la struttura del db creato e reimportarla nel nostro DBMS. Io uso abitualmente MySQL e workbench mi permette di esportare in un file .sql le query di creazione della mia base dati, pienamente compatibili con questo DBMS, e di creare con una <em>import</em> il database vero e proprio.</p>
<p>Esiste in due versioni, la community e la standard, la prima rilasciata gratuitamente sotto licenza GPL mentre la seconda a pagamento (e con alcune funzionalità in più) al costo di 79$ per svillupatore per anno. Ovviamente non mi sono potuto permettere di acquistare la versione standard, ma la community svolge il suo egregio lavoro in maniera impeccabile.</p>
<p>Dimenticavo, workbench è multipiattaforma ossia esiste nella versione per Linux (comodo pacchetto debian autoinstallante, o rpm), nella versione per Mac OS X e nella versione per Windows in modo che nessuno possa lamentarsi e tutti possano progettare in tutta serenità i propri database sul proprio sistema preferito.</p>
<p>Direi che non vi resta che <a href="http://dev.mysql.com/downloads/workbench/5.0.html" target="_blank">provarlo</a>!<br />
[ad]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/2009/12/un-tool-open-source-per-la-progettazione-dei-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Indici Full Text in MySQL</title>
		<link>http://blog.davideferrero.com/2009/10/indici-full-text-in-mysql/</link>
		<comments>http://blog.davideferrero.com/2009/10/indici-full-text-in-mysql/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 21:33:58 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[Full Text]]></category>
		<category><![CDATA[Indici]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>

		<guid isPermaLink="false">http://blog.davideferrero.com/?p=217</guid>
		<description><![CDATA[Post da nerd, astenersi perditempo&#8230; :-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 &#8220;generica&#8221; in stile google (ovvero un unico campo che riceve un insieme di parole, che possono corrispondere a [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="Php MySQL" src="http://lh5.ggpht.com/__IYVAt3JPe8/SuIPro8wh8I/AAAAAAAABys/XcqeHmFBZmY/s800/hosting-php-mysql.jpg" alt="" width="333" height="225" /></p>
<p>Post da <em>nerd</em>, astenersi perditempo&#8230; :-P</p>
<p><strong>[NERD MODE ON]</strong></p>
<p>Alcuni giorni fa sul lavoro mi sono cimentato in un nuovo esperimento.</p>
<p>Tutto è partito dal problema di dover indicizzare dei contenuti, sui quali poi eseguira una ricerca &#8220;generica&#8221; in stile google (ovvero un unico campo che riceve un insieme di parole, che possono corrispondere a diversi campi del db).</p>
<p>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.</p>
<p>Ok, e ora? L&#8217;idea iniziale è stata quella di eseguire una query con &#8221; <em>LIKE &#8216;%parola%&#8217; </em>&#8221; in <em>OR</em> con altre <em>LIKE</em> simili, per ogni parola inserita dall&#8217;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 <strong>pesante</strong>&#8230; 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&#8217;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*&#8230;.*Googleing*&#8230;.*Googleing* <strong>FULL TEXT INDEX</strong></p>
<p>Cos&#8217;è? In <a href="http://www.mysql.it" target="_blank">MySQL</a> è 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 <em>alcune restrizioni</em> 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).</p>
<p>Detto ciò i passi da fare sono i seguenti:<br />
<em> Definiamo la tabella e l&#8217;indice:</em></p>
<pre class="brush: sql; title: ;">CREATE TABLE test (
id INT UNSIGNED   AUTO_INCREMENT NOT NULL PRIMARY KEY,
keywords TEXT,
[keywords2] VARCHAR(255),
FULLTEXT (keywords[,keywords2])
);</pre>
<p>[Tra le parentesi quadre ho messo il secondo campo, spero si capisca che è opzionale...]</p>
<p>Fatto questo e dopo aver popolato la tabella, possiamo provare la nostra ricerca con la seguente query:</p>
<pre class="brush: sql; title: ;">SELECT * FROM test WHERE MATCH(keywords) AGAINST('pippo')</pre>
<p>In questo modo andremo a dire a MySQL di cercarci l&#8217;esatta parola &#8216;pippo&#8217; all&#8217;interno del campo keywords.</p>
<p>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 <em>linguaggio naturale</em>, che è ottimale per indicizzare frasi di senso (più o meno) compiuto. Il &#8220;difetto&#8221; se può definirsi così, è che con questo tipo di ricerca alcune parole non verranno trovate, infatti MySQL utilizza un array di <em>stopwords</em> che verranno saltate a piè pari dalla ricerca. Per effettuare una ricerca su tutte le parole e utilizzando operatori logici (ad esempio &#8220;+&#8221; significa OR mentre &#8220;-&#8221; 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:</p>
<pre class="brush: sql; title: ;">SELECT * FROM test WHERE MATCH(keywords) AGAINST('*pippo*,*pluto*' IN BOOLEAN MODE)</pre>
<p>In questo modo si effettua una ricerca all&#8217;interno del campo keywords, delle parole che contengono al loro interno &#8220;pippo&#8221; o &#8220;pluto&#8221;. Il carattere &#8220;*&#8221; funziona un po&#8217; come il &#8220;%&#8221; nelle <em>LIKE</em>.</p>
<p>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 <em>strane</em> ma che funzionano ;)</p>
<p>Quindi per sfruttare al massimo questo algoritmo bisognerà scrivere la query con:</p>
<pre class="brush: sql; title: ;">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</pre>
<p>Così facendo ordiniamo i risultati dal più pertinente, a quello meno.</p>
<p>Risultato? sui miei 1000 records il tempo si è dimezzato, nel caso peggiore&#8230; Risultato accettabile no? :-)</p>
<p>Non vi resta che provare per credere, buon divertimento!</p>
<p><strong>[NERD MODE OFF]</strong><br />
[ad#ad-1]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/2009/10/indici-full-text-in-mysql/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Info</title>
		<link>http://blog.davideferrero.com/info/</link>
		<comments>http://blog.davideferrero.com/info/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 14:56:48 +0000</pubDate>
		<dc:creator>davide</dc:creator>
				<category><![CDATA[Senza categoria]]></category>
		<category><![CDATA[Cuneo]]></category>
		<category><![CDATA[Davide Ferrero]]></category>
		<category><![CDATA[Info]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Developer]]></category>

		<guid isPermaLink="false">http://ilferre.setupstat.com/?page_id=2</guid>
		<description><![CDATA[Mi chiamo Davide Ferrero e sono nato il 4 maggio 1986 a Cuneo. Ho conseguito il diploma di perito tecnico industriale informatico nel 2005 presso l&#8217;IIS G. Vallauri di Fossano(CN) con la votazione di 82/100. Il 17 marzo 2009 mi sono laureato in Informatica alla facoltà di Scienze M.F.N dell&#8217;Università degli Studi di Torino con [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Mi chiamo Davide Ferrero e sono nato il 4 maggio 1986 a Cuneo.<br />
Ho conseguito il diploma di perito tecnico industriale informatico nel 2005 presso l&#8217;IIS G. Vallauri di Fossano(CN) con la votazione di 82/100.</p>
<p style="text-align: justify;">Il 17 marzo 2009 mi sono laureato in Informatica alla facoltà di Scienze M.F.N dell&#8217;Università degli Studi di Torino con la votazione di 98/110, discutendo la tesi dal titolo &#8220;Google App Engine: una soluzione alternativa alla creazione di web application.&#8221;. <a href="http://www.scribd.com/doc/24966125" target="_blank">Leggila su scribd.com!</a></p>
<p style="text-align: justify;">Mi interesso in particolare di programmazione in Php, Python, Java, C#, HTML, CSS e Javascript (specialmente jQuery), di Cloud Computing e di databases e dbms (prediligendo MySQL).</p>
<p style="text-align: justify;">Ho acquisito esperienza nella creazione e realizzazione di siti web dinamici, usando gestori di contenuti (CMS), in particolare <a title="Wordpress.org" href="http://wordpress.org" target="_blank">WordPress</a> e nell&#8217;ottimizzazione dei siti internet per l&#8217;indicizzazione sui motori di ricerca (SEO).</p>
<p style="text-align: justify;"><img class="aligncenter" title="Davide Ferrero" src="http://blog.davideferrero.com/image.php?i=44" alt="Davide Ferrero" width="218" height="309" /></p>
<p style="text-align: justify;">Attualmente sono Web Developer presso <a href="http://www.glocalmedia.it" target="_blank">Glocalmedia</a>. <a title="Siti realizzati da Glocalmedia" href="http://www.glocalmedia.it/web/media.php?action=web&amp;c=sitiRealizzati" target="_blank">Visita l&#8217;apposita sezione</a> per dare un&#8217;occhiata ai siti web realizzati.</p>
<p style="text-align: justify;">Puoi guardare il mio curriculum vitae su:</p>
<p><a href="http://it.linkedin.com/in/davideferre" target="_blank"><img class="alignnone" title="Linkedin" src="http://blog.davideferrero.com/image.php?i=7" alt="linkedin" width="82" height="23" /></a></p>
<p>Per contattarmi:</p>
<p><img class="alignnone" title="Per contattarmi" src="http://blog.davideferrero.com/image.php?i=45" alt="Per contattarmi" width="150" height="20" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.davideferrero.com/info/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

