<?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>Jub&#039;s Stuff</title>
	<atom:link href="http://giustino.borzacchiello.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://giustino.borzacchiello.it</link>
	<description>...pensieri pensioggi...</description>
	<lastBuildDate>Sat, 07 Apr 2012 13:50:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>L&#8217;ultimo utente</title>
		<link>http://giustino.borzacchiello.it/2012/04/lultimo-utente/</link>
		<comments>http://giustino.borzacchiello.it/2012/04/lultimo-utente/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 13:50:21 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Coding Horror]]></category>
		<category><![CDATA[last id]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[registrazione]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=691</guid>
		<description><![CDATA[Preambolo Inauguro questa piccola &#8220;Galleria degli orrori&#8221;, con alcune chicche trovate qui e lì, vagando per il codice altrui. Ovviamente non vuole essere un modo per mostrarsi superiori, lo considero più un monito per me stesso che uno scherno per &#8230; <a href="http://giustino.borzacchiello.it/2012/04/lultimo-utente/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Preambolo</h2>
<p>Inauguro questa piccola &#8220;Galleria degli orrori&#8221;, con alcune chicche trovate qui e lì, vagando per il codice altrui.</p>
<p>Ovviamente non vuole essere un modo per mostrarsi superiori, lo considero più un monito per me stesso che uno scherno per altri.</p>
<h3>Recuperare l&#8217;ultimo id inserito</h3>
<pre class="prettyprint">

$user = Userlib::createnew_user('0', $_POST["str_Username"], $_POST["str_Password"],
  #interminabile lista di parametri, ovviamente non filtrati);

$recupero_id = Userlib::list_user(" 1=1 ORDER BY id_user DESC LIMIT 1 "); # Mai sentito parlare di operazioni concorrenti?
</pre>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/04/lultimo-utente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Assert in C</title>
		<link>http://giustino.borzacchiello.it/2012/03/assert-in-c/</link>
		<comments>http://giustino.borzacchiello.it/2012/03/assert-in-c/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 09:00:12 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[assert]]></category>
		<category><![CDATA[preprocessore]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=637</guid>
		<description><![CDATA[Ultimamente sto programmando un po&#8217; di più in C per un progetto universitario di cui parlerò in futuro. Una funzionalità che sto sfruttando per assicurarmi che siano sempre verificate le precondizioni all&#8217;inizio di una funzione sono le assert (o, se &#8230; <a href="http://giustino.borzacchiello.it/2012/03/assert-in-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ultimamente sto programmando un po&#8217; di più in C per un progetto universitario di cui parlerò in futuro.<br />
Una funzionalità che sto sfruttando per assicurarmi che siano sempre verificate le precondizioni all&#8217;inizio di una funzione sono le <code>assert</code> (o, se preferite, le asserzioni).</p>
<h2>Che cosa sono</h2>
<p>Le asserzioni sono dei semplici predicati che indicano una condizione che deve essere verificata in un certo punto del programma. Quindi qualsiasi test che ritorna un valore booleano può essere utilizzato come argomento per una asserzione.</p>
<h2>Esempio</h2>
<p>Ad esempio, se volessi che una funzione accetti solo numeri positivi potrei scrivere:</p>
<pre class="prettyprint">
/* @file assert.c */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;assert.h&gt;

int func(int x)
{
    assert(x > 0);
    return x;
}

int main(void)
{
    int i = 0;
    printf("Numero: %d\n", func(i));
    return 0;
}
</pre>
<p>Eseguendo questo programma otterrei:</p>
<pre class="prettyprint">
[justb@dellill C]$ gcc -Wall assert.c -o assert.out &#038;&#038; ./assert.out
assert.out: assert.c:8: func: Assertion `x > 0' failed.
Annullato
</pre>
<p>L&#8217;esecuzione è stata annullata, ottenendo informazioni utili su cosa è andato storto, ma soprattutto <strong>dove</strong> è andato storto.</p>
<h2>In produzione</h2>
<p>Chiaramente la <em>bruta interruzione</em> di un programma non è sempre un comportamento accettabile. Secondo me l&#8217;uso delle asserzioni è molto utile durante lo sviluppo di un&#8217;applicazione, ma non può sostituire una robusta opera di <em>error checking</em>.<br />
Inoltre, per applicazioni di una certa dimensione, l&#8217;aggiunta di molte asserzioni può causare un calo delle prestazioni, dovuto ai molti controlli aggiuntivi.</p>
<p>Così, per ottenere il meglio dei due approcci, è possibile indicare al preprocessore di ignorare le asserzioni nella build di produzione, passando il flag <code>NDEBUG</code>:</p>
<pre class="prettyprint">
[justb@dellill C]$ gcc -Wall -DNDEBUG assert.c -o assert.out &#038;&#038; ./assert.out
Numero: 0
</pre>
<p>In questo modo non vi sarà nessun overhead nel programma finale dovuto alle varie assert.</p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/03/assert-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alice in Wonderland</title>
		<link>http://giustino.borzacchiello.it/2012/03/alice-in-wonderland/</link>
		<comments>http://giustino.borzacchiello.it/2012/03/alice-in-wonderland/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 07:12:13 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Alice]]></category>
		<category><![CDATA[Fiabe]]></category>
		<category><![CDATA[Poster]]></category>
		<category><![CDATA[Square Inch Design]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=645</guid>
		<description><![CDATA[Alcune delle più belle fiabe trasformate in poster. Via Square Inch Design]]></description>
			<content:encoded><![CDATA[<p><a href="http://giustino.borzacchiello.it/wp-content/uploads/2012/03/alice.png" rel="shadowbox[sbpost-645];player=img;"><img src="http://giustino.borzacchiello.it/wp-content/uploads/2012/03/alice.png" alt="Alice in wonderland" title="Alice in Wonderland" width="600" height="877" class="aligncenter size-full wp-image-644" /></a></p>
<p>Alcune delle più belle fiabe trasformate in poster.</p>
<p>Via <a href="http://www.squareinchdesign.com/alice-in-wonderland/">Square Inch Design</a></p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/03/alice-in-wonderland/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A quote from Brian W. Kernighan and P. J. Plauger</title>
		<link>http://giustino.borzacchiello.it/2012/03/a-quote-from-brian-w-kernighan-and-p-j-plauger/</link>
		<comments>http://giustino.borzacchiello.it/2012/03/a-quote-from-brian-w-kernighan-and-p-j-plauger/#comments</comments>
		<pubDate>Fri, 02 Mar 2012 00:11:50 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[citazioni]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=635</guid>
		<description><![CDATA[Readability is the best single criterion of program quality. If a program is easy to read, it is probably a good program; if it is hard to read, it probably isn’t good.]]></description>
			<content:encoded><![CDATA[<blockquote><p>Readability is the best single criterion of program quality.<br />
If a program is easy to read, it is probably a good program; if it is hard to read, it probably isn’t good.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/03/a-quote-from-brian-w-kernighan-and-p-j-plauger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A quote from M.A. Jackson</title>
		<link>http://giustino.borzacchiello.it/2012/03/a-quote-from-m-a-jackson/</link>
		<comments>http://giustino.borzacchiello.it/2012/03/a-quote-from-m-a-jackson/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 00:10:45 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[citazioni]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=630</guid>
		<description><![CDATA[The beginning of wisdom for a software engineer is to recognize the difference between getting a program to work, and getting it right.]]></description>
			<content:encoded><![CDATA[<blockquote><p>The beginning of wisdom for a software engineer is to recognize the difference between getting a program to work, and getting it right.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/03/a-quote-from-m-a-jackson/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sviluppare nell&#8217;ambiente giusto</title>
		<link>http://giustino.borzacchiello.it/2012/02/sviluppare-nellambiente-giusto/</link>
		<comments>http://giustino.borzacchiello.it/2012/02/sviluppare-nellambiente-giusto/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 20:11:28 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[method chaining]]></category>
		<category><![CDATA[PHP4]]></category>
		<category><![CDATA[PHP5]]></category>
		<category><![CDATA[Vita vissuta]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=628</guid>
		<description><![CDATA[E non sto parlando di pulizia della vostra camera o del vostro ufficio. Oggi mi è capitata una cosa che non auguro a nessuno sviluppatore. La colpa è stata sicuramente mia, in quanto potevo stare più attento, ma almeno è &#8230; <a href="http://giustino.borzacchiello.it/2012/02/sviluppare-nellambiente-giusto/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>E non sto parlando di pulizia della vostra camera o del vostro ufficio.</p>
<p>Oggi mi è capitata una cosa che non auguro a nessuno sviluppatore. La colpa è stata sicuramente mia, in quanto potevo stare più attento, ma almeno è una storia a lieto fine. </p>
<p>Primo lavoro, prima consegna, primo incontro per verificare il vostro operato.<br />
Siete stati svegli la notte, avete studiato tutto il codice ereditato nel minimo dettaglio, avete sistemato tutti i warning in cui vi siete imbattuti, refactoring, test, aggiunto commenti. Insomma volevate dimostrare di aver lavorato sodo e bene.</p>
<p>Arrivate in orario, accendete il pc per mostrare il lavoro.<br />
&#8220;No, proviamolo direttamente sul server..hai una penna usb?&#8221;<br />
L&#8217;avete. Caricate i file sulla pennina.<br />
&#8220;Hai cambiato il database?&#8221;<br />
&#8220;Sì, ho aggiunto dei campi necessari. Ecco il dump.&#8221; </p>
<p>Brillanti! Impeccabili!</p>
<p>Carica l&#8217;applicativo. &#8220;Bene proviamo a inserire un&#8230;.&#8221; BAAAAM. Vi si presenta una terribile schermata bianca con questa scritta:</p>
<blockquote><p>
syntax error, unexpected T_OBJECT_OPERATOR in File.php on line 68
</p></blockquote>
<p>Panico. Alarm. Alarm. Non può essere. Ovviamente sulla vostra macchina funziona tutto, <em>tuttissimo</em>.<br />
Alla riga 68 va tutto bene, c&#8217;è una semplicissima query al database:</p>
<pre class="prettyprint">
$var = $DB->Execute($sqlQuery)->FetchRow();
</pre>
<p>Cosa può esserci di sbagliato in questa riga? Sono tutte funzioni di libreria, non avete toccato niente. Un semplicissimo <a href="http://en.wikipedia.org/wiki/Method_chaining">method chaining</a>. Semplice? Davvero?</p>
<p>Come potevate mai pensare che il <em>semplicissimo</em> method chaining non era sempre stato tra le caratteristiche fornite dal vostro linguaggio di programmazione? E che, guardacaso, la versione installata sul server era precedente a quella installata sulla macchina su cui avete sviluppato. Quindi, errore! Ve la siete giocata male.</p>
<p>Fortunatamente, sul server era installata anche la versione più recente, quindi è bastato cambiare ambiente per far funzionare il tutto. Ma poteva non essere il caso. E vi sareste trovati a dover spezzare tutte le righe di codice in cui avevate utilizzato il method chaining:</p>
<pre class="prettyprint">
$result = $DB->Execute($sqlQuery);
$var = $result->FetchRow();
</pre>
<p>La morale della storia quindi è: assicuratevi sempre di sviluppare nell&#8217;ambiente giusto. Altrimenti i risultati possono essere imprevedibili. E, visto che ci siete, aprite un po&#8217; la finestra della stanza! </p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/02/sviluppare-nellambiente-giusto/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Visualizzare select di tabelle con molti campi in MySQL</title>
		<link>http://giustino.borzacchiello.it/2012/02/visualizzare-select-di-tabelle-con-molti-campi-in-mysql/</link>
		<comments>http://giustino.borzacchiello.it/2012/02/visualizzare-select-di-tabelle-con-molti-campi-in-mysql/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 18:31:28 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[command-line]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Select]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=626</guid>
		<description><![CDATA[Se capita di dover effettuare una SELECT su una tabella da linea di comando, i risultati verranno visualizzati in una tabella in formato ASCII. Nel caso in cui la tabella contiene molti campi, questa tabella risulterà non formattata correttamente, con &#8230; <a href="http://giustino.borzacchiello.it/2012/02/visualizzare-select-di-tabelle-con-molti-campi-in-mysql/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Se capita di dover effettuare una <code>SELECT</code> su una tabella da linea di comando, i risultati verranno visualizzati in una tabella in formato ASCII.<br />
Nel caso in cui la tabella contiene molti campi, questa tabella risulterà non formattata correttamente, con righe spezzate su più livelli.<br />
Per visualizzare un record alla volta si può utilizzare il flag <code>\G</code> dopo il comando.</p>
<p>Ad esempio:</p>
<pre class="prettyprint">
mysql> select * from prova;
+----+---------+--------+------+
| id | testo   | numero | car  |
+----+---------+--------+------+
|  1 | Uno     |      0 | r    |
|  2 | Due     |      0 | r    |
|  3 | Tre     |      0 | r    |
|  4 | Quattro |      0 | r    |
|  5 | Cinque  |      0 | r    |
|  6 | Sei     |      0 | r    |
|  7 | Sette   |      0 | r    |
|  8 | Otto    |      0 | r    |
|  9 | Nove    |      0 | r    |
+----+---------+--------+------+
9 rows in set (0.00 sec)

mysql> select * from prova\G
*************************** 1. row ***************************
    id: 1
 testo: Uno
numero: 0
   car: r
*************************** 2. row ***************************
    id: 2
 testo: Due
numero: 0
   car: r
*************************** 3. row ***************************
    id: 3
 testo: Tre
numero: 0
   car: r
*************************** 4. row ***************************
    id: 4
 testo: Quattro
numero: 0
   car: r
*************************** 5. row ***************************
    id: 5
 testo: Cinque
numero: 0
   car: r
*************************** 6. row ***************************
    id: 6
 testo: Sei
numero: 0
   car: r
*************************** 7. row ***************************
    id: 7
 testo: Sette
numero: 0
   car: r
*************************** 8. row ***************************
    id: 8
 testo: Otto
numero: 0
   car: r
*************************** 9. row ***************************
    id: 9
 testo: Nove
numero: 0
   car: r
9 rows in set (0.00 sec)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/02/visualizzare-select-di-tabelle-con-molti-campi-in-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update con Join in MySQL</title>
		<link>http://giustino.borzacchiello.it/2012/01/update-con-join-in-mysql/</link>
		<comments>http://giustino.borzacchiello.it/2012/01/update-con-join-in-mysql/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 22:50:07 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Join]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Query]]></category>
		<category><![CDATA[Update]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=624</guid>
		<description><![CDATA[Mi sono trovato a dover aggiornare un attributo di una relazione, avendo come input l&#8217;identificativo di un&#8217;altra relazione, collegata alla prima tramite vincolo di chiave esterna. In MySQL: UPDATE tabella1 t1 JOIN tabella2 t2 ON t1.id=t2.attributoConFK SET t1.campo=t1.campo+1;]]></description>
			<content:encoded><![CDATA[<p>Mi sono trovato a dover aggiornare un attributo di una relazione, avendo come input l&#8217;identificativo di un&#8217;altra relazione, collegata alla prima tramite vincolo di chiave esterna.<br />
In MySQL:</p>
<pre class="prettyprint">
UPDATE tabella1 t1 JOIN tabella2 t2
ON t1.id=t2.attributoConFK SET t1.campo=t1.campo+1;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/01/update-con-join-in-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google API Console</title>
		<link>http://giustino.borzacchiello.it/2012/01/google-api-console/</link>
		<comments>http://giustino.borzacchiello.it/2012/01/google-api-console/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 22:47:44 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Api]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=620</guid>
		<description><![CDATA[Ho appena scoperto l&#8217;esistenza di questa Google API Console. Si tratta di un pannello di controllo dove si può monitorare sia l&#8217;attivazione che l&#8217;utilizzo delle API di Google da parte delle proprie applicazioni. L&#8217;ho scoperto per caso negli ultimi giorni &#8230; <a href="http://giustino.borzacchiello.it/2012/01/google-api-console/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ho appena scoperto l&#8217;esistenza di questa <a href="https://code.google.com/apis/console">Google API Console</a>. Si tratta di un pannello di controllo dove si può monitorare sia l&#8217;attivazione che l&#8217;utilizzo delle API di Google da parte delle proprie applicazioni.</p>
<p>L&#8217;ho scoperto per caso negli ultimi giorni mentre facevo delle prove con le API di Google Maps: veramente un tool interessante!</p>
<p><a href="http://giustino.borzacchiello.it/wp-content/uploads/2012/01/GoogleConsoleApi.png" rel="shadowbox[sbpost-620];player=img;"><img src="http://giustino.borzacchiello.it/wp-content/uploads/2012/01/GoogleConsoleApi-300x169.png" alt="Home page della Google Console Api" title="GoogleConsoleApi" width="300" height="169" class="aligncenter size-medium wp-image-621" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2012/01/google-api-console/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Processare un URL con PHP</title>
		<link>http://giustino.borzacchiello.it/2011/12/processare-un-url-con-php/</link>
		<comments>http://giustino.borzacchiello.it/2011/12/processare-un-url-con-php/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 22:08:08 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Explode]]></category>
		<category><![CDATA[Processing]]></category>
		<category><![CDATA[URL]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=616</guid>
		<description><![CDATA[NOTA Come al solito l&#8217;ignoranza (la mia) aguzza l&#8217;ingegno: in ogni caso penso sia meglio utilizzare la funzione di libreria parse_url Oggi facevo un po&#8217; di prove con il PHP sdk di Facebook. Mi sono ritrovato a dover recuperare le &#8230; <a href="http://giustino.borzacchiello.it/2011/12/processare-un-url-con-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>NOTA</h3>
<p>Come al solito l&#8217;ignoranza (la mia) aguzza l&#8217;ingegno: in ogni caso penso sia meglio utilizzare la funzione di libreria <a href="http://it.php.net/manual/en/function.parse-url.php">parse_url</a></p>
<p><del datetime="2012-03-26T21:38:14+00:00">Oggi facevo un po&#8217; di prove con il PHP sdk di Facebook. Mi sono ritrovato a dover recuperare le varie parti della query string di un URL per poterle poi utilizzare nel codice. In pratica mi ritrovavo con un URL tipo:</del></p>
<pre class="prettyprint">

https://graph.facebook.com/me/friends?access_token=AAACrnu&#038;limit=20&#038;method=GET&#038;offset=20&#038;__after_id=719091958
</pre>
<p><del datetime="2012-03-26T21:38:50+00:00">e avevo bisogno di un array di questo tipo:</del></p>
<pre class="prettyprint">
array(5) {
  ["access_token"]=>
  string(7) "AAACrnu"
  ["limit"]=>
  string(2) "20"
  ["method"]=>
  string(3) "GET"
  ["offset"]=>
  string(2) "20"
  ["__after_id"]=>
  string(9) "719091958"
}
</pre>
<p><del datetime="2012-03-26T21:38:50+00:00">Ho scritto così questa semplice funzione:</del></p>
<pre class="prettyprint">
/**
 * Returns an array with url query parts
 * @author Giustino Borzacchiello
 *
 * From this:
 * http://domain.com?a=foo&#038;b=bar&#038;c=ciccio
 * to this:
 * array(3) {
 *   ["a"]=>
 *   string(3) "foo"
 *   ["b"]=>
 *   string(3) "bar"
 *   ["c"]=>
 *   string(6) "ciccio"
 * }
 *
 * @param $url Url from which get the query parts
 *
 * */
function getUrlQueryParts($url)
{
    # Recupera la query string dell'url
    $query = parse_url($url, PHP_URL_QUERY);
    # Suddividi la stringa in corrispondenza delle &amp;
    $queryPieces = explode('&amp;', $query);
    # Prepara l'array da restituire
    $result = array();
    foreach($queryPieces as $query)
    {
        # Separa ogni elemento in corrispondenza del simbolo =
        # La funzione explode restituisce un array di due elementi
        $query = explode('=', $query);
        # Recupera chiave e valore
        $key = $query[0];
        $val = $query[1];
        # Salva chiave e valore nell'array risultato
        $result[$key] = urldecode($val);

    }
    return $result;
}
</pre>
<p><del datetime="2012-03-26T21:38:50+00:00">Spero che sia utile! <img src='http://giustino.borzacchiello.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </del></p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/12/processare-un-url-con-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Appunti su Yii Framework/1</title>
		<link>http://giustino.borzacchiello.it/2011/11/appunti-su-yii-framework1/</link>
		<comments>http://giustino.borzacchiello.it/2011/11/appunti-su-yii-framework1/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 23:06:47 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Yii Framework]]></category>
		<category><![CDATA[Appunti]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=604</guid>
		<description><![CDATA[Ogni tanto mi piace cominciare a studiare qualcosa di nuovo. Tempo fa decisi di studiare Yii Framework ma una serie di eventi mi impedì di cominciare. Oggi ho deciso di riprendere. Questi sono una serie di appunti sconclusionati che ho &#8230; <a href="http://giustino.borzacchiello.it/2011/11/appunti-su-yii-framework1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ogni tanto mi piace cominciare a studiare qualcosa di nuovo. Tempo fa decisi di studiare <a href="http://www.yiiframework.com">Yii Framework</a> ma una serie di eventi mi impedì di cominciare. Oggi ho deciso di riprendere.</p>
<p>Questi sono una serie di appunti sconclusionati che ho preso in questa prima giornata di studio. Sicuramente ci sono altre cose che ho imparato e che sono troppo pigro per scrivere, ma cercherò di tenere una lista abbastanza aggiornata.</p>
<h2>Controllare i requisiti per Yii</h2>
<p>Una volta scaricato l&#8217;archivio, basta visitare <code>http://host/path/di/Yii/requirements/index.php</code> per avere una panoramica dettagliata sul supporto a Yii da parte del nostro server.</p>
<h2>Creare un&#8217;applicazione</h2>
<p>Per creare un&#8217;applicazione è possibile utilizzare il comando <kbd>yiic</kbd>:</p>
<pre class="prettyprint">
[justb@dellill YiiApps]$ yiic webapp demoApp
Create a Web application under '/home/justb/public_html/YiiApps/demoApp'? [Yes|No] y
</pre>
<h2>Creare un link ad una pagina</h2>
<p>Per creare un link ad una pagina, invece di scriverlo staticamente, è possibile sfruttare <code>Yii CHtml</code>:</p>
<pre class="prettyprint">
&lt;?php echo CHtml::link("TestoLink", array('controller/azione')); ?&gt;
</pre>
<h2>Importare una classe</h2>
<p>Yii fornisce una valida alternativa ai metodi <code>include/require</code>: <code>Yii:import</code>:</p>
<pre class="prettyprint">
Yii::import('application.controllers.MioNomeController');
</pre>
<p><code>Yii::import</code> è più efficiente degli altri metodi, in quanto non include il file finché non ne esiste un riferimento. Come input accetta una stringa che rappresenta il path della classe da includere (<code>application</code> è mappato sulla cartella <code>protected</code>)</p>
<h2>Test</h2>
<p>I test unitari vanno collocati nella directory <code>demoApp/protected/tests/unit/</code>. Devono essere delle classi che estendono <code>CTestCase</code>:</p>
<pre class="prettyprint">
&lt;?php
class ProvaTest extends CTestCase
{
  ...
}
</pre>
<p>Se la classe da testare effettua operazioni con il database, allora estende la classe <code>CDbTestCase</code>:</p>
<pre class="prettyprint">
class DbRelatedTest extends CDbTestCase
{
  ...
}
</pre>
<h2>Accedere al database</h2>
<p>La connessione al database è specificata come &#8216;component&#8217; di Yii: in questo modo è possibile accedere a tale risorsa da qualsiasi classe tramite <code>Yii::app()->db</code></p>
<p class="aligncenter"><img src="http://giustino.borzacchiello.it/wp-content/uploads/2011/11/yii-300x64.png" alt="Yii framework logo" title="Yii framework logo" width="300" height="64" class="size-medium wp-image-609" /></p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/11/appunti-su-yii-framework1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ludwig Erhard sul Compromesso</title>
		<link>http://giustino.borzacchiello.it/2011/11/ludwig-erhard-compromesso/</link>
		<comments>http://giustino.borzacchiello.it/2011/11/ludwig-erhard-compromesso/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 17:45:21 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[citazioni]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=600</guid>
		<description><![CDATA[Trovare un compromesso è l&#8217;arte di dividere una torta in modo che tutti ritengano di aver avuto il pezzo più grande]]></description>
			<content:encoded><![CDATA[<blockquote><p>Trovare un compromesso è l&#8217;arte di dividere una torta in modo che tutti ritengano di aver avuto il pezzo più grande</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/11/ludwig-erhard-compromesso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diario Progetto LASD &#8211; 07/11/11</title>
		<link>http://giustino.borzacchiello.it/2011/11/diario-progetto-lasd-071111/</link>
		<comments>http://giustino.borzacchiello.it/2011/11/diario-progetto-lasd-071111/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 20:20:17 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[Progetto LASD]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Grafi]]></category>
		<category><![CDATA[Insieme vertici]]></category>
		<category><![CDATA[LASD]]></category>
		<category><![CDATA[Università]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=596</guid>
		<description><![CDATA[Oggi ho ripreso a lavorare al progetto per il corso di Laboratorio di Algoritmi e strutture dati. Tra le cose che ho fatto: Aggiunta possibilità di estrazione dalla testa della lista, nella libreria lista Creata l&#8217;interfaccia per la gestione di &#8230; <a href="http://giustino.borzacchiello.it/2011/11/diario-progetto-lasd-071111/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Oggi ho ripreso a lavorare al progetto per il corso di Laboratorio di Algoritmi e strutture dati.</p>
<p>Tra le cose che ho fatto:</p>
<ul>
<li>Aggiunta possibilità di estrazione dalla testa della lista, nella libreria lista</li>
<li>Creata l&#8217;interfaccia per la gestione di un insieme di vertici</li>
<li>Iniziata la prima bozza per la versione dell&#8217;insieme di vertici basato su array</li>
</ul>
<p>Per quanto riguarda l&#8217;ultimo punto ho creato una struct così formata:</p>
<pre class="prettyprint">
struct jvset_tag
{
    J_VERTEX **Vertices;   /**< Array contenente i vertici */
    int NumActiveVertices; /**< Numero di vertici inseriti nell'insieme */
    int NextFreeIndex;     /**< Indice della prossima locazione libera */
    int Size;              /**< Numero totale di vertici */
    J_LIST *FreeList;      /**< Lista delle locazioni libere */
};
</pre>
<p>Ho scritto anche le funzioni per la gestione dell'inizializzazione dell'insieme e per la relativa deallocazione.</p>
<p>Il prossimo passo è scrivere le funzioni di aggiunta e rimozione dei vertici.</p>
<p>Sto pensando però che forse dovrei tenere traccia anche delle locazioni dell'array occupate, e non solo di quelle libere, per permettere di effettuare la visita solo sui vertici effettivamente inseriti e non su tutta la dimensione dell'array.</p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/11/diario-progetto-lasd-071111/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joel Spolsky on hiring</title>
		<link>http://giustino.borzacchiello.it/2011/11/joel-spolsky-on-hiring/</link>
		<comments>http://giustino.borzacchiello.it/2011/11/joel-spolsky-on-hiring/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 11:23:14 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[citazioni]]></category>
		<category><![CDATA[Hiring]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[Joel Spolsky]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=560</guid>
		<description><![CDATA[Two of the biggest challenges in technical hiring are identifying people who are smart but don&#8217;t get things done and people who get things done but aren&#8217;t smart. A company in a competitive industry needs to avoid hiring both classes &#8230; <a href="http://giustino.borzacchiello.it/2011/11/joel-spolsky-on-hiring/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Two of the biggest challenges in technical hiring are identifying people who are smart but don&#8217;t get things done and people who get things done but aren&#8217;t smart. A company in a competitive industry needs to avoid hiring both classes of people.</p>
<p>&#8220;People who are smart but don&#8217;t get things done often have PhDs and work in big companies where nobody listens to them because they are completely impractical,&#8221; explains Spolsky. </p>
<p>&#8220;People who get things done but are not smart will do stupid things, seemingly without thinking about them, and somebody else will have to come clean up their mess later.&#8221;</p></blockquote>
<p>Tratto da: <em><a href="http://www.amazon.it/How-Would-Move-Mount-Fuji/dp/0316778494/ref=sr_1_1?ie=UTF8&#038;qid=1320405734&#038;sr=8-1">How would you move mount Fuji?</a></em> di William Poundstone.</p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/11/joel-spolsky-on-hiring/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Error handling in C: una panoramica personale</title>
		<link>http://giustino.borzacchiello.it/2011/10/error-handling-in-c-una-panoramica-personale/</link>
		<comments>http://giustino.borzacchiello.it/2011/10/error-handling-in-c-una-panoramica-personale/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 20:57:43 +0000</pubDate>
		<dc:creator>JustB</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Eccezioni]]></category>
		<category><![CDATA[Error handling]]></category>

		<guid isPermaLink="false">http://giustino.borzacchiello.it/?p=570</guid>
		<description><![CDATA[Il C non fornisce un meccanismo standard per la gestione degli errori interno al linguaggio (come le eccezioni) quindi è compito del programmatore decidere come procedere. Le prime volte che ho programmato in C, pensavo di risolvere la questione facilmente, &#8230; <a href="http://giustino.borzacchiello.it/2011/10/error-handling-in-c-una-panoramica-personale/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Il C non fornisce un meccanismo standard per la gestione degli errori interno al linguaggio (come le eccezioni) quindi è compito del programmatore decidere come procedere.</p>
<p>Le prime volte che ho programmato in C, pensavo di risolvere la questione facilmente, semplicemente emulando le funzioni della libreria standard. Purtroppo mi sono dovuto scontrare con la dura realtà: le interfacce della libreria standard sono parecchio discordanti su come segnalare una situazione di errore.</p>
<p>Ad esempio <code>atoi</code> restituisce <code>0</code> se non riesce a convertire la stringa passata in ingresso, il che è strano, perché <code>0</code> è un elemento del dominio della funzione. Infatti il programma:</p>
<pre class="prettyprint">
//Esempio di output di atoi
//

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int main(void)
{
    const char uno[] = "uno";
    const char due[] = "2";
    const char zero[] = "0";

    int num1 = atoi(uno);
    int num2 = atoi(due);
    int num0 = atoi(zero);

    printf("atoi(\"uno\") vale %d\n", num1);
    printf("atoi(\"2\") vale %d\n", num2);
    printf("atoi(\"0\") vale %d\n", num0);

    return 0;
}
</pre>
<p>produrrà il seguente output:</p>
<pre class="prettyprint">
[justb@dellill]$ ./atoi.out 

atoi("uno") vale 0
atoi("2") vale 2
atoi("0") vale 0
</pre>
<p>Oppure le funzioni della famiglia <code>*alloc</code>, che restituiscono <code>NULL</code> in caso di errore ed un puntatore all&#8217;area di memoria allocata in caso di successo, oppure ancora <code>printf</code> che restituisce il numero di caratteri stampati in caso di successo ed un numero negativo in caso contrario.<br />
Insomma sembra che ogni funzione voglia dire la sua sull&#8217;argomento.</p>
<h2>Tabula rasa: una libreria da zero</h2>
<p>Sviluppare una libreria da zero porta quindi alcuni vantaggi.<br />
Uno di questi è la possibilità di creare delle interfacce coerenti che consentano di <strong>presumere</strong> la posizione dei parametri e i valori di ritorno delle funzioni, tanto per fare un esempio, oppure di gestire coerentemente le situazioni d&#8217;errore.</p>
<p>Facendo alcune ricerche ho notato che esistono due orientamenti principali per la gestione degli errori in C:</p>
<ul>
<li>Restituire lo stato dell&#8217;operazione, passando eventuali parametri di output via puntatore</li>
<li>Inserire in ogni metodo della libreria un parametro di output contenente lo stato dell&#8217;operazione</li>
</ul>
<h3>Restituire lo stato dell&#8217;operazione</h3>
<p>In questo modello, si creano interfacce che restituiscono sempre un booleano (oppure un intero), indicando l&#8217;esito dell&#8217;operazione, ad esempio:</p>
<pre class="prettyprint">
//Definizione di myFun
bool myFun(int InParam, int *OutParam);
</pre>
<pre class="prettyprint">
//Implementazione di myFun
bool myFun( int InParam, int *OutParam )
{
    //Se non ci sono problemi il valore di ritorno sarà true
    bool status = true;

    if( condizioniFavorevoli ) {
        *OutParam = InParam * 2;
    } else {
        //ERRORE! Computazione fallita!
        status = false;
    }

    return status;
}
</pre>
<p>La variabile <code>condizioniFavorevoli</code> rappresenta una possibile situazione di errore in cui potrebbe incorrere <code>myFun</code>, mentre il parametro di uscita <code>OutParam</code> è passato tramite puntatore.<br />
Un possibile utilizzo di questa funzione potrebbe essere il seguente:</p>
<pre class="prettyprint">
/* Test per myFun
 * Compilare con -DFALSE per simulare una condizione di errore
 */
#include &lt;stdio.h&gt;
#include &lt;stdbool.h&gt; //C99
#include &lt;stdlib.h&gt;

#ifndef FALSE
bool condizioniFavorevoli = true;
#else
bool condizioniFavorevoli = false;
#endif

//Definizione di myFun
...

int main(void)
{
    bool status;
    int result;

    status = myFun( 3, &amp;result );
    if( !status ) {
        fprintf(stderr, "Errore in myFun\n");
        exit(1);
    }

    printf("Il risultato di myFun: %d\n", result);

    return 0;
}

//Implementazione di myFun
...
</pre>
<p>Un possibile miglioramento sul tema, come consigliato in <a href="http://stackoverflow.com/questions/385975/error-handling-in-c-code/386001#386001">questa risposta su StackOverflow</a> è quello di creare un tipo che contenga tutti i possibili errori utilizzati nella libreria, ed utilizzarlo al posto del semplice booleano, rendendo il codice più espressivo. Ad esempio:</p>
<pre class="prettyprint">
/*
 * errors.h
 *
 * */

#ifndef STATUS_ERROR
#define STATUS_ERROR

typedef enum
{
    SUCCESS,
    E_DIVIDE_ZERO,
    E_PASS_ONE
} STATUS;

#endif
</pre>
<pre class="prettyprint">
#include "errors.h"

STATUS print_divide_ten(int input)
{
    STATUS ReturnStatus;

    ReturnStatus = SUCCESS;

    if( input == 0 ) {
        ReturnStatus = E_DIVIDE_ZERO;
    } else if( input == 1 ) {
        ReturnStatus = E_PASS_ONE;
    } else {
        printf("Faccio la divisione %d\n", 10 / input);
    }

    return ReturnStatus;
}
</pre>
<p>L&#8217;utilizzo è praticamente lo stesso del caso precedente, solo che in questo caso è possibile decidere come comportarsi a seconda del valore di ritorno.<br />
Aggiungendo una funzione che trasponga il codice di errore in un messaggio significativo per l&#8217;utente si ha a disposizione una buona infrastruttura per la gestione degli errori:</p>
<pre class="prettyprint">
void explain_error_code( STATUS code )
{
    switch(code)
    {
        case SUCCESS:
            printf("Tutto ok\n");
            break;
        case E_DIVIDE_ZERO:
            printf("È stata tentata una divisione per zero\n");
            break;
        case E_PASS_ONE:
            printf("Il valore uno non è accettato");
            break;
        default:
            printf("Status code sconosciuto\n");
            break;
    }
}
</pre>
<h3>Stato passato tramite puntatore</h3>
<p>L&#8217;altro modello di gestione degli errori consiste nell&#8217;utilizzare il valore di ritorno della funzione per un eventuale output, mentre lo stato è passato tramite un parametro della funzione.</p>
<p>La funzione di esempio si trasformerebbe nel modo seguente:</p>
<pre class="prettyprint">
int myFun2( int InParam, bool *Status )
{
    *Status = true;

    if( condizioniFavorevoli ) {
        return InParam * 2;
    } else {
        *Status = false;
    }

    return -1;
}
</pre>
<p>Mentre un possibile esempio di utilizzo sarebbe:</p>
<pre class="prettyprint">
int main(void)
{
    bool status;
    int result;

    result = myFun2( 3, &#038;status );
    if( !status ) {
        fprintf(stderr, "Errore in myFun\n");
        exit(1);
    }

    printf("Il risultato di myFun: %d\n", result);

    return 0;
}
</pre>
<p>Chiaramente anche in questo caso è possibile utilizzare una <code>struct</code> contenente le diverse tipologie di stati di ritorno da utilizzare nel programma chiamante.</p>
<h2>Considerazioni</h2>
<p>Ho letto commenti a favore e contro dell&#8217;uno e dell&#8217;altro metodo di gestione degli errori: c&#8217;è chi ritiene che l&#8217;output gestito tramite valore di ritorno sia più &#8220;naturale&#8221;, e chi invece sostiene che un eventuale situazione d&#8217;errore passi inosservata utilizzando un parametro di output.</p>
<p>Personalmente, ritengo che le due notazioni siano equivalenti in quanto, soprattutto in linguaggi come il C, il controllo degli errori debba essere ai limiti del maniacale.<br />
Piuttosto credo sia meglio concentrarsi sulla <strong>coerenza delle interfacce</strong>: ovvero scegliere un metodo di gestione degli errori per la libreria in sviluppo, e mantenere sempre lo stesso stile. In questo modo si facilita il lavoro all&#8217;utilizzatore finale della libreria, che può contare su un comportamento quantomeno prevedibile degli strumenti che ha a disposizione.</p>
<h2>Bonus: implementare le eccezioni in C</h2>
<p>Facendo ricerche su questo argomento ho appreso che è possibile simulare la gestione delle eccezioni in C utilizzando la coppia di funzioni <code>setjmp/longjmp</code>.</p>
<p>Una prima implementazione è possibile trovarla sul <a href="http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html">sito di Francesco Nidito</a>, mentre per una trattazione più approfondita è possibile consultare <a href="http://www.amazon.com/Interfaces-Implementations-Techniques-Creating-Reusable/dp/0201498413">C Interfaces and Implementations: Techniques for Creating Reusable Software</a>.</p>
<p>Per un altro esempio d&#8217;uso delle funzioni <code>setjmp/longjmp</code>, potete consultare <a href="http://rejex.wordpress.com/2011/10/24/un-piccolo-esempio-di-generatore-in-cpp/">questo post</a> dell&#8217;amico Gian Paolo &#8220;JP&#8221; Ghilardi</p>
]]></content:encoded>
			<wfw:commentRss>http://giustino.borzacchiello.it/2011/10/error-handling-in-c-una-panoramica-personale/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://stats.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->

