﻿<?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>Andrea Pra Levis</title>
	<atom:link href="http://pralevis.com/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://pralevis.com/wordpress</link>
	<description>Informatica e tutto quello che ci gira intorno</description>
	<lastBuildDate>Fri, 29 Mar 2013 15:12:15 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>WEBGL FOR DUMMIES [PARTE QUINDICI]</title>
		<link>http://pralevis.com/wordpress/?p=936</link>
		<comments>http://pralevis.com/wordpress/?p=936#comments</comments>
		<pubDate>Thu, 28 Mar 2013 21:55:39 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Webgl]]></category>
		<category><![CDATA[cerchio]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[webgl]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=936</guid>
		<description><![CDATA[in questa guida verrò presentato il metodo base per creare un cerchio con WEBGL, il famoso modulo javascript per la grafica 3D]]></description>
				<content:encoded><![CDATA[<p>Salve a todos!<br />
A causa di impegni lavorativi ho dovuto congelare per un bel pò l&#8217;attività del blog, cosa che mi ha addolorato non poco; ultimamente, spinto da un paio di mail sull&#8217;argomento, ho deciso di provare ancora a scrivere articoli, non potendo però garantire una cadenza regolare.</p>
<p>Questa quindicesima lezione sarà molto semplice e parlerà di un argomento assai per certi tratti banale rispetto ai predecessori ma che mi è stato portato all&#8217;attenzione tempo fa.</p>
<p><em><strong>&#8220;Come possiamo in WEBGL disegnare un cerchio?&#8221;</strong></em></p>
<p>Non esistono funzioni primitive per eseguire tale operazione ma con le nostre conoscenze attuali possiamo ottenere comunque un risultato sufficientemente discreto senza appesantire troppo lo script.</p>
<p><span id="more-936"></span><br />
L&#8217;idea è elementare quanto efficace: visto che il cerchio è composto da un insieme infinito di punti che ovviamente non possiamo disegnare tutti, cercheremo di &#8220;approssimare&#8221; tale figura come un insieme di n triangoli, dove n è un numero piuttosto grande!Come possiamo fare ciò? Passeremo il raggio del cerchio che ci interessa e questo fatidico numero n ad una funzione, MakeCircle(&#8230;), che calcolerà n punti equidistanti posti sul cerchio e con essi realizzerà n triangoli che darà in pasto alla solita funzione DrawScene. E&#8217; una soluzione rozza ma i primi videgiochi usavano trucchi simili per riprodurre delle superfici curve senza rovinare troppo le prestazioni.Mostriamo un piccolo disegno esemplificativo:</p>
<p><a href="http://pralevis.com/wordpress/wp-content/uploads/aa1.png"><img src="http://pralevis.com/wordpress/wp-content/uploads/aa1-300x131.png" alt="" title="aa" width="300" height="131" class="aligncenter size-medium wp-image-954" /></a></p>
<p>Già con n = 6 possiamo notare una certa approssimazione alla forma di un cerchio: con un valore di n adeguato alla dimensioni del raggio, riusciremo ad ottenere una forma abbastanza curvilinea da poterla considerare accettabile.Vediamo la funzione makeCircle:</p>
<blockquote><p>
function makeCircle(rag,punti,color){<br />
raggio=rag;<br />
num_punti = punti;<br />
vertices = [];<br />
colors = [];<br />
var alfa = 0;<br />
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);</p>
<p>for (i=0;i<num_punti;i++)<br />
{<br />
vertices= vertices.concat([ raggio * Math.cos(alfa*Math.PI/180), raggio * Math.sin(alfa*Math.PI/180) , 0.0]);<br />
 alfa += 360 / num_punti ;<br />
vertices= vertices.concat([ raggio * Math.cos(alfa*Math.PI/180), raggio * Math.sin(alfa*Math.PI/180) , 0.0]);<br />
vertices= vertices.concat([    0.0, 0.0, 0.0]);<br />
}<br />
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);<br />
triangleVertexPositionBuffer.itemSize = 3;<br />
triangleVertexPositionBuffer.numItems = num_punti * 3;<br />
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);</p>
<p>for (i=0;i<num_punti * 3;i++) colors=colors.concat(color);<br />
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);}</p></blockquote>
<p>Le prime righe non sono nient&#8217;altro che inizializzazioni e assegnazioni che ci serviranno durante lo script.<br />
La prima cosa da notare è la variabile alfa: esso rappresenta l&#8217;ampiezza dell&#8217;angolo al centro del cerchio compreso tra i due lati uguali di ogni triangolo.<br />
Sceglieremo n punti sul cerchio che siano tutti equidistanti dal loro precedente e da quello che segue, in modo tale che abbiamo tutti triangolo uguali fra loro.<br />
Questo ci permetterà di calcolare con facilità i punti e, a sua volta, di avere tutti i vertici necessari per i nostre forme primitive.</p>
<blockquote><p>for (i=0;i<num_punti;i++)<br />
{<br />
vertices= vertices.concat([raggio * Math.cos(alfa), raggio * Math.sin(alfa) , 0.0]);<br />
 alfa += 2 *Math.PI  / num_punti ;<br />
vertices= vertices.concat([raggio * Math.cos(alfa), raggio * Math.sin(alfa) , 0.0]);<br />
vertices= vertices.concat([0.0, 0.0, 0.0]);<br />
}</p></blockquote>
<p>In questa istruzione, ad ogni ciclo dell&#8217;istruzione for inseriremo i tre vertici per disegnare un triangolo; essendo un esempio semplificato , notiamo che la componente z vale sempre 0 ( lavoriamo solo su in piano), inoltre uno dei punti è sempre il centro del cerchio. L&#8217;angolo alfa, che viene incrementato ad ogni giro per poter trovare il punto successivo sull&#8217;arco, è calcolato in radianti visto che le funzioni sin e cos non lavorano direttamente con i gradi.</p>
<blockquote><p>
for (i=0;i&lt;num_punti * 3;i++) colors=colors.concat(color);
</p></blockquote>
<p>Questo ciclo for la usiamo per riempire l&#8217;array dei colori: poichè il numero dei punti in totale è pari al triplo dei numero dei triangoli, concateneremo fra loro 3 * n array color.</p>
<p>Aumentando il numero n , si potrà notare quanto il risultato si approssimi sempre di più al tanto agognato cerchio; per dimostrare ciò, nell&#8217;esempio ho aggiunto tramite la libreria JQuery delle slider con cui variare i tre parametri di input della makeCircle(), cioè il colore, il raggio ed il numero dei punti.<br />
In questo modo potremo notare che con un raggio pari a 1, già un n = 35 il risultato è ottimo. Provate l&#8217;esempio per credere(<a href="http://lab.pralevis.com/Documents/WebGL/Examples/lesson13.html">link</a>)!</p>
<p>Per potere vedere scaricare il codice che è stato presentato nell&#8217;articolo ( lo trovate come lesson13 e potete scaricare il pacchetto completo lesson13.zip), collegarsi al solito repository <a href="http://lab.pralevis.com/documenti.php?categories=webgl">Lab </a>.</p>
<p>Grazie per l’attenzione,</p>
<p>Andrea</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=936</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REALIZZARE UN SEMPLICE CAPTCHA IN PHP</title>
		<link>http://pralevis.com/wordpress/?p=914</link>
		<comments>http://pralevis.com/wordpress/?p=914#comments</comments>
		<pubDate>Tue, 03 Apr 2012 16:42:20 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Php Trick]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[sicurezza]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=914</guid>
		<description><![CDATA[articolo su come realizzare un controllo anti bot creando un 'immagine captcha con Php.]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
oggi mostreremo una tecnica di sicurezza base per creare un proprio strumento captcha per controllare se l&#8217;utente che sta inserendo i dati è un umano oppure un bot. Tipico test CAPTCHA è quello in cui si richiede di scrivere quali siano le lettere o numeri presenti in un&#8217;immagine pre-costruita.<br />
Tale meccanismo è utilizzato per lo più per proteggere il sito da attacchi di forza bruta e per evitare che programmi bot spammino troppi messaggi automatici.</p>
<p><strong>Obiettivo</strong>: realizzare un semplice form con un test captcha per aumentare la sicurezza del sito ed individuare eventuali bot.</p>
<p>Il progetto si comporrà sostanzialmente di due file: nel primo , creeremo l&#8217;immagine captcha utilizzando le funzioni base php per gestire le immagini ( <em>captcha.php</em>), la seconda conterrà il form con dentro l&#8217;immagine captcha e farà il controllo che il codice immesso sia corretto (<em>form.php</em>).</p>
<p><span id="more-914"></span><br />
<strong>Il Captcha</strong><br />
Ci sono svariati criteri per creare una immagine di test sicura; noi mostremo un metodo semplice per creare una piuttosto randomica; nel nostro esempio tale immagine conterrà infatti una semplice stringa alfanumerica casuale: a sua volta tale stringa sarà &#8220;colorata&#8221; con due colori RGB diversi e noi chiederemo che venga inserito solo una sequenza  di un data colore. Per ulteriore scrupolo anche la dimensione della sequenza giusta ha una lunghezza che spazia in un dato range.<br />
Iniziamo a vedere il codice:</p>
<p>&nbsp;</p>
<p>&lt;?php<br />
session_start();<br />
$my_img = imagecreate( 150, 40 );<br />
$background = imagecolorallocate( $my_img, 255, 255, 255 );<br />
$text_colour_correct = imagecolorallocate( $my_img, 0,255, 0 );<br />
$text_colour_wrong = imagecolorallocate( $my_img, 255,0,0 );</p>
<p>&#8230;</p>
<p>?&gt;</p>
<p>Prima di tutto abilitiamo le sessioni in php  visto che dovremmo salvare da qualche parte il codice captcha da controllare.</p>
<p><em>imagecreate </em>ci permette di creare ed inizializzare le dimensioni della nostra immagine di controllo ( per il momento un 150&#215;40 basterà).Le tre variabili successive saranno i tre diversi tipi di colori che useremo nella nostra applicazione:</p>
<p>1- il colore di sfondo (bianco)</p>
<p>2- il colore del testo corretto che si dovrà inserire ( scegliamo un verde)</p>
<p>3- il colore del testo sbagliato che non dovremo assolutamente inserire ( rosso)</p>
<p><code><br />
</code></p>
<p><code></code>&#8230;</p>
<p>$length_total_string=10;<br />
$length_correct_string=mt_rand(4,8);<br />
$alphas = range(&#8216;A&#8217;, &#8216;Z&#8217;);<br />
$numeric=range(0,9);<br />
$alphanumeric=array_merge($alphas,$numeric);<br />
$string_correct=&#8221;";<br />
$string_wrong=&#8221;";<br />
$colors= array();</p>
<p>for($i=0;$i&lt;$length_total_string;$i++)<br />
{<br />
if($i&lt;=$length_correct_string)<br />
$string_correct.=$alphanumeric[mt_rand(0,35)];<br />
else<br />
$string_wrong.=$alphanumeric[mt_rand(0,35)];<br />
}</p>
<p>&#8230;</p>
<p>&nbsp;</p>
<p>Questo rappresenta il cuore dello script: definiamo con $length_total_string la lunghezza della stringa totale ,mentre con $length_correct_string scegliamo randomicamente la lunghezza della sequenza corretta , che può spaziare tra 4 e 8 e dovrà ovviamente essere inferiore al valore di  $length_total_string.</p>
<p>Successivamente creiamo l&#8217; array $alphanumeric contenente sia caratteri alfabetici che numeri , in modo tale che le sequenze che verranno generate siano le più variegate possibili . Nel ciclo for infine creiamo le due sequenze alfanumeriche: prima riempiamo la stringa corretta fino alla lunghezza desiderata, poi inseriamo valori in quella sbagliata.</p>
<p>&nbsp;</p>
<p>&#8230;</p>
<p>if(mt_rand(0,1)==1)<br />
{<br />
imagestring( $my_img,5,3,10,$string_correct,$text_colour_correct );<br />
imagestring( $my_img,5,12+9*$length_correct_string,10, $string_wrong,$text_colour_wrong );<br />
}<br />
else<br />
{<br />
imagestring( $my_img,5,3, 10,$string_wrong,$text_colour_wrong );<br />
imagestring( $my_img,5,9*($length_total_string-$length_correct_string)-6,10,$string_correct,$text_colour_correct );<br />
}<br />
$_SESSION['captcha_code']=$string_correct;<br />
header( &#8220;Content-type: image/png&#8221; );<br />
imagepng( $my_img );</p>
<p>imagecolordeallocate( $text_colour_correct);<br />
imagecolordeallocate( $text_colour_wrong );<br />
imagecolordeallocate( $background );<br />
imagedestroy( $my_img );</p>
<p>?&gt;</p>
<p>&nbsp;</p>
<p><em>imagestring </em>è la funzione adibita a scrivere il testo dentro l&#8217;immagine: useremo queste per scrivere sull&#8217;imagine sia il testo corretto che  quello erroneo. Per evitare che la posizione delle stringhe non sia sempre uguale, anche l&#8217;ordine di scrittura è randomico : in tale modo non si può prevedere quale delle due stringhe ( corretta o falsa ) sarà la prima partendo da sinistra.  Il valore poi da controllare sarà salvato nella variabile di sessione $_SESSION['captcha_code'] così da permettere il controllo successivamente.</p>
<p>Le ultime funzioni servono per deallocare le variabili usate e per gestire la pagina php come un &#8216;immagine di tipo png.Terminato ciò, finalmente possiediamo la nostra immagine captcha che salvaremo nel file <em>catpcha.php.</em></p>
<p>&nbsp;</p>
<p><strong>Il Form ed il Controllo</strong></p>
<p>Ultima fase del nostro script sarà quello di creare il form per l&#8217;inserimento dei dati e il controllo del codice di sicurezza; apriamo un altro file php ed incolliamo il codice seguente:<br />
<code><br />
&lt;?php<br />
session_start();</code></p>
<p>if(isset($_SESSION['captcha_code']) &amp;&amp; isset($_POST['code']) &amp;&amp; $_POST['code']!=&#8221;" &amp;&amp; isset($_POST['user']) &amp;&amp; $_POST['user']!=&#8221;")<br />
{</p>
<p><strong>if (strtolower($_SESSION['captcha_code']) == strtolower($_POST['code']))</strong><br />
echo &#8220;Benvenuto &#8220;.$_POST['user'];<br />
else<br />
echo &#8220;Benvenuto Bot&#8221;;</p>
<p>}<br />
?&gt;</p>
<p>&lt;form method=&#8221;post&#8221;&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;&lt;td&gt;User&lt;/td&gt;<br />
&lt;td&gt;&lt;input type=&#8221;text&#8221; id=&#8221;user&#8221; name=&#8221;user&#8221; /&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt; Captcha: Inserire la stringa verde&lt;br&gt; che vedi nell&#8217;immagine a fianco&lt;/td&gt;<br />
&lt;td&gt;&lt;img src=&#8221;<strong>captcha.php</strong>&#8221; /&gt;&lt;br&gt;&lt;input type=&#8221;text&#8221; id=&#8221;code&#8221; name=&#8221;code&#8221; /&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;input type=&#8221;submit&#8221; value=&#8221;Invia&#8221; /&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;</p>
<p>&nbsp;</p>
<p>Notiamo la semplicità del codice: il form è composto da due campi input; nel primo l&#8217;utente può inserire una stringa per identificarlo, mentre nella seconda comparirà la nostra immagine di captcha ed un campo da riempire con la stringa verde che comparirà. Per richiamare la nostra immagina captcha è bastato mettere come source il nome stesso del file php  ( tanto abbiamo inserito la funzione che obbliga il server a trattarla come un&#8217;immagine png). Cliccando su Invia, verrà creata una richiesta POST indirizzata alla medesima pagina di prova.</p>
<p>Infine, verrà controllato che il valore inserito dall&#8217;utente sia lo stesso salvato precedentemente nell&#8217;array di Sessione mentre creavamo l&#8217;immagine. In caso positivo, ci saluterà con il nome da noi inserito, viceversa il codice di sicurezza ci definirà bot.</p>
<p><a href="http://pralevis.com/wordpress/wp-content/uploads/Catturad.png"><img class="aligncenter size-medium wp-image-920" title="Catturad" src="http://pralevis.com/wordpress/wp-content/uploads/Catturad-300x124.png" alt="" width="300" height="124" /></a></p>
<p>Il codice è liberamente scaricabile nel solito repositoy <a href="http://lab.pralevis.com/documenti.php"> Lab</a> oppure cliccando direttamente sul link sottostante. Se avete dubbi o perplessità, non esitate a chiedere.<br />
Grazie per il tempo concessomi, alla prossima!</p>
<p><a href="http://lab.pralevis.com/Documents/PHP/Captcha/captcha.zip">Form Login per Joomla</a></p>
<p>Apl</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=914</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REALIZZARE UN SEMPLICE FORM LOGIN IN PHP PER JOOMLA</title>
		<link>http://pralevis.com/wordpress/?p=891</link>
		<comments>http://pralevis.com/wordpress/?p=891#comments</comments>
		<pubDate>Mon, 12 Mar 2012 12:38:42 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Php Trick]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pralevis]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=891</guid>
		<description><![CDATA[semplice tutorial su come realizzare un form php di login per Joomla]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
giorni fa mi ero scontrato con la necessità di realizzare un form per il login diverso da quello principale di Joomla customizzandolo per un dispositivo mobile: una possibile soluzione poteva essere quella di creare nuovo foglio di stile css da aggiungere solo nel caso in cui la navigazione sul sito avvenisse tramite smartphone.<br />
Optai invece per creare un nuovo form adibito solo a ciò, sia perchè non mi piace molto lavorare con i fogli di stile, sia perchè era l&#8217;occasione perfetta per iniziare a scavare un pò nella logica del noto Joomla <img src='http://pralevis.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Obiettivo: <b>realizzare un semplice form compatibile con logica Joomla che analizzi le credenziali immesse dall&#8217;utente e che permetta il salvataggio dei dati utente nella sessione.<br />
</b></p>
<p><span id="more-891"></span></p>
<p>La versione di Joomla che attualmente utilizzeremo è la 1.7 ma tale script è compatibile anche con le versioni successive.</p>
<p>Il Primo passo è quello di realizzare il form: poichè è un operazione assai standard che ho più volte esplicato su questo blog, mi limiterò a copia e incollare il codice.</p>
<p>&nbsp;</p>
<blockquote><p>&lt;form method=&#8221;post&#8221; action=&#8221;"&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Username:&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&lt;tr&gt;&lt;td&gt;&lt;input type=&#8221;text&#8221; name=&#8221;username&#8221; id=&#8221;username&#8221; /&gt; &lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Password:&lt;/b&gt;&lt;/td&gt;&lt;tr&gt;&lt;tr&gt;&lt;td&gt;&lt;input type=&#8221;password&#8221; name=&#8221;password&#8221; id=&#8221;password&#8221; /&gt; &lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt;&lt;input type=&#8221;submit&#8221; value=&#8221;Login&#8221; /&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;</p>
<p>&lt;/form&gt;</p></blockquote>
<p>L&#8217;unici di considerazioni che voglio fare è che abbiam deciso di utilizzare il metodo POST per il passaggio delle informazioni, inoltre l&#8217;attributo action del form è stato volutamente lasciato vuoto in modo tale che venga richiamata la pagina corrente ( metteremo infatti la logica php nella stessa pagine del form ).</p>
<p>&nbsp;</p>
<p>Sempre nella medesima pagina, andiamo all&#8217;inizio ed inseriamo questo codice php :</p>
<p></p>
<blockquote><p>&lt;?php<br />
define( &#8216;_JEXEC&#8217;, 1 );<br />
define(&#8216;JPATH_BASE&#8217;, dirname(__FILE__) );<br />
define( &#8216;DS&#8217;, DIRECTORY_SEPARATOR );</p>
<p>require_once ( JPATH_BASE .DS.&#8217;includes&#8217;.DS.&#8217;defines.php&#8217; );<br />
require_once ( JPATH_BASE .DS.&#8217;includes&#8217;.DS.&#8217;framework.php&#8217; );<br />
require_once (JPATH_BASE .DS. &#8216;libraries&#8217; .DS. &#8216;joomla&#8217;. DS. &#8216;user&#8217; .DS. &#8216;authentication.php&#8217;);</p>
<p>$mainframe =&amp; JFactory::getApplication(&#8216;site&#8217;);<br />
$mainframe-&gt;initialise();<br />
&#8230;</p></blockquote>
<p>
Questo è il pezzo di codice fondamentale per inizializzare una pagina php in Joomla, inoltre notiamo le tre chiamate require_once necessarie per sfruttare le librerie base e le funzioni da utilizzare per l&#8217;autenticazione.<br />
Infine possiamo inserire lo script per il controllo delle credenziali e l&#8217;inizializzazione delle variabili di sessione:<br />
</p>
<blockquote><p>
&#8230;<br />
if(isset($_POST['username']) &#038;&#038; isset($_POST['password']))<br />
{</p>
<p>$credentials = array(<br />
    &#8216;username&#8217; => $_POST['username'],<br />
    &#8216;password&#8217; => $_POST['password']);</p>
<p>$options = array();<br />
$authenticate = JAuthentication::getInstance();<br />
$response   = $authenticate->authenticate($credentials, $options);<br />
if ($response->status === JAUTHENTICATE_STATUS_SUCCESS)<br />
  {<br />
   $user = JUser::getInstance($_POST['username']);<br />
   $_SESSION['__default']['user']=$user;<br />
  }<br />
else<br />
 echo &#8220;Username e/o Password sbagliati&#8221;;<br />
?></p>
<p>}
</p></blockquote>
<p>
Il codice è molto semplice e si commenta quasi da solo: nel primo IF controlliamo che l&#8217;utente abbia inserito qualche valore nelle due textbox.Superato questo, viene creato l&#8217;array con le credenziali e viene dato in pasto ad un metodo della classe Joomla  $authenticate: controllando lo stato della classe che ci ritornerà, potremmo sapere se le credenziali sono state riconosciute oppure no.<br />
In caso di riconoscimento positivo, sarà sufficiente recuperare la classe JUser grazie allo username e salvarla dentro una particolare variabile dell&#8217;Array $_SESSION: d&#8217;ora in poi il nostro utente sarà correttamente loggato e potrà navigare sul nostro sito Joomla senza alcun problema.</p>
<p>Il codice è liberamente scaricabile nel solito repositoy <a href="http://lab.pralevis.com/documenti.php"> Lab</a> oppure cliccando direttamente sul link sottostante. Se avete dubbi o perplessità, non esitate a chiedere.<br />
Grazie per il tempo concessomi, alla prossima!</p>
<p><a href="http://lab.pralevis.com/Documents/PHP/Login/login_joomla.zip">Form Login per Joomla</a></p>
<p>Apl</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=891</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RILASCIATA LA VERSIONE NEWZREADER (v 1.4)</title>
		<link>http://pralevis.com/wordpress/?p=886</link>
		<comments>http://pralevis.com/wordpress/?p=886#comments</comments>
		<pubDate>Sat, 21 Jan 2012 11:50:49 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[newzreader]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[Rss]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=886</guid>
		<description><![CDATA[news sul rilascio dell'ultima versione di NewzReader per Android ( lettore news per Android e Twitter e Google Reader)]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
con oggi rilasciamo la versione 1.4 del lettore Rss e twitter NewzReader.Ecco l&#8217;elenco delle modifiche:<br />
-Risolto qualche bug riguardante il caricamento dei backup e , in generale, i servizi online.<br />
-semplificata la gestioni dei canali: nella pagina principale, tenendo premuto su un canale, comparirà un menu a tendina con le azioni principali ( Synchronize = importa newz, Modify = Modifica canale, Empty = svuota canale, Return = non fa nulla).<br />
- Nelle Opzioni Generali, ora è possibile spostare il database delle newz dalla memoria locale all&#8217;sd card e viceversa ( per risparmiare spazio sul telefono).<br />
-Inserita finalmente un&#8217;icona per l&#8217;applicazione.<br />
NewzReader versione 1.4 è disponibile nella sezione <a href="http://newzreader.pralevis.com/download">Download</a>; se avete dubbi e/o richiesta, non esistate a domandare, grazie.</p>
<p>Andrea</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=886</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PREVISIONI DEL TEMPO SU ANDROID GRAZIE A YAHOO</title>
		<link>http://pralevis.com/wordpress/?p=865</link>
		<comments>http://pralevis.com/wordpress/?p=865#comments</comments>
		<pubDate>Mon, 02 Jan 2012 15:07:37 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[meteo]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[tempo]]></category>
		<category><![CDATA[weather]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=865</guid>
		<description><![CDATA[Articolo che mostra i concetti base per creare un applicazione Android che mostra le previsioni del tempo tramite le Api di Yahoo]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
avevo precedentemente annunciato che avrei postato una lezione sul Bluetooth di Android: purtroppo , causa alcuni problemi riscontrati , ho deciso di trascurare tale guida a data da destinarsi. Nell&#8217;articolo di oggi invece illustrerò un metodo semplice per ottnere previsioni del tempo su Android grazie alle <a href="http://developer.yahoo.com/weather/">API di Yahoo</a> e presenterò una mia applicazione basata su ciò.</p>
<p>Obiettivo: realizzare un app meteo che mostri le condizioni del tempo attuale e future di una data località passata come input.</p>
<p><span id="more-865"></span><br />
Ovviamente tale oggetto necessiterà di una connessione su Internet per poter prelevare i vari dati sul meteo da mostrare all&#8217;utente; inoltre non viene richiesto il salvataggio di alcun dato ( niente Database SQLite o salvataggio in sharedPreferences o altre strutture dati), per cui la struttura di tale progettto sarà davvero semplice.</p>
<p>A grandi linee i passaggi per ottenere tali informazioni sono assai semplici: ci basterà creare un HttpClient,passarli l&#8217;url con dentro l&#8217;informazione sulla località , eseguire una richiesta ed elaborare i dati che il server di Yahoo ci invierà come risposta. Di sotto riporto la funzione solitamente usata per lo scopo:</p>
<p><code><br />
public InputStream getJSONData(String url){<br />
DefaultHttpClient httpClient = new DefaultHttpClient();<br />
URI uri;<br />
InputStream data = null;<br />
try {<br />
uri = new URI(url);<br />
HttpGet method = new HttpGet(uri);<br />
HttpResponse response = httpClient.execute(method);<br />
data = response.getEntity().getContent();<br />
} catch (Exception e) {<br />
e.printStackTrace();<br />
}</code></p>
<p>return data;<br />
}</p>
<p>Se siete già andati a leggere il foglio delle specifiche delle APi di Yahoo, l&#8217;indirizzo a cui fare la richiesta è:</p>
<blockquote><p>http://weather.yahooapis.com/forecastjson?w=&#8217;woeid_number&#8217;&amp;u=c</p></blockquote>
<p>il parametro GET &#8216;u&#8217; serve solo per decidere in che formato ricevere la temperatura ( Farenheit o Celsius, al momento preferisco la seconda opzione).<br />
Notiamo nell&#8217;indirizzo la parola chiave forecastjson: grazio a ciò riceveremo i dati secondo la Standard <a href="http://it.wikipedia.org/wiki/JSON">Json</a>, inizialmente nato per Javascript , ora è praticamente usato come sostituto dell&#8217;XML.<br />
Ed il parametro woied_number? Esso è un identificatore unico usato per definire la località.</p>
<p>Il problema attualmente da risolvere è calcolare tale numero in relazione alla località inserita dall&#8217;utente.<br />
Uno dei possibili metodi è utilizzare una seconda API di Yahoo, che ci restituirà il woied di una data località prendendo come input una stringa identificativa ( che può essere il CAP del luogo, il nome della città, l&#8217;indirizzo). Questo rallentà un pò l&#8217;applicazione ma la maggior parte delle volte il servizio riconoscerà il luogo da noi descritto.Riportiamo l&#8217;url della seconda API:</p>
<blockquote><p>http://where.yahooapis.com/geocode?location=&#8217;stringa&#8217;&amp;flags=J</p></blockquote>
<p>stringa dovrà contenere l&#8217;indirizzo, il cap o il nome della città di cui vogliamo sapere il woeid. Ovviamente è possibile ricevere più di un risultato se la località non è abbastanza definita.<br />
flag è un semplice parametro per definire la struttura della risposta, è valorizzata a J perchè trovavo più comodo farmi restituire i dati in formato JSON ma è sempre possibile lavorare con gli XML.<br />
Ci sono svariate soluzioni per gestire i dati in formato JSON, io ad esempio ho scelto una vecchia release della libreria <a href="http://code.google.com/p/google-gson/">google-gson</a> perchè l&#8217;avevo precedentemente usata per un altro progetto ma siete liberi di sfruttare qualunque tipo di script.<br />
Gli strumenti sono tutti pronti, come esempio di una possibile applicazione basata sul processo appena descritto, posterà APL Weather: la struttura è a dir poco banale, una semplice editText dove inserire la località ed un pulsante per attivare la ricerca.<br />
Esso genererà una ListView con i risultati ottenuti, cliccando sopra uno di essi verrà generata la seconda richiesta per le condizioni climatiche, che verrano a loro volta inseriti in una Lista e mostrati all&#8217;utente.Riportiamo alcune screenshot:</p>
<p><a href="http://pralevis.com/wordpress/wp-content/uploads/weather1.png"><img class="aligncenter size-medium wp-image-869" title="weather1" src="http://pralevis.com/wordpress/wp-content/uploads/weather1-194x300.png" alt="" width="194" height="300" /></a><a href="http://pralevis.com/wordpress/wp-content/uploads/weather2.png"><img class="aligncenter size-medium wp-image-870" title="weather2" src="http://pralevis.com/wordpress/wp-content/uploads/weather2-197x300.png" alt="" width="197" height="300" /></a><a href="http://pralevis.com/wordpress/wp-content/uploads/weather3.png"><img class="aligncenter size-medium wp-image-871" title="weather3" src="http://pralevis.com/wordpress/wp-content/uploads/weather3-194x300.png" alt="" width="194" height="300" /></a></p>
<p>Potete scaricare l&#8217;applicazione meteo direttamente cliccando sul <a href="http://lab.pralevis.com/Documents/Android/Apl_Weather/Apl_Weather.apk">link</a> seguente o collegandovi al solito repository <a href="http://lab.pralevis.com/documenti.php?categories=android">Lab</a>.</p>
<p>Grazie per l’attenzione,</p>
<p>Andrea</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=865</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WEBGL FOR DUMMIES [PARTE QUATTORDICI]</title>
		<link>http://pralevis.com/wordpress/?p=844</link>
		<comments>http://pralevis.com/wordpress/?p=844#comments</comments>
		<pubDate>Fri, 23 Dec 2011 14:14:30 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Webgl]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[blender]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[webgl]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=844</guid>
		<description><![CDATA[Salve a tutti, in questa lezione proporremo un nuovo metodo per la gestione dei modelli dinamici; inoltre presenteremo un nuovo esempio di ambientazione 3D realizzabile tramite  gli script javascript che rilasciamo di volta in volta ( oltre ad aver finalmente fatto un pò di pulizia della parti obsolete del codice che tanto male non fa [...]]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
in questa lezione proporremo un nuovo metodo per la gestione dei modelli dinamici; inoltre presenteremo un nuovo esempio di ambientazione 3D realizzabile tramite  gli script javascript che rilasciamo di volta in volta ( oltre ad aver finalmente fatto un pò di pulizia della parti obsolete del codice che tanto male non fa <img src='http://pralevis.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p>Prima di tutto analizziamo la questione dell&#8217;animazione;<br />
<span id="more-844"></span><br />
 due lezioni fa avevamo proposto un metodo piuttosto grezzo per dare l&#8217;illusione del movimento, cioè quello di gestire staticamente il movimento come una sequenza di foto dello stesso oggetto leggermente spostato da un frame all&#8217;altro. Il trucchetto è piuttosto oneroso e poco dinamico ma è sicuramente la soluzione più immediata e facile da implementare con gli strumenti che avevamo. L&#8217;illusione si creava ma l&#8217;array javascript che definivamo in <em>InitBuffer</em>() era talmente grande che tutta l&#8217;applicazione risultava lentissima e impiegava uno tempo di inizializzazione più che proibitivo.</p>
<p>In questa lezione rilasceremo una classe che in maniera velata si comporta nel medesimo modo ma, sfruttando blender e la velocità del parsing di Javascript, renderà il gioco Webgl piuttosto veloce ( almeno se paragonato al precedente esempio).</p>
<p>Mostriamo ora i passaggi base per inserire una classe dinamica.</p>
<p>Prendiamo l&#8217;ultimo esempio scaricabile dalla solita pagina ed apriamo il file<em> lesson12.html</em>.<br />
Prima di tutto cerchiamo la funzione <em>InitBuffer()</em>  che rappresenta la nostra fase di inizializzazione: subito prima notiamo la definizione di una variabile:</p>
<blockquote><p>var baule;</p></blockquote>
<p>Esso rappresenterà il nostro oggetto dinamico, definito fuori dallo scope della funzione per una questione di visibilità.<br />
Poi entriamo nella funzione <em>InitBuffer</em>() e individuiamo questo codice :</p>
<blockquote><p>baule=new DinObjF();<br />
baule.LoadDinObjF(&#8220;baule_apertura&#8221;,20,1,&#8221;apertura&#8221;);<br />
baule.LoadDinObjF(&#8220;baule_chiusura&#8221;,20,1,&#8221;chiusura&#8221;);</p></blockquote>
<p><em>DinObjF </em>è la nuova classe a nostra disposizione: notiamo che non ha bisogno di alcun argomento ( indice del fatto che la fase di inizializzazione dell&#8217;oggetto è assai limitato).<br />
Successivamente viene chiamata la funzione <em>LoadDinObjF </em>: essa ha il compito di caricare l&#8217;insieme di file obj che rappresentanto l&#8217;azione da disegnare.<br />
Il primo argomento è l&#8217;inizio del nome dei file obj che la funzione dovrà parsare, il secondo è il numero di frame ( o fotogrammi se preferite ) che deve analizzare, il terzo rappresenta la latenza che può esistere tra un frame e l&#8217;altro ( maggiore è il numero, e più tempo trascorrerà tra un cambio di frame e l&#8217;altro ), il quarto è semplicemente il nome con cui indentificheremo l&#8217;azione.<br />
I nomi dei file obj dei frame devono seguire lo standard dell&#8217;export di blender 2.60 :</p>
<blockquote><p>nome_file_numero.obj dove numero ha il formato &#8220;000000&#8243;<br />
esempio:</p>
<p>baule_apertura_000001.obj<br />
baule_apertura_000002.obj</p>
<p>&#8230;</p></blockquote>
<p>Questa soluzione è stata scelta proprio per semplificare la vita degli sviluppatori: dopo aver creato un modello blender che esegue un azione, basterà esportare in formato obj ( selezionando l&#8217;opzione &#8220;esporta animazione&#8221; ) ; dopo che il programma avrà generato un insieme di file obj e mtl, basterà copiarli nella folder dell&#8217;applicazione e ci penserà la funzione <em>LoadDinObjF </em>a caricare.<br />
Ovviamente è possibile caricare più azioni dello stesso modello ( nel nostro esempio, c&#8217;è un animazione per aprire il baule ed una per chiuderlo ).</p>
<p>Ora passiamo all&#8217;ultima fase, quella di disegno; apriamo la funzione <em>DrawScene</em>() e individuiamo questa porzione di codice:</p>
<blockquote><p>if ( baule.stato == &#8220;chiuso&#8221; )<br />
baule.StaticDraw(&#8220;chiusura&#8221;,19);<br />
if ( baule.stato == &#8220;aperto&#8221; )<br />
baule.StaticDraw(&#8220;apertura&#8221;,19);<br />
if ( baule.stato == &#8220;apertura&#8221; )<br />
baule.Draw(&#8220;apertura&#8221;);<br />
if ( baule.stato == &#8220;chiusura&#8221; )<br />
baule.Draw(&#8220;chiusura&#8221;);</p></blockquote>
<p>la variabile <em>stato </em>è stata aggiunta per avere traccia dello stato del modello dinamico durante l&#8217;applicazione ( così sappiamo anche che animazione deve essere attivata).<br />
Come potete vedere sono due le possibile funzioni:</p>
<p>-Draw(ACTION)<br />
disegna l&#8217;azione action (cambiando automaticamente il frame ogni tot tempo proporzionale al numero di latenza). Il nome<br />
dell&#8217;action deve essere quello definito precedentemente dal metodo LoadDinObjF.</p>
<p>-DrawStatic(ACTION,numero_frame)<br />
disegna l&#8217;azione action ma non cambia frame : nel caso numero_frame sia definito, disegna quel determinato frame, viceversa disegna l&#8217;ultimo frame in cui si era fermato il contatore.</p>
<p>ESEMPIO<br />
Terminato ciò, possiamo introdurre il nuovo progetto: <a title="Campagna 1942" href="http://lab.pralevis.com/Documents/WebGL/Examples/Game/lesson12.html">campagna 1942</a>. Tale applicazione è solo una frazione del design che avevo in mente ma avevo voglia di cambiare un pò d&#8217;aria. Ritroviamo qua gli stessi input e comandi dell&#8217;esempio precedente ( stile fps) ,mentre possiamo notare l&#8217;aggiunta di nuovi modelli 3d ( tra cui un mulino funzionante ) ed il nostro baule.<br />
Per abilitare l&#8217;animazione dobbiamo essere molto vicino se non sopra ( ho messo una distanza massima per l&#8217;attivazione molto bassa ) e cliccare il pulsante E : essa si aprirà o si chiuderà producendo anche un suono ( ricorda un pò il gioco di ruolo Skyrim quando si cercano oggetti tra i bauli XD ).<br />
E&#8217; stato disabilitato il controllo della posizione, indi è possibile attraversare qualunque oggetto 3d senza problemi.</p>
<p>Per potere vedere l&#8217;esempio appena mostrato ( lo trovate come lesson12 e potete scaricare il pacchetto completto lesson12.zip) e scaricare il codice che è stato presentato nell&#8217;articolo, collegarsi al solito repository <a href="http://lab.pralevis.com/documenti.php?categories=webgl">Lab </a>.</p>
<p>Grazie per l’attenzione,</p>
<p>Andrea</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=844</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STATO DELL&#8217;ARTE [al 21/12]</title>
		<link>http://pralevis.com/wordpress/?p=835</link>
		<comments>http://pralevis.com/wordpress/?p=835#comments</comments>
		<pubDate>Wed, 21 Dec 2011 11:06:04 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[webgl]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=835</guid>
		<description><![CDATA[Salve a tutti! Da più di un mese non aggiorno il blog, ma questo non significa che sto rimanendo con le mani in mano . Infatti sto mandando in contemporanea più progetti e ciò mi impedisce di pubblicare risultati concreti in un futuro immediati. Webgl: la lesson è decisamente in stato avanzato; è stato inserita [...]]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti! Da più di un mese non aggiorno il blog, ma questo non significa che sto rimanendo con le mani in mano <img src='http://pralevis.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Infatti sto mandando in contemporanea più progetti e ciò mi impedisce di pubblicare risultati concreti in un futuro immediati.<br />
<strong>Webgl</strong>: la lesson è decisamente in stato avanzato; è stato inserita la possibilità di importare animazioni obj con una nuova classe, migliorando decisamente il metodo utilizzato dal sottoscritto nelle precedenti lezioni. Inoltre ne ho approfittato per buttare via il modello della casa in mattoni ( aveva decisamente stancato un pò troppo ) per inserire una nuova location più campagnola :post qualche scan per spiegare.</p>
<p><a href="http://pralevis.com/wordpress/wp-content/uploads/mulino.png"><img class="aligncenter size-medium wp-image-836" title="mulino" src="http://pralevis.com/wordpress/wp-content/uploads/mulino-300x215.png" alt="" width="300" height="215" /></a><br />
<a href="http://pralevis.com/wordpress/wp-content/uploads/pozzo.png"><img class="aligncenter size-medium wp-image-837" title="pozzo" src="http://pralevis.com/wordpress/wp-content/uploads/pozzo-300x140.png" alt="" width="300" height="140" /></a><br />
<strong>PHP</strong>: Sto mandando avanti un vecchio progetto e mi son imbattuto nella problematica di gestire una tabella php dinamica con qualche funzionalità in più; ho trovato un progetto open piuttosto interessante, credo che pubblicherò due righe per condividere questa notizia con chi ha avuto il mio stesso problema <img src='http://pralevis.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<strong>Android</strong>: ho iniziato a tastare un pò la questione del bluetooth tra device ( avevo una tastiera bluetooth mini che volevo attaccare al cellulare ma i programmi standard non andavano bene ); sto pensando di espandere la questione per proporre un piccolo apk per lo scopo.<br />
<strong>NewzReader</strong>: al momento è quello più indietro e con meno priorità; attendo eventuali segnalazioni per mandare avanti i lavori.</p>
<p>Rimanete connessi , entro pochi giorni pubblicherò due lezioni veloci, perciò non spazientate!</p>
<p>APL</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=835</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WEBGL FOR DUMMIES [PARTE TREDICI]</title>
		<link>http://pralevis.com/wordpress/?p=818</link>
		<comments>http://pralevis.com/wordpress/?p=818#comments</comments>
		<pubDate>Thu, 17 Nov 2011 10:39:08 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Webgl]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[blender]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[modello]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[webgl]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=818</guid>
		<description><![CDATA[Salve a tutti, con questo articolo mostreremo un metodo piuttosto pratico per importare i propri modelli 3D dentro la nostra applicazione webGL , utilizzando l&#8217;ultima versione delle librerie e l&#8217;inseparabile Blender ( versione 2.60). Inutile affermare l&#8217;importanza di tale argomento:i giochi odierni puntano sull&#8217;introduzione di oggetti sempre più realistici e complessi nella nostra scena; nell&#8217;ultima [...]]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,<br />
con questo articolo mostreremo un metodo piuttosto pratico per importare i propri modelli 3D dentro la nostra applicazione webGL , utilizzando l&#8217;ultima versione delle librerie e l&#8217;inseparabile Blender ( versione 2.60).</p>
<p>Inutile affermare l&#8217;importanza di tale argomento:i giochi odierni puntano  sull&#8217;introduzione di oggetti sempre più realistici e complessi nella nostra scena; nell&#8217;ultima lezione avevamo mostrato due classi javascript create per l&#8217;occasione ( ele_sta() e ele_din() ) ma avevo già anticipato che tale soluzione risultava lenta e pesante per il nostro pc.</p>
<p>Per tale motivo ho sviluppato uno script semplice e due nuove classi per alleggerire tutta l&#8217;operazione dandoci risultati più che gradevoli.</p>
<p><span id="more-818"></span><br />
Molti sono i formati con cui possiamo definire un modelli 3D : 3d studio(.3ds), ogre(-xml),Collada(.dae) &#8230; per il nostro esempio utilizzeremo modelli definiti secondo lo standard Wavefront ( .obj, .mtl).<br />
Tale standard è molto semplice, praticamente si basa su due tipi di file:<br />
-nomefile.obj -&gt; contiene informazioni sulle coordinate del vertice, sulle coordiante texture, sulle normali<br />
-nomefile.mtl -&gt; contiene informazioni sui tipi di materiali usati dal modello ( colore, nome texture,illuminazione).</p>
<p>E&#8217; un formato completo ma molto semplice , perfetto per creare un parsing non particolarmente complicato <img src='http://pralevis.com/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Abbiamo perciò sviluppato una nuova classe javascript, che dovrebbe sostituire al momento l&#8217;ele_sta cioè solo gli elementi statici ( nel nostro esempio noteremo che la classe obsoleta ele_sta è rimasta, ma se ne può fare tranquillamente a meno e toglierla dallo script ).<br />
La nuova classe ELE() risulta più semplice della precedente e ci permette di definire i suoi attributi, cioè la posizione dei vertici, delle texture e delle normali, chiamando delle semplici funzioni:</p>
<blockquote><p>
function ELE()<br />
{<br />
this.Draw = DrawElement2; //Ele.Draw() -&gt; funzione per disegnare<br />
this.SetColor = ELE_Color; //Ele.SetColor(&#8230;) -&gt; setta il colore dell&#8217;oggetto<br />
this.SetTexture = ELE_Texture; // Ele.SetTexture(&#8230;)-&gt; setta coordinate e immagine texture<br />
this.SetVertex = ELE_Vertex; // Ele.SetVertex(&#8230;) -&gt; setta i vertici<br />
this.SetNormals = ELE_Normal; //Ele.SetNormals(&#8230;) -&gt; setta le normali dei vertici</p>
<p>}</p></blockquote>
<p>Il nostro parser non farà altro che leggere i file, istanziare un array di classi ELE() e settare tutti i loro attributi fondamentali. Il nostro solo compito sarà quello di passare l&#8217;url al nostro parser e di invocare il Render del modello chiamando La Draw() nella funzione DrawScene().</p>
<p>Notere subito dall&#8217;esempio che tale approccio è nettamente più veloce del precedente: infatti per il javascript è molto più complesso gestire degli array giganteschi inchiodati direttamente nel codice che invece crearne durante la fase di esecuzione.<br />
Il rovescio della medaglia sarà un aumento della complessità degli shader e l&#8217;introduzione di qualche variabile in più nella InitShader.Spiegare il codice dei metodi della classe ELE() non è molto rilevante, praticamente tutte sono riassumibili col seguente schema:</p>
<p>function NOME(array)<br />
 {<br />
      Buffer=gl.createBuffer();<br />
	  gl.bindBuffer(gl.ARRAY_BUFFER, Buffer);<br />
        gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(array), gl.STATIC_DRAW);<br />
        Buffer.itemSize = numITemSize;<br />
        Buffer.numItems = array.length/numITemSize;<br />
		 this.array=Buffer;<br />
 }</p>
<p>Si crea il Buffer e lo si associa alla classe grazie alla chiamata this.nomevariabile, in tale modo l&#8217;array sarà poi disponibile per la fase di Disegno. La funzione leggermente più complessa risulta essere quella dei colori:<br />
in tale caso infatti bisogna creare un array dei colori con le stesse dimensioni di quello dei vertici; inoltre è stata data la possibilità di inserire direttamente un array dei colori ( nel caso ad esempio volessi creare un cubo multicolore ), ma questo ovviamente presuppone che l&#8217;utente accetti l&#8217;interpolazione lineare del colore.</p>
<p>Una delle novità introdotte in tale lezione è la lettura di file tramite javascript:</p>
<blockquote><p>
function LoadObjF(url)<br />
{<br />
    var request = new XMLHttpRequest();<br />
    request.open(&#8220;GET&#8221;, url);<br />
		request.onreadystatechange = function () {<br />
            if (request.readyState == 4) {<br />
                ParseFile(request.responseText);<br />
            }<br />
        }</p>
<p>	request.send();</p>
<p>   }
</p></blockquote>
<p>Questa semplice funzione javascript usa l&#8217;Ajax per inviare una richiesta asincrona; tale richiesta produrrà uno stream di dati che sarà poi inviata alla funzione ParseFile(&#8230;) se tutto va correttamente. Il nostro Parser avrà il compito di analizzare questi dati ricevuti in lettura. Ecco uno schema  molto semplificato del parser.</p>
<blockquote><p>
		function handleObjFile(data)<br />
{<br />
        //inizializzare variabili<br />
        var lines = data.split(&#8220;\n&#8221;); //divide in righe<br />
        for (var j in lines) {<br />
            var vals = lines[j].replace(/^\s+/, &#8220;&#8221;).split(/\s+/);<br />
         //divide ogni riga in colonne<br />
if(vals[0] == &#8220;mtllib&#8221;)<br />
{<br />
//mi salvo nuovo materiale<br />
}</p>
<p>if(vals[0] == &#8220;usemtl&#8221;)<br />
{<br />
mi salvo quale materiale devo usare per i successivi vertici<br />
}<br />
f (vals[0] == &#8220;vn&#8221;)<br />
{<br />
//è una normale, lo salvo<br />
}</p>
<p>if (vals[0] == &#8220;v&#8221; )<br />
 {<br />
// è un vertice, lo salvo<br />
  }<br />
 if (vals[0] == &#8220;vt&#8221;)<br />
  {<br />
//texture, lo salvo<br />
  }<br />
   if (vals[0] == &#8220;f&#8221; )<br />
  {<br />
    // creo array dei vertici, delle texture e delle normali<br />
  }<br />
&#8230;<br />
}
</p></blockquote>
<p>A causa di alcune problematiche legate ai tempi di elaborazione del javascript per aprire i file e alla asincronicità delle chiamate ajax,non basta una sola passata del parser per elaborare il tutto. Toccherà infatti analizzare il file obj una prima volta per estrapolare i nomi dei file .mtl che contengono i materiali, parsare suddetti file per crearsi un array delle definizioni dei materiali ed infine rileggere una seconda volta il file obj per creare  i buffer necessari al disegno ( sarebbe anche possibile tramite chiamate sincrone e ritardi voluti fare tutto con una sola passata ma ho preferito questo altro approccio).</p>
<p>Ora Sorge la domanda: come posso inserire un nuovo modello nella mia applicazione?</p>
<p>I passi da fare sono piuttosto semplici:<br />
1- creare una variabile globale javascript ( in modo tale che sia visibile in ogni punto del progetto. In soldoni, basta andare all&#8217;inizio del file o in qualunque punto fuori da una funzione e scrivere <em>var nomeoggetto ;</em> ).<br />
2- andare nella Funzione InitBuffer() ed inserire il codice:<em>nomeoggetto=  new LoadObjF(url_file_obj);</em><br />
tutto questo innescherà il parsing e il savaltaggio dei dati.<br />
3-nella funzione DrawScene() invochiamo il metodo Draw() (<em>nomeoggetto.Draw()</em> ). Ovviamente se il modello non è nella posizione corretta, consiglio di usare le solita funzioni di scalamento, rotazione e traslazione come nell&#8217;esempio seguente:</p>
<blockquote><p>
&#8230;<br />
mvPushMatrix();<br />
 Scale([0.05, 0.05, 0.05]);<br />
 mvTranslate([0, 1.5,0]);<br />
  prova.Draw();<br />
mvPopMatrix();<br />
    &#8230;
</p></blockquote>
<p>Per aumentare il realismo, abbiamo inserito in InitBuffer() anche una sorgente luminosa copiandola da una nostra precedente lezione; in questo modo modelli che non usano texture mostreranno maggior profondità ma inevitabilmente costringiamo l&#8217;utente a darci informazioni anche sulle normali.</p>
<p>Ultima cosa: come formattiamo correttamente i file obj da importare? Per aumentare al massimo la compatibilità ed evitare brutte sorprese, consiglio di appoggiarsi a Blender (versione 2.60), ecco riportati i semplici passi da seguire:</p>
<p>-Creare un nuovo progetto blender.<br />
-Importare un modello 3D usando qualunque tipo di formato (.3ds,.dae, un altro.obj,&#8230;)<br />
-Ad operazione completata, esportare il file stavolta usando lo standar Wavefront (.obj); prima di far partire l&#8217;operazione però, consigliamo di settare le opzioni  come sotto indicato, includendo perciò la definizione delle Normali, dei materiale e che le facce siano triangolari:</p>
<p><a href="http://pralevis.com/wordpress/wp-content/uploads/bender.png"><img src="http://pralevis.com/wordpress/wp-content/uploads/bender-182x300.png" alt="" title="bender" width="182" height="300" class="aligncenter size-medium wp-image-822" /></a></p>
<p>-Diamo l&#8217;ok e salviamo i file .obj e .mtl  nella medesima cartella della nostra applicazione , preoccupandoci inoltre di copiare anche le eventuali texture legate al modello. Prima di far partire l&#8217;applicazione, apriamo il/i file .mtl e controlliamo che il nome riportiamo a fianco dei campi map_ka o map_kd corrispondano al nome delle immagini e che l&#8217;indirizzo non punti a qualche strano path. Mostriamo un esempio:</p>
<blockquote><p>
nomi delle texture: body1.png,body2.png</p>
<p>File .mtl<br />
newmtl RefRep.22_BODY1.PNG<br />
Ns 96.078431<br />
Ka 0.000000 0.000000 0.000000<br />
Kd 0.800000 0.800000 0.800000<br />
Ks 0.500000 0.500000 0.500000<br />
Ni 1.000000<br />
d 1.000000<br />
illum 2<br />
map_Kd Body1.png  -> da cambiare, il nome della texture è in realtà body1.png</p>
<p>newmtl RefRep.24_BODY2.PNG<br />
Ns 96.078431<br />
Ka 0.000000 0.000000 0.000000<br />
Kd 0.800000 0.800000 0.800000<br />
Ks 0.500000 0.500000 0.500000<br />
Ni 1.000000<br />
d 1.000000<br />
illum 2<br />
map_Kd C:\Users\Ciao\Documents\Blender\cbody2.png ->  queto path punta ad un indirizzo del mio pc ma la mia app è caricata sul server ed inoltre il modello è nella stessa cartella dell&#8217;applicazione, perciò gliere questo path e lasciare direttamente cbody2.png
</p></blockquote>
<p>Per potere vedere l&#8217;esempio appena mostrato ( lo trovate come lesson11 e potete scaricare il pacchetto completto lesson11.zip) e scaricare il codice che è stato presentato nell&#8217;articolo, collegarsi al solito repository <a href="http://lab.pralevis.com/documenti.php?categories=webgl">Lab </a>.</p>
<p>Grazie per l’attenzione,</p>
<p>Andrea</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=818</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SITO TEMPORANEAMENTE DOWN</title>
		<link>http://pralevis.com/wordpress/?p=814</link>
		<comments>http://pralevis.com/wordpress/?p=814#comments</comments>
		<pubDate>Tue, 01 Nov 2011 13:29:31 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=814</guid>
		<description><![CDATA[Salve a tutti! Purtroppo in questi giorni, a causa di un bug del server, il blog e tutti i servizi web ad esso collegati erano temporaneamente down; mi scuso per l&#8217;accaduto, sto provvedendo a sistemare il problema una volta per tutte. Al momento ho ripristinato l&#8217;intero sistema ma , nel caso veniste a sapere di [...]]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti! Purtroppo in questi giorni, a causa di un bug del server, il blog e tutti i servizi web ad esso collegati erano temporaneamente down; mi scuso per l&#8217;accaduto, sto provvedendo a sistemare il problema una volta per tutte. Al momento ho ripristinato l&#8217;intero sistema ma  , nel caso veniste a sapere di altri problemi o malfunzionamenti, vi esorto a contattarmi , grazie.</p>
<p>APL</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=814</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RILASCIATA LA VERSIONE NEWZREADER (v 1.3)</title>
		<link>http://pralevis.com/wordpress/?p=805</link>
		<comments>http://pralevis.com/wordpress/?p=805#comments</comments>
		<pubDate>Tue, 18 Oct 2011 19:51:03 +0000</pubDate>
		<dc:creator>Apl</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Andrea]]></category>
		<category><![CDATA[newzreader]]></category>
		<category><![CDATA[pralevis]]></category>
		<category><![CDATA[Reader]]></category>
		<category><![CDATA[Rss]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://pralevis.com/wordpress/?p=805</guid>
		<description><![CDATA[Salve a tutti, oggi rilasciamo la terza versione di NewzReader.A causa di alcune scelte tattiche, in corso d&#8217;opera sono state fatte delle modifiche alla tabella degli obiettivi che si doveva prefiggere tale rilascio; di seguito elenchiamo le modifiche sostanziali. 1. Possibilità di salvare/importare i backup anche delle Newz salvate dentro l&#8217;app ( quelli inclusi nel [...]]]></description>
				<content:encoded><![CDATA[<p>Salve a tutti,</p>
<p>oggi rilasciamo la terza versione di NewzReader.A causa di alcune scelte tattiche, in corso d&#8217;opera sono state fatte delle modifiche alla tabella degli obiettivi che si doveva prefiggere tale rilascio; di seguito elenchiamo le modifiche sostanziali.</p>
<p>1. Possibilità di salvare/importare i backup anche delle Newz salvate dentro l&#8217;app ( quelli inclusi nel channel Saved per la precisione).</p>
<p>2.Possibilità di importare i canali RSS anche del proprio account di Google Reader.</p>
<p>3.Durante la sincronizzazione dei canali abilitati, avviene visualizzato il canale che si sta elaborando al momento ( così si ha un feedback su quanto manca alla fine dell&#8217;importing).</p>
<p>4. Risolti svariati bachi.</p>
<p>L&#8217;applicazione è liberamente scaricabile nel seguente <a href="http://newzreader.pralevis.com/download">link</a>; per dubbi, problemi o suggerimenti, non esistate a contattare, grazie.</p>
<p>Apl</p>
]]></content:encoded>
			<wfw:commentRss>http://pralevis.com/wordpress/?feed=rss2&#038;p=805</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
