<?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>MarcoDuff&#039;s Blog &#187; Second Life</title>
	<atom:link href="http://www.marcoduff.com/category/second-life/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcoduff.com</link>
	<description>...::: Il Blog di Marco &#34;Duff&#34; Palermo :::...</description>
	<lastBuildDate>Mon, 01 Mar 2010 07:00:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Notecard configurazione LSL</title>
		<link>http://www.marcoduff.com/2009/01/12/notecard-configurazione-lsl/</link>
		<comments>http://www.marcoduff.com/2009/01/12/notecard-configurazione-lsl/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 10:31:50 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Lezioni LSL]]></category>
		<category><![CDATA[Scripting LSL]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=159</guid>
		<description><![CDATA[Uno dei primi problemi che affronta uno scripter LSL non esperto (ma anche uno esperto!) è quello di creare un file di testo esterno allo script, dove salvare i valori iniziali di una variabile.
Questa operazione è estremamente utile per aumentare la modularità di uno script e per attuare delle modifiche senza dover modificare e ricompilare [...]]]></description>
			<content:encoded><![CDATA[<p>Uno dei primi problemi che affronta uno scripter LSL non esperto (ma anche uno esperto!) è quello di creare un file di testo esterno allo script, dove salvare i valori iniziali di una variabile.</p>
<p>Questa operazione è estremamente utile per aumentare la modularità di uno script e per attuare delle modifiche senza dover modificare e ricompilare il codice.</p>
<p>In script aventi una complessità medio-alta, la tecnica di salvare informazioni in un file di testo esterno è estremamente diffusa.</p>
<p>Il presente articolo si prefigge l&#8217;obiettivo di semplificare e rendere automatica una operazione di questo tipo. Lo script prevede una fase di impostazione delle variabile ed una fase di validazione delle stesse.</p>
<p>Inizio con il postare il codice completo del template per poi discutere le parti essenziali con un esempio.</p>
<pre>// ReadConfiguration
//
// Il seguente template viene usato per leggere un file di configurazione.
// Il file di configurazione può essere formattato nel seguente modo:
// &lt;var&gt;        Singola variabile
// &lt;var&gt;=&lt;var&gt;    Variabile &lt;var&gt; che deve essere inizializzata con il valore in &lt;var&gt;
// # line        Linea di commento
//
// @version 1.0
// @author MarcoDuff Palen (http://www.marcoduff.com/)

// Variabili
string configNotecard;
integer line;
key requestId;

// Legge i singoli comandi di configurazione.
//
// @param var    Nome della variabile letta (sempre totalmente maiuscola).
// @param val    Valore della variabile associata o una stringa vuota in caso di nessuna inizializzazione.
readConfig(string var, string val) {
}

// Valida la configurazione.
//
// @return    Restituisce TRUE se la configurazione è valida, FALSE altrimenti.
integer validateConfig() {
    return TRUE;
}

// Stato di inizializzazione.
default {
    state_entry() {
        configNotecard = llGetScriptName()+".config";
        line = 0;
        requestId = llGetNotecardLine(configNotecard,line);
    }

    state_exit() {
        line = -1;
        requestId = NULL_KEY;
    }

    dataserver(key request_id, string data) {
        if(requestId==request_id) {
            if(data!=EOF) {
                data = llStringTrim(data,STRING_TRIM);
                if(llSubStringIndex(data,"#")!=0&amp;&amp;llStringLength(data)&gt;0) {
                    list dataList = llParseString2List(data,["="],[]);
                    string var = llToUpper(llStringTrim(llList2String(dataList,0),STRING_TRIM));
                    string val = "";
                    if(llGetListLength(dataList)==2) val = llStringTrim(llList2String(dataList,1),STRING_TRIM);
                    readConfig(var,val);
                }
                line++;
                requestId = llGetNotecardLine(configNotecard,line);
            }
            else {
                integer validate = validateConfig();
                if(validate == TRUE) state ConfigOkState;
                else state ConfigErrorState;
            }
        }
    }
}

// Stato se la configurazione è andata a buon fine.
state ConfigOkState {
    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}

// Stato se la configurazione è errata.
state ConfigErrorState {
    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}</pre>
<p>Lo script non fa altro che cercare il file di testo nel contents dell&#8217;oggetto chiamato come lo script e con estenzione .config, leggere tutte le righe del file ignorando le linee vuote e le linee che iniziano con il carattere #, validare le variabili lette e portarsi nello stato <em>ConfigOkState</em> se tutto è andato a buon fine o nello stato <em>ConfigErrorState</em> in caso di errori.</p>
<p>Questo significa che lo stato di default della nostra applicazione diventa <em>ConfigOkState</em>. Le uniche righe di codice da modificare nel template sono, infatti, l&#8217;inserimeto delle variabili utili al problema, il contenuto delle due funzioni <em>readConfig</em> e <em>validateConfig</em> e gli stati <em>ConfigOkState</em> e <em>ConfigErrorState</em>.</p>
<p>Facciamo un esempio che spiega il funzionamento del template.</p>
<p>Supponiamo di voler creare un oggetto che visualizzi un testo sopra di esso. Il testo ed il colore dell&#8217;oggetto devono essere specificati in un file di testo esterno allo script. Il testo deve sempre specificato, mentre il colore, se non specificato, deve essere nero.</p>
<p>Il modo più semplice per lavorare con questo template è creare prima il file di testo di configurazione. Suppunendo di voler visualizzare il testo &#8220;Prova riuscita!!!&#8221; di colore blu, il file di testo risulta essere il seguente:</p>
<pre># Questa è una prova di configurazione dello script ReadConfiguration

# Text indica il testo da visualizzare
text = Prova riuscita!!!

# Color è opzionale, fai i tentativi commentando o impostando la variabile!
color = &lt;0.0,0.0,1.0&gt;</pre>
<p>Notate il massiccio uso di commenti (righe che iniziano con il carattere #) che verranno ignorati, insieme alle righe vuote, dallo script.</p>
<p>Come possiamo notare dal file di testo, per soddisfare questo problema abbiamo sicuramente bisogno di due variabili: la prima di tipo string per salvare il testo da visualizzare, la seconda di tipo vector per il colore.</p>
<p>Questo significa che al template bisogna aggiungere in testa il seguente codice:</p>
<pre>string text;
vector color;</pre>
<p>l&#8217;impostazione di queste due variabili viene fatto all&#8217;interno della funzione <em>readConfig</em>. Questa funzione, infatti, riceve in input due variabili chiamate <em>var</em> e <em>val</em> che contengono rispettivamente la parte sinistra e quella destra rispetto al simbolo = di ogni riga letta nel file di configurazione (se non è presente il simbolo = allora viene valorizzata solo la variabile <em>var</em>). La variabile <em>var</em> ha la particolarità di essere sempre in maiuscolo, mentre la variabile <em>val</em> mantiene i caratteri originali.</p>
<p>Per fare un esempio, quando lo script leggerà la riga &#8220;text = Prova riuscita!!!&#8221; richiamerà la funzione <em>readConfig</em> passando per <em>var</em> il valore &#8220;TEXT&#8221; mentre per <em>val</em> il valore &#8220;Prova riuscita!!!&#8221;.</p>
<p>Detto questo, modifichiamo l&#8217;interno della funzione <em>readConfig</em> per impostare le nostre variabili text e color in questo modo:</p>
<pre>readConfig(string var, string val) {
    if(var=="TEXT") text = val;
    else if(var=="COLOR") color = (vector)val;
    else llOwnerSay("[WARNING] Variabile "+var+" alla linea "+(string)(line+1)+" non prevista.");
}</pre>
<p>in questo modo quando verranno letti i due valori dal file di testo, questi verranno opportunamente impostati nelle variabili. Notate che in questa particolare implementazione, se viene letto un comando non previsto viene dato un warning all&#8217;owner dello script che ha un utile feedback (pensate a quante volte avete perso tempo inutile per un semplice errore di battitura come scrivere &#8220;calor&#8221; invece di &#8220;color&#8221; o simili&#8230; mettere feedback di questo tipo è sempre molto utile e assolutamente consigliato). Notate anche come ho utilizzato la variabile line che indica la linea corrente di lettura del file (p.s.: ho dovuto incrementarla di 1 visto che la prima riga di un file di testo parte da 0!).</p>
<p>Se vogliamo inserire una validazione o vogliamo mettere dei valori di default per una variabile, dobbiamo modificare il contenuto della funzione <em>validateConfig</em> (se non vogliamo farlo, ci basta lasciare il return TRUE;). Nel nostro esempio dobbiamo controllare che il testo sia stato inserito, visto che lo consideriamo obbligatorio, mentre dobbiamo controllare che se il colore non è stato inserito dobbiamo impostarlo a Nero. La modifica da attuare è la seguente:</p>
<pre>integer validateConfig() {
    if(color == ZERO_VECTOR) color = &lt;0.0,0.0,0.0&gt;;

    if(llStringLength(text)==0) llOwnerSay("[ERROR] Non hai impostato la variabile TEXT");
    else return TRUE;

    return FALSE;
}</pre>
<p>se noto che la variabile color non è stata impostato, lo imposta io a nero. Se noto che la variabile text non è stata impostata stampo un messaggio di errore. Notare che la funzione restituisce TRUE esclusivamente nel caso in cui la variabile text viene impostata, in tutti gli altri casi restituisce FALSE. Il risultato della funzione TRUE o FALSE impone il passaggio di stato rispettivamente a <em>ConfigOkState</em> a <em>ConfigErrorState</em>.</p>
<p>A questo punto non ci resta che riempire lo stato <em>ConfigOkState</em> con il codice che avremmo scritto nello stato default di un normale script ma supponendo che le variabili a noi utili siano già state impostate, mentre lo stato <em>ConfigErrorState</em> con eventuali messaggi di errore. Ad esempio:</p>
<pre>state ConfigOkState {
    state_entry() {
        llSetText(text,color,1.0);
    }

    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}

state ConfigErrorState {
    state_entry() {
        llOwnerSay("Errore di configurazione nel file "+configNotecard);
    }
    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}</pre>
<p>Notate che tutti e due gli stati gestiscono l&#8217;evento changed in modo da captare eventuali modifiche del file di configurazione e resettarsi in automatico (ovviamente se non si vuole questa estenzione basta cancellare l&#8217;evento!).</p>
<p>Per chiarezza posto il codice completo dell&#8217;esempio:</p>
<pre>// ReadConfiguration
//
// Il seguente template viene usato per leggere un file di configurazione.
// Il file di configurazione può essere formattato nel seguente modo:
// &lt;var&gt;        Singola variabile
// &lt;var&gt;=&lt;val&gt;    Variabile &lt;var&gt; che deve essere inizializzata con il valore in &lt;val&gt;
// # line        Linea di commento
//
// @version 1.0
// @author MarcoDuff Palen (http://www.marcoduff.com/)

// QUI INSERISCO LE VARIABILI DA RIEMPIRE TRAMITE IL FILE DI CONFIGURAZIONE
string text;
vector color;

// Variabili
string configNotecard;
integer line;
key requestId;

// Legge i singoli comandi di configurazione.
//
// @param var        Nome della variabile letta (sempre totalmente maiuscola).
// @param val        Valore della variabile associata o una stringa vuota in caso di nessuna inizializzazione.
readConfig(string var, string val) {
    // QUI INSERISCO I SETTAGGI DELLE VARIABILI
    llOwnerSay("[INFO] Reading "+var+" = "+val+" on line "+(string)(line+1));
    if(var=="TEXT") text = val;
    else if(var=="COLOR") color = (vector)val;
    else llOwnerSay("[WARNING] Variabile "+var+" alla linea "+(string)(line+1)+" non prevista.");
}

// Valida la configurazione.
//
// @return            Restituisce TRUE se la configurazione è valida, FALSE altrimenti.
integer validateConfig() {
    // QUI INSERISCO L'EVENTUALE VALIDAZIONE DELLE VARIABILI

    // Il colore non è una variabile richiesta, se non viene impostata la imposto a nero
    if(color == ZERO_VECTOR) color = &lt;0.0,0.0,0.0&gt;;

    // Il testo è una variabile fondamentale, mando un messaggio di errore
    if(llStringLength(text)==0) llOwnerSay("Non hai impostato la variabile TEXT");
    else return TRUE;

    return FALSE;
}

// Funzione per la visualizzazione dell'output.
//
// @param message    Messaggio da visualizzare.
// @param color        Colore di visualizzazione.
showOutput(string message, vector color) {
    llSetText(message,color,1.0);
}

// Stato di inizializzazione.
default {
    state_entry() {
        configNotecard = llGetScriptName()+".config";
        showOutput("Reading "+configNotecard,&lt;0.0,1.0,0.0&gt;);
        line = 0;
        requestId = llGetNotecardLine(configNotecard,line);
    }

    state_exit() {
        line = -1;
        requestId = NULL_KEY;
        showOutput("",ZERO_VECTOR);
    }

    dataserver(key request_id, string data) {
        if(requestId==request_id) {
            if(data!=EOF) {
                data = llStringTrim(data,STRING_TRIM);
                if(llSubStringIndex(data,"#")!=0&amp;&amp;llStringLength(data)&gt;0) {
                    list dataList = llParseString2List(data,["="],[]);
                    string var = llToUpper(llStringTrim(llList2String(dataList,0),STRING_TRIM));
                    string val = "";
                    if(llGetListLength(dataList)==2) val = llStringTrim(llList2String(dataList,1),STRING_TRIM);
                    readConfig(var,val);
                }
                line++;
                requestId = llGetNotecardLine(configNotecard,line);
            }
            else {
                integer validate = validateConfig();
                if(validate == TRUE) state ConfigOkState;
                else state ConfigErrorState;
            }
        }
    }
}

// Stato se la configurazione è andata a buon fine.
state ConfigOkState {
    state_entry() {
        // SE TUTTO E' ANDATO BENE VISUALIZZO IL TESTO SULL'OGGETTO CON I PARAMETRI DEL FILE DI CONFIGURAZIONE
        llSetText(text,color,1.0);
    }

    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}

// Stato se la configurazione è errata.
state ConfigErrorState {
    state_entry() {
        // SE TUTTO E' ANDATO MALE VISUALIZZO UN ERRORE
        llOwnerSay("Errore di configurazione nel file "+configNotecard);
    }
    changed(integer change) {
        if(change &amp; CHANGED_INVENTORY) llResetScript();
    }
}</pre>
<p>Buono Scripting LSL a tutti!</p>
<p></var></var></var></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2009/01/12/notecard-configurazione-lsl/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Video di Natale per CBM Italia Onlus</title>
		<link>http://www.marcoduff.com/2008/12/19/video-di-natale-per-cbm-italia-onlus/</link>
		<comments>http://www.marcoduff.com/2008/12/19/video-di-natale-per-cbm-italia-onlus/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 13:10:48 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[cbm]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=120</guid>
		<description><![CDATA[
Video di Natale girato alla Land del Forum per CBM Italia Onlus dal grande Yash!
Io sono quello al minuto 2:57!
]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/6ZC5icB4vLs&amp;hl=it&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/6ZC5icB4vLs&amp;hl=it&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Video di Natale girato alla <a href="http://slurl.com/secondlife/Beech/30/130/30" target="_blank">Land del Forum</a> per <a href="http://www.cbmitalia.org/" target="_blank">CBM Italia Onlus</a> dal grande <a href="http://www.secondlifeitalia.com/community/profile.php?mode=viewprofile&amp;u=9434" target="_blank">Yash</a>!</p>
<p>Io sono quello al minuto 2:57!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/12/19/video-di-natale-per-cbm-italia-onlus/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Indecisione.</title>
		<link>http://www.marcoduff.com/2008/09/08/indecisione/</link>
		<comments>http://www.marcoduff.com/2008/09/08/indecisione/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 10:59:36 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=83</guid>
		<description><![CDATA[
Indeciso fino alla fine se rispondere o tacere. Molti mi consiglierebbero di tacere, sopratutto i miei nemici. Ma il punto è capire chi sono questi nemici&#8230; perché il non lo so.
Allora li esamino ad uno ad uno&#8230; a partire dalla più importante Alice.
Ovviamente non sei la più importante, ma ti piace pensare di esserlo (il [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Lupo o agnello?" rel="lightbox" href="http://avapa.files.wordpress.com/2008/04/lupoagnello1.jpg"><img class="border" src="http://avapa.files.wordpress.com/2008/04/lupoagnello1.jpg" alt="" width="350" height="316" /></a></p>
<p style="text-align: left;">Indeciso fino alla fine se rispondere o tacere. Molti mi consiglierebbero di tacere, sopratutto i miei nemici. Ma il punto è capire chi sono questi nemici&#8230; perché il non lo so.</p>
<p style="text-align: left;">Allora li esamino ad uno ad uno&#8230; a partire dalla più importante Alice.</p>
<p style="text-align: left;">Ovviamente non sei la più importante, ma ti piace pensare di esserlo (il grassetto ovviamente non sei tu, ma adoro il tuo egocentrismo che ti fa accaparrare tutto l&#8217;accaparrabile). Ma si, sei una mia amica. Perchè con te c&#8217;è sempre stato un rapporto di odio e odio, ma di quello che mi ha sempre portato a dire &#8220;Io Alice devo conoscerla di persona&#8221;, ed ho molti testimoni che possono confermare questa mia frase. Abbiamo avuto tantissimi battibecchi in passato e ne avremo almeno altri duemila in futuro, sei testarda da morire, ma anche se è molto duro farlo, con te si può parlare.</p>
<p style="text-align: left;">E con te ho finito! Quindi non cercare altri riferimenti alla tua persona dopo questa riga perché sono finiti, volendo puoi anche chiudere la pagina.</p>
<p style="text-align: left;">Tornando seri&#8230;</p>
<p style="text-align: left;">Sumichan non so chi sia, ma le sue parole, come quelle di Castalia, sono sempre state le lette con un grande sorriso. Penso sia positivo!</p>
<p style="text-align: left;">Helm è un amico anche in RL. Continuo a non capire i suoi riferimenti alla cricca di intoccabili, che continua ad essere una sterile polemica. Helm, è cosi che la penso e credo di averla detta in tutte le salse. Tra gli intoccabili, o presunti tali, vi sono (parlando di ex-mod) MarcoDuff, Annett, Alice, Enea e tra gli utenti Publio, Esecutore, Darko? Tutti questi hanno ricevuto almeno un richiamo nella loro carriera e più di uno un ban. i continuo a domandare&#8230; chi sono questi privilegiati? Se X fa 1 a Y ed Y, per risposta, fa 100 a X&#8230; mi dispiace, è Y che avrà le conseguenze peggiori. Si, è brutto a dirsi&#8230; ma mica sei autorizzato a sparare in testa ad un ladro che ti ruba casa, no? In ogni caso, continuo a dire&#8230; lasciate correrre&#8230; chi se ne frega! Provate a chiarire tra di voi&#8230; è Second Life! Spetta a noi residenti renderla migliore della nostra First Life!</p>
<p style="text-align: left;">Sonia. Questa è stata una sorpresa&#8230; visto che non mi aspettavo quel tipo di post. Faccio subito una premessa sulla parte iniziale, non so perché l&#8217;hai scritta, probabilmente per errore ma sinceramente non l&#8217;ho capita. Io non ho apportato alcuna censura al commento. Nessun commento viene censurato, esiste una moderazione per il semplice fatto che essendo il mio blog voglio che scrivano al suo interno soltanto persone che conosco, il filtro sta sull&#8217;autore, assolutamente non sul contenuto. Sonia, non mi sono mai vantato di essere un lupo, figuriamoci! E&#8217; stata una etichetta che mi è stata associata e alla quale sono rimasto molto affezionato. No, non sono un animale nobile e nemmeno una faina, non mi interessa il pettegolezzo e non sono mai stato il primo ad attaccare. Le mie sono sempre state delle risposte ragionate, magari in ritardo, ma mai fatte con cattiveria. Conosco mille persone disposte a dimostrare esattamente il contrario di quello che ho affermato e ne conosco altrettante mille capaci di confermarlo&#8230; lascio a questi duecento individui la briga di giudicarmi, cosa che ovviamente non faranno perché sono tre o quattro di quelli non mi ignorano come è giusto che sia!</p>
<p style="text-align: left;">Angelica *umpf*. Altra persona che vorrei conoscere per capire se sei vera oppure ti diverti ad impersonare un personaggio. Inizio chiedendoti scusa. Ti chiedo scusa perché probabilmente mi sono espresso male nel mio post. Il tuo commento, infatti, devo ignorarlo&#8230; perché rispondi a frasi non rivolte a te in modo nemmeno esatto. Penso che tutto sia da ricondurre alla mancata comprensione del post. Tanto per fare degli esempi: la citazione &#8220;E’ una guerra e bisogna combattere&#8221; che fai è ovviamente una frase ironica, non esiste nessuna guarra! Implica il fatto che non ti ho mai visto come una nemica, al massimo come una ingenua, come tu stessa confermi di essere in più di un pm che mi hai inviato in passato. Inoltre ho parlato del ban a te e basta! Dove ho affermato che non andavano presi altri provvedimenti verso altre persone? Dove ho detto che non parli mai per te stessa? Penso che lo fai! Inoltre non ho nessun preconcetto nei tuoi confronti&#8230; la tua voglia di polemizzare contro la moderazione è risaputa come da tua stessa affermazione (PM), ma capisco anche che lo fai per difendere &#8220;a modo tuo&#8221; la community (che IMHO è il modo peggiore per difenderla). Ultima precisazione&#8230; non ho nessun problema a dire che la bannata è Angelica Lean, ma scherziamo??? Anche questo era un riferimento ad una frase urlata sui bannati che mi ha fatto ridere! E poi c&#8217;è veramente qualcuno che non ha capito che eri tu???</p>
<p style="text-align: left;">Sul legittimo disprezzo avrei da ridire&#8230; perché non ho capito. O meglio, il disprezzo alla fine ci può stare, pazienza, avrò sbagliato qualche cosa&#8230; il legittimo può essere discutibile. Ma quello su cui non si discute è ovviamente il regolamento. Capisco che un navigatore con un quoziente intellettivo pari a 1 ci stia meno di un micro secondo a scoprire la mia professione, ma che un amministratore di un forum, che è andato via da un altro forum per questo stesso motivo, nel suo forum si vanti ricevendo anche complimenti da altri utenti di aver fatto un regolamento che tuteli la sfera personale degli iscritti, e che poi si permetta di scrivere la mia professione violando le stesse regole scritte da lui, mi lascia quantomeno perplesso. Ma tranquilla, faccio io il primo passo. Voglio collaborare! Autorizzo ufficialmente l&#8217;amministratore a scrivere la mia professione sul suo forum! Perché è di questo che parlavo&#8230; collaborare e mi dispiace aver ricevuto una chiusura da parte tua. Dicevo che avere alternative sarebbe bello e stimolante. Chi se ne frega di chi ha più utenti! Tutti sappiamo che il numero del forum è falsato&#8230; e allora? Chi ha detto che sono migliori le community con 1000 iscritti postanti rispetto ad una con 1000000 iscritti con 100 postanti? Penso che community sia un luogo dove ti senti a tuo agio. Io nel mio forum sto a mio agio. Nel tuo ovviamente no, tanto che non sono iscritto. Ma non lo prendere come un attacco! Parliamoci chiaro, su 276 post quanti parlano di Second Life (visto che più della metà stanno in aree private)? Per una volta ascoltate il consiglio del vostro moderatore Darko, basta parlare del forum (sul serio&#8230; il tuo sembra il Forum del Forum!)! Inizia a mettere contenuti e togli quella stupida regola &#8220;vietato insultare la moderatrice da siti esterni&#8221;!!! Ma daiiiii!!! E poi chiamavi la mia censura??? Metti un paio di contenuti in quel forum, pulisci il db e stai certa che al primo topic interessante sugli script avrai un nuovo utente iscritto (perchè é cosi che mi farai sentire a mio agio e attirerai utenti attivi&#8230; altrimenti attiri utenti con rancore odio o come lo chiami tu, legittimo disprezzo!).</p>
<p style="text-align: left;">Piccola precisazione per non perdere amicizie! Non ho mai identificato come nemico Tayra e Sonia&#8230; con Tayra continuiamo a sentirci in modo più o meno regolare per piacevoli brevi chiacchierate su script. Magari abbiamo avuto discussioni in passato (anche se adesso non le focalizzo), ma penso si siano risolte nel migliore dei modi! Darko è un caso a parte anche se non lo reputo un nemico. Sfortunatamente con lui non riesco a spiegarmi in modo corretto, sopratutto utilizzando mezzi come PM chat e compagnia bella. Per questo motivo ho dato a Darko il mio numero di cellulare, cosa che non avrei sicuramente dato ad un nemico o ad una persona con cui voglio chiudere un rapporto. Inoltre lui mi ha pure regalato la sua collezione 2007 in SL! Detto questo&#8230; mi sono rimasti veramente pochi nemici&#8230; appena ho i nomi li posto!</p>
<p style="text-align: left;">Dulcis in fundo&#8230; un rapporto va curato&#8230; ma che significa curare? Perché alcune volte ho come l&#8217;impressione che serva un manuale, un insieme di regole da seguire, in modo preciso, senza mai sbagliare altrimeti cadi! Caschi giù e di nuovo tutto da capo&#8230; ma sempre più fragile.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/09/08/indecisione/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Ieri. Oggi. Domani.</title>
		<link>http://www.marcoduff.com/2008/09/05/ieri-oggi-domani/</link>
		<comments>http://www.marcoduff.com/2008/09/05/ieri-oggi-domani/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 08:57:14 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=82</guid>
		<description><![CDATA[
Seconda vita del cavolo.
Il che equivale a dire vita del cavolo. Ma per fortuna solo una parte, una piccolissima parte, la parte più piccola in assoluto.
Perché ho la grande fortuna che le persone importanti della seconda vita adesso fanno parte della prima vita.
Perché ho la grande sfortuna che le persone importanti della seconda vita adesso [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Il lupo è stanco" rel="lightbox" href="http://www.midisegni.it/disegni/fiabe/lobo_sete_cabras.gif"><img class="border" src="http://www.midisegni.it/disegni/fiabe/lobo_sete_cabras.gif" alt="" width="400" /></a></p>
<p>Seconda vita del cavolo.</p>
<p>Il che equivale a dire vita del cavolo. Ma per fortuna solo una parte, una piccolissima parte, la parte più piccola in assoluto.</p>
<p>Perché ho la grande fortuna che le persone importanti della seconda vita adesso fanno parte della prima vita.</p>
<p>Perché ho la grande sfortuna che le persone importanti della seconda vita adesso fanno parte della prima vita.</p>
<p>Non mi sono creato una seconda vità per scappare dalla mia prima bellissima vita, ma come la mettiamo se io adesso volessi scappare dalla mia second vita. No, non sono l&#8217;unico che l&#8217;ha fatto&#8230; una persona, finita nel dimenticatoio ormai da tanto tempo, dimeticata dai più, l&#8217;ha fatto. Si chiama Iao&#8230; o forse si chiamava, visto che non so nemmeno che fine abbia fatto&#8230; ogni tanto domando. Ed un&#8217;altra persona a cui sono molto affezionato sta lasciando lentamente&#8230; lentamente perché so che in cuore suo non vuole farlo, ma ne è costretta dalla noia e dalla polemica&#8230; Medea.</p>
<p>E a queste chi si aggiunge? Io? Forse si, forse no. Sarebbe bello avere alternative, fare parte di più community, condividere le informazioni, collaborare, evitare polemica. Ma, guardate la coincidenza della frase, questo nelle community straniere accade in Italia no! Si, il riferimento è dritto a te. Perché come te, ogni giorno ti leggo e sorrido&#8230; sorrido per ipocrisia. Fino a quando sei ipocrita con il nemico, ci può stare! E&#8217; una guerra e bisogna combattere&#8230; ma non puoi essere ipocrita con le tue stesse frasi o peggio ancora con la tua stessa firma. Ma ti capisco, l&#8217;odio ed il rancore rende ciechi.</p>
<p>E poi un&#8217;altra&#8230; la bannata della situazione. Adesso prendi appunti, perché grazie alla mia non indifferenza ho avuto un grosso battibecco con la moderazione ed ho litigato in modo aspro con una cara amica. Quindi non ti azzardare un&#8217;altra volta a dire che gli ex-moderatori sono privilegiati, che ci sono utenti tutelati e che si fa sempre una barriera per difendere i moderatori. Hai avuto la dimostrazione in mano che Annett non è stata privilegiata, che se esistono utenti privilegiati quella sei stata proprio tu visto che personalmente ti avrei bannato già una settimana fa e per molti più giorni e che le barricate non esistono visto che personalmente ho litigato e discusso con buona parte della moderazione in modo incivile ma rispettando il regolamento, ecco perché non ti accorgi di nulla visto che questo tipo di comunicazioni vanno fatte via PM. Quindi la prossima volta che ti vengono queste idee pensa bene a quello che vedi scritto qui, perché se continui, IMHO, sei solo una ragazzina amante della polemica.</p>
<p>E se qualcuno scrive una frase per solidarietà, per un saluto, per divertimento e la mette in firma ci stiamo (me compreso) un micro secondo a scandirla e a vederci dietrologie sataniche o riti voodoo. Facciamoci un favore, rilassiamoci, me compreso.</p>
<p>Dulcis in fundo tu. Si ho sbagliato. Si abbiamo sbagliato. Si ogni tanto si fa. Si, dovevo prima contattarti e mandarti a quel paese come esordio, come fai di solito tu. Non l&#8217;ho fatto, amicizia finita? Se la mia amicizia con te è legata ad un filo cosi sottile, che basta un pollaio a distruggerlo, per una volta sono io a dire che non ho perso nulla. E continuerò a chiamarlo cosi, pollaio, perchè se una gallina solo per il gusto di usare il suo becco dice che le da fastidio il grassetto le cose sono due, o civilmente vi innalzate dal ruolo di galline scambiandovi insulti costruttivi via pm, o almeno ti innalzi solo tu dal livello gallina e per un breve periodo di tempo eviti il grassetto per diplomazia&#8230; penché scrivere proprio quel nome in grassetto è un chiaro, chiarissimo segnale diretto&#8230; non lo ha fatto di proposito, siamo noi a vederci il lato oscuro ed abbiamo sbagliato tutti a darti contro senza chiedere spiegazioni&#8230; per questo personalmente ti chiedo scusa&#8230; ma rifletti anche sotto altri punti di vista.</p>
<p>Per una volta, forse il lupo è stanco&#8230; si vuole riposare. Perché quando si combatte con la stupidità lo si fa con il sorriso e divertendosi un mondo&#8230; ma quando arrivi a combattere pure con gli amici è finita.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/09/05/ieri-oggi-domani/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nuove Funzioni LSL</title>
		<link>http://www.marcoduff.com/2008/08/29/nuove-funzioni-lsl/</link>
		<comments>http://www.marcoduff.com/2008/08/29/nuove-funzioni-lsl/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 20:04:27 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>
		<category><![CDATA[Scripting LSL]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=81</guid>
		<description><![CDATA[Sono state implementate 8 nuove funzioni lsl (disponibili con dal client 1.21).
Vediamo di esaminarle una per una.
Sei di queste sono di tipo llDetected* applicabili esclusivamente in un contesto di tipo Touch e che accettano in ingresso il solito indice che tiene conto dei click multipli.
integer llDetectedTouchFace(integer index);
Restituisce il numero della faccia toccata.
vector llDetectedTouchPos(integer index);
Posizione del [...]]]></description>
			<content:encoded><![CDATA[<p>Sono state implementate 8 nuove funzioni lsl (disponibili con dal client 1.21).</p>
<p>Vediamo di esaminarle una per una.</p>
<p>Sei di queste sono di tipo llDetected* applicabili esclusivamente in un contesto di tipo Touch e che accettano in ingresso il solito indice che tiene conto dei click multipli.</p>
<p><strong>integer llDetectedTouchFace(integer index);</strong><br />
Restituisce il numero della faccia toccata.</p>
<p><strong>vector llDetectedTouchPos(integer index);</strong><br />
Posizione del punto toccato in coordinate globali (regione).</p>
<p><strong>vector llDetectedTouchST(integer index);</strong><br />
Posizione del punto toccato nella faccia in percentuale.</p>
<p><strong>vector llDetectedTouchUV(integer index);</strong><br />
Posizione del punto toccato nella faccia in coordinate UV.</p>
<p><strong>vector llDetectedTouchNormal(integer index);</strong><br />
Vettore normale alla superficie nel punto toccato.</p>
<p><strong>vector llDetectedTouchBinormal(integer index);</strong><br />
Vettore tangente alla superficie nel punto toccato.</p>
<p>Una funzione riguarda le informazioni su un agent.</p>
<p><strong>string llGetAgentLanguage(key agentKey);</strong><br />
Restituisce il codice della lingua dell&#8217;agent rappresentato dalla key.</p>
<p>Una funzione riguarda la regione.</p>
<p><strong>integer llGetRegionAgentCount();</strong><br />
Restituisce il numero degli agent nella regione in cui gira lo script.</p>
<p>Se volete provarle tutte quante con un click, ecco un codice di esempio:</p>
<pre>default {
    touch_start(integer total_number) {
        integer i;
        for(i=0;i&lt;total_number;i++) {
            key agentKey = llDetectedKey(i);
            string agentName = llDetectedName(i);
            string agentLanguage = llGetAgentLanguage(agentKey);

            llOwnerSay("*** Informazioni Agent ***");
            llOwnerSay("Nome: "+agentName);
            llOwnerSay("Key: "+(string)agentKey);
            llOwnerSay("Lingua: "+agentLanguage);

            integer faceIndex = llDetectedTouchFace(i);
            vector posVec = llDetectedTouchPos(i);
            vector posSTVec = llDetectedTouchST(i);
            vector posUVVec = llDetectedTouchUV(i);
            vector normalVec = llDetectedTouchNormal(i);
            vector tangentVec = llDetectedTouchBinormal(i);

            llOwnerSay("*** Informazioni Tocco ***");
            llOwnerSay("Faccia: "+(string)faceIndex);
            llOwnerSay("Posizione toccata (Regione): "+(string)posVec);
            llOwnerSay("Posizione toccata (ST): "+(string)posSTVec);
            llOwnerSay("Posizione toccata (UV): "+(string)posUVVec);
            llOwnerSay("Vettore normale: "+(string)normalVec);
            llOwnerSay("Vettore tangente: "+(string)tangentVec);

        }
        integer agentInRegion = llGetRegionAgentCount();

        llOwnerSay("*** Informazioni Region ***");
        llOwnerSay("Numero agent: "+(string)agentInRegion);
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/08/29/nuove-funzioni-lsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compilare con Mono</title>
		<link>http://www.marcoduff.com/2008/08/21/compilare-con-mono/</link>
		<comments>http://www.marcoduff.com/2008/08/21/compilare-con-mono/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 21:50:46 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>
		<category><![CDATA[Mono]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=80</guid>
		<description><![CDATA[Finalmente il giorno è arrivato! Finalmente è possibile compilare i nostri script LSL per farli eseguire con la macchina virtuale Mono.
Questo mini-tutorial vi spiegherà come effettuare la vostra prima compilazione!
I Viewer abilitati alla compilazione Mono sono esclusivamente quelli con versione uguale o maggiore alla 1.21. Per il momento, l&#8217;unico viewer compatibile è il Preview Grid [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente il giorno è arrivato! Finalmente è possibile compilare i nostri script LSL per farli eseguire con la macchina virtuale Mono.<br />
Questo mini-tutorial vi spiegherà come effettuare la vostra prima compilazione!</p>
<p>I Viewer abilitati alla compilazione Mono sono esclusivamente quelli con versione uguale o maggiore alla 1.21. Per il momento, l&#8217;unico viewer compatibile è il Preview Grid Viewer, quindi se fate girare Second Life tramite il Viewer Ufficiale o tramite il Release Candidate non sarete abilitati alla compilazione Mono.</p>
<p>La prima cosa da fare è quindi scaricare dal <a href="http://secondlife.com/support/downloads.php">sito ufficiale</a> la versione Preview Grid Viewer.</p>
<p>La Preview Grid Viewer di norma si connette alla Beta Grid di Second Life. Per accedere alla Main Grid dobbiamo forzare il Viewer. Facciamolo partire e prima di effettuare il login premiamo i tasti Ctrl-Shift-G. Ci appare, come mostrato nella seguente figura, un menù a tendina. Selezioniamo &#8220;agni&#8221; che sta ad indicare la Main Grid (di default è selezionato &#8220;aditi&#8221;, ovvero la Beta Grid). Fatto questo possiamo effettuare normalmente il login.</p>
<p style="text-align: center;"><a title="Login a Second Life" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/uploads/Mono1.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/uploads/Mono1.jpg" alt="Login a Second Life" /></a></p>
<p>Una volta dentro Second Life dobbiamo assicurarci di essere in una Land con server compatibile con Mono. Dal menù &#8220;Help&#8221; selezioniamo &#8220;About Second Life&#8230;&#8221;, ci verrà visualizzata la seguente immagine.</p>
<p style="text-align: center;"><a title="About Second Life" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/uploads/Mono2.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/uploads/Mono2.jpg" alt="About Second Life" /></a></p>
<p>Tra tutte le scritte presenti facciamo caso alla prima &#8220;Second Life 1.21.0 (94415)&#8221; che indica la versione del Viewer (che ricordo deve essere maggiore o uguale alla 1.21 per far compilare in Mono) e la scritta &#8220;Second Life Server 1.24.0.94778&#8243; che indica la versione del server.</p>
<p>Per far girare e per far compilare gli script con Mono, il server deve avere la versione maggiore o uguale a 1.24. Server più vecchi non sono compatibili con Mono.</p>
<p>Cerchiamo quindi una Land con installata una versione del server compatibile con Mono (io sono andato a <a href="http://slurl.com/secondlife/Sandbox%20Island/128/128/25">Sandbox Island</a>). Notiamo subito che quando cambiamo versione del server il viewer ci avvisa con un messaggio:</p>
<p style="text-align: center;"><a title="Popup cambio server" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/uploads/Mono3.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/uploads/Mono3.jpg" alt="Popup cambio server" /></a></p>
<p>Adesso non ci resta che creare un oggetto, aggiungere uno script e verificare che la spunta sulla casella Mono sia abilitata come mostrato in figura</p>
<p style="text-align: center;"><a title="Mono abilitato" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/uploads/Mono4.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/uploads/Mono4.jpg" alt="Mono abilitato" /></a></p>
<p>Ed ecco che il nostro script è pronto!</p>
<p>Dopo aver testato il nostro oggetto, portiamolo in una land non compatibile con Mono (versione del server minore a 1.24)&#8230; noteremo che il nostro script non funziona più, e se proviamo ad aprire in modifica la casella Mono è disabilitata.</p>
<p style="text-align: center;"><a title="Mono non abilitato" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/uploads/Mono5.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/uploads/Mono5.jpg" alt="Mono non abilitato" /></a></p>
<p>Concludendo, Mono risulta essere estremamente più veloce della vecchia macchina virtuale. I primi test che ho fatto dimostrano una velocità di esecuzione più che raddoppiata. L&#8217;unica pecca è una mancata segnalazione di script Mono non funzionanti in zone non compatibili (non viene visualizzato nessun errore nemmeno nella consolle di debug!)&#8230; ma è un problema da poco visto che il Viewer ufficiale sarà rilasciato esclusivamente dopo che tutte le sim saranno coperte dalla nuova macchina virtuale e che la copertura dovrebbe essere abbastanza rapita!</p>
<p>Enjoy with Mono!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/08/21/compilare-con-mono/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pecoroni da Blog</title>
		<link>http://www.marcoduff.com/2008/07/14/pecoroni-da-blog/</link>
		<comments>http://www.marcoduff.com/2008/07/14/pecoroni-da-blog/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 09:30:24 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>
		<category><![CDATA[WolfDuff]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=54</guid>
		<description><![CDATA[
Girovagando sulla rete mi sono imbattuto nella definizione di &#8220;Comportamento del gregge&#8221; che si contrappone alla parola &#8220;Branco&#8221;.
Citando da Wikipedia:

Comportamento del gregge è un termine usato per descrivere situazioni in cui un gruppo di individui reagisce coerentemente, senza che ci sia alcun coordinamento tra i singoli individui. Un tale gruppo viene chiamato gregge. Il termine [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Pecoroni da Blog" rel="lightbox" href="http://www.parc-camargue.fr/Francais/images/pecoroni.jpg"><img class="border" src="http://www.parc-camargue.fr/Francais/images/pecoroni.jpg" alt="" width="400" /></a></p>
<p style="text-align: left;">Girovagando sulla rete mi sono imbattuto nella definizione di &#8220;Comportamento del gregge&#8221; che si contrappone alla parola &#8220;Branco&#8221;.</p>
<p>Citando da Wikipedia:</p>
<blockquote>
<p style="text-align: left;">Comportamento del gregge è un termine usato per descrivere situazioni in cui un gruppo di individui reagisce coerentemente, senza che ci sia alcun coordinamento tra i singoli individui. Un tale gruppo viene chiamato gregge. Il termine viene usato unanimemente per descrivere il comportamento degli animali all&#8217;interno del gregge o dello stormo, e più controversamente per descrivere alcuni tipi di fenomeni umani quali le bolle speculative e il comportamento nelle dimostrazioni politiche.</p>
</blockquote>
<p style="text-align: left;">applicando il comportamento del gregge alle società umane abbiamo&#8230;</p>
<blockquote>
<p style="text-align: left;">La frase &#8220;comportamento del gregge&#8221; ha acquisito una certa popolarità nell&#8217;ambito della psicologia popolare, dove l&#8217;idea di un istinto del gregge viene offerta come spiegazione di fenomeni come le follie collettive, dove grandi numeri di persone agiscono allo steso modo nello stesso momento. Tali persone vengono talvolta etichettate con il termine dispregiativo di &#8220;pecoroni&#8221;.</p>
<p>Una follia è una moda eccessiva o una mania collettiva dovuta al comportamento del gregge. Alcune follie hanno conseguenze lievi (mode), ma altre portano agli eccessi dell&#8217;isteria collettiva. Gli psicologi popolari descrivono questo come qualcosa che coinvolge la scomparsa della personalità individuale, con una regressione a un qualche inferiore denominatore istintivo emotivo descritto come &#8220;sentimento della folla&#8221;. La prova che esista un qualsiasi reale processo psicologico di questa natura è, ad ogni modo, debole e in molti casi il termine &#8220;comportamento del gregge&#8221; è decisamente inappropriato per il fenomeno, in quanto il gruppo reagisce in base agli ordini o all&#8217;influenza di un capo carismatico (si veda carisma).</p>
<p>Esempi di fenomeni che sono stati descritti come coinvolgenti il comportamento del gregge includono le bolle speculative i crolli in borsa, la violenza di strada, la demonizzazione e la persecuzione delle minoranze, e lo zelotismo politico o religioso. In realtà questi comportamenti possono avere poco in comune oltre al fatto superficiale che tutti coinvolgono un certo numero di individui che fanno più o meno la stessa cosa, e l&#8217;estensione con la quale possono essere ragionevolmente descritti come &#8220;comportamenti del gregge&#8221; varia. Attribuire tali comportamenti collettivi a una &#8220;mentalità di branco&#8221; o a una &#8220;mente di gruppo&#8221; spiega poco e può facilmente distrarre l&#8217;attenzione dalla vera spiegazione per le azioni del gruppo. I seguenti esempi illustrano l&#8217;estensione dei fenomeni a cui in vari periodi è stata appiccicata l&#8217;etichetta di &#8220;comportamento del gregge&#8221;.</p></blockquote>
<p style="text-align: left;">Possiamo quindi astrarre il concetto di &#8220;Pecoroni da Blog&#8221;.</p>
<p>Il Pecorone da Blog è quindi composto da svariati elementi folli, violenti, demoniaci, perseguitati e zeloti. Portando per eccesso il concetto, abbiamo visto, che l&#8217;insieme dei Pecoroni forma a sua volta un Branco!</p>
<p>Che dire&#8230; &#8220;Il Lupo si morde la coda&#8221;!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/07/14/pecoroni-da-blog/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Quarta Lezione di LSL</title>
		<link>http://www.marcoduff.com/2008/06/17/quarta-lezione-di-lsl/</link>
		<comments>http://www.marcoduff.com/2008/06/17/quarta-lezione-di-lsl/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 15:32:36 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Lezioni LSL]]></category>
		<category><![CDATA[Scripting LSL]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=49</guid>
		<description><![CDATA[
Quarta lezione di LSL sempre alla Land del Forum!
Argomento della lezione, questa volta, la comunicazione interna in un oggetto. Come già detto in passato, un oggetto in Second Life è formato da uno o più prim linkati tra di loro. L&#8217;ordine dell&#8217;operazione di link, effettuata selezionando tutti i prim e premento CTRL + L, imposta [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Quarta Lezione di Scripting LSL" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/gallery/secondlife/snapshot_011.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/gallery/secondlife/snapshot_011.jpg" alt="" width="400" /></a></p>
<p>Quarta lezione di LSL sempre alla <a href="http://slurl.com/secondlife/Beech/18/136/22" target="_blank">Land del Forum</a>!</p>
<p>Argomento della lezione, questa volta, la comunicazione interna in un oggetto. Come già detto in passato, un oggetto in Second Life è formato da uno o più prim linkati tra di loro. L&#8217;ordine dell&#8217;operazione di link, effettuata selezionando tutti i prim e premento CTRL + L, imposta il numero del link. In particolare, l&#8217;ultimo link selezionato sarà il prim root, ovvero il prim con il numero di link uguale ad 1, tutti gli altri saranno i prim child, con il numero di link decrescente rispetto alla selezione (il penultimo linkato ha valore 2, il precedente 3, e cosi via).</p>
<p>Per scoprire il numero di link abbiamo creato un oggetto formato da tre prim:</p>
<ul>
<li>Un cubo come prim root;</li>
<li>Due piramidi con le basi adiacenti a due facce opposte del cubo come child.</li>
</ul>
<p>Per fare delle prove abbiamo applicato a questi tre prim il seguente script:</p>
<pre>default {
	touch_start(integer total_number) {
		string agentName = llDetectedName(0);
		integer linkNumber = llGetLinkNumber();
		llSay(PUBLIC_CHANNEL, agentName+" ha toccato il prim con il link number uguale a "+(string)linkNumber);
	}
}</pre>
<p>La funzione llGetLinkNumber() ci restituisce infatti il numero del link in cui sta girando lo script.</p>
<p>Effettuando la separazione dei link, ovvero premento CTRL + SHIFT + L, abbiamo ripetuto il test ed abbiamo notato che il numero di link è pari a 0.</p>
<p>Quindi siamo arrivati alla seguente conclusione: se un oggetto è formato da un unico prim, questo ha numero prim uguale a 0, mentre, se l&#8217;oggetto è formato da due o più prim, l&#8217;ultimo oggetto selezionato ha valore 1 ed è il prim root, tutti gli altri hanno valore maggiore di 1, in base alla selezione, e sono i prim child.</p>
<p>Detto questo abbiamo posto la nostra attenzione verso un&#8217;altra funzione di sistema: llMessageLinked, la cui firma è llMessageLinked(integer linknum, integer num, string str, key id).</p>
<p>Questa funzione viene utilizzata per fare comunicare i prim che formano un oggetto. Il primo parametro, infatti, indica il numero del link del prim destinatario del messaggio. Il primo parametro, oltre al numero secco del prim, accetta anche le seguenti costani:</p>
<ul>
<li>LINK_ROOT: per comunicare con il prim root (ovviamente, come abbiamo visto, questa costante assume valore 1);</li>
<li>LINK_SET: per comunicare con tutti i prim che costituiscono l&#8217;oggetto;</li>
<li>LINK_ALL_OTHERS: per comunicare con tutti i prim diversi da quello in cui sta girando lo script;</li>
<li>LINK_ALL_CHILDRENS: per comunicare con tutti i prim child;</li>
<li>LINK_THIS: per comunicare con lo stesso link in cui sta girando lo script.</li>
</ul>
<p>I rimanenti tre paramentri della funzione llMessageLinked servono appunto per passare il messaggio. Possiamo passare contemporaneamente un intero, una stringa e una key rispettivamente nelle variabili num, str e id.</p>
<p>Il nostro obiettivo è creare tre script da inserire nei tre prim che costituiscono il nostro oggetto. Due script molto simili da applicare nelle piramidi per simulare delle frecce, ed uno script nel cubo (il prim root) che riceve i messaggi.</p>
<p>Il particolare, gli script delle piramidi devono essere sensibili al tocco di un agent e devono inviare al prim root il numero 1 o -1 in caso sia la freccia Indietro o Avanti, il nome dell&#8217;agent che ha toccato il prim e la key dello stesso.</p>
<p>Lo script per la freccia indietro risulta quindi essere il seguente:</p>
<pre>default {
	state_entry() {
		llSetText("Indietro",&lt;1.0,1.0,1.0&gt;,1.0);
	}

	touch_start(integer total_number) {
		key agentKey = llDetectedKey(0);
		string agentName = llDetectedName(0);
		llMessageLinked(LINK_ROOT,-1,agentName,agentKey);
	}
}</pre>
<p>mentre lo script per la freccia avanti è il seguente:</p>
<pre>default {
	state_entry() {
		llSetText("Avanti",&lt;1.0,1.0,1.0&gt;,1.0);
	}

	touch_start(integer total_number) {
		key agentKey = llDetectedKey(0);
		string agentName = llDetectedName(0);
		llMessageLinked(LINK_ROOT,1,agentName,agentKey);
	}
}</pre>
<p>Notate che la prima manda come intero il messaggio -1, mentre la seconda 1.</p>
<p>Lo script posizionato nel cubo, invece, non fa altro che leggere l&#8217;input del messaggio e visualizzarlo come testo.</p>
<p>Ogni volta che viene ricevuto un messaggio inviato tramite llMessageLinked, viene sollevato l&#8217;evento link_message(integer sender_num, integer num, string str, key id).</p>
<p>Se notate bene, i parametri di ingresso sono del tutto analoghi a llMessageLinked, fatta eccezione per il primo. Questa volta, infatti, il primo paramentro identifica il numero del link del prim mittente del messaggio. I restanti parametri contengono rispettivamente il numero, la stringa e la key inviata dal prim mittente.</p>
<p>Lo script risultante, da inserire nel prim cubo, risulta quindi essere:</p>
<pre>default {
	state_entry() {
		llSetText("In attesa che qualcuno tocchi le freccie!",&lt;1.0,1.0,1.0&gt;,1.0);
	}

	link_message(integer sender_number, integer number, string message, key id) {
		llSetText("Il link numero "+(string)sender_number+" mi ha mandato il messaggio ("+(string)number+","+message+","+(string)id+")",&lt;1.0,1.0,1.0&gt;,1.0);
	}
}</pre>
<p>Questo oggetto sarà molto utile la prossima lezione, dove lo utilizzeremo per spiegare le liste!</p>
<p>Alla prossima lezione!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/06/17/quarta-lezione-di-lsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Il Secondo Mondo cambia in Mono!</title>
		<link>http://www.marcoduff.com/2008/06/12/il-secondo-mondo-cambia-in-mono/</link>
		<comments>http://www.marcoduff.com/2008/06/12/il-secondo-mondo-cambia-in-mono/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 12:41:07 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Second Life]]></category>
		<category><![CDATA[Scripting LSL]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=44</guid>
		<description><![CDATA[
Finalmente siamo vicini alla transazione verso Mono. Questa è prevista con la versione 1.21 del viewer.
Vediamo di capire nel dettaglio come funziona l&#8217;architettura di Second Life sotto il punto di vista degli Script, i motivi del cambiamento, cosa c&#8217;è attualmente, cosa cambierà.
Ogni volta che scriviamo uno script questo viene compilato in un linguaggio particolare, tecnicamente [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Mono" rel="lightbox" href="http://www.go-mono.com/docs/images/mono-logo.png"><img class="border aligncenter" src="http://www.go-mono.com/docs/images/mono-logo.png" alt="Mono" /></a></p>
<p style="text-align: left;">Finalmente siamo vicini alla transazione verso <a href="http://www.mono-project.com/Main_Page" target="_blank">Mono</a>. Questa è prevista con la versione 1.21 del viewer.</p>
<p>Vediamo di capire nel dettaglio come funziona l&#8217;architettura di Second Life sotto il punto di vista degli Script, i motivi del cambiamento, cosa c&#8217;è attualmente, cosa cambierà.</p>
<p>Ogni volta che scriviamo uno script questo viene compilato in un linguaggio particolare, tecnicamente chiamato bytecode, che deve essere interpretato da una entità chiamata &#8220;Macchina Virtuale&#8221;. A questa spetta l&#8217;onere di eseguire lo script.</p>
<p>Il Server che si occupa dell&#8217;esecuzione del bytecode è sempre il server della regione in cui si trova attualmente lo script.<br />
Quindi, nel caso di attachment scriptati, dopo un teleport o un passaggio tra due regioni adiacenti c&#8217;è un passaggio di consegna tra due server. Il primo impacchetta le informazioni e le passa al secondo che continua l&#8217;esecuzione.</p>
<p>Come già accennato, su ogni server è presente una Macchina Virtuale, il cui unico scopo è interpretare il bytecode ed eseguirlo.</p>
<p>In questo momento, l&#8217;unica macchina virtuale esistente è quella nativa della Linden. Questa è stata pensata per un basso numero di script in esecuzione e per script relativamente semplici.</p>
<p>Con l&#8217;evoluzione di Second Life, gli script sono diventati sempre più complessi, pesanti e quindi la macchina virtuale esistente risulta essere inadeguata. A complicare il tutto si è aggiunto il nuovo motore fisico, sicuramente più preciso e realistico del precedente, ma anche più pesante.</p>
<p>Il pensiero è quindi quello di cambiare totalmente lo strato della macchina virtuale. Sostituirla, quindi, con una più efficiente e dalle prestazioni maggiori. La scelta è ricaduta su Mono, attualmente disponibile nella <a href="http://secondlife.com/support/downloads.php" target="_blank">versione Beta del client di Second Life</a> (ovvero il client che fa girare Second Life sulla BETA Grid e non sulla Main Grid).</p>
<p>La difficoltà nel passaggio tra le due macchine virtuali sta, ovviamente, nella incompatibilità tra i due bytecode. L&#8217;obiettivo di Linden è quello di creare un compilatore capace di generare un bytecode compatibile sia con la vecchia versione sia con la versione mono.</p>
<p>Nel periodo di transizione sarà utilizzata la tecnica chiamata Het Grid. Ovvero una griglia capace di far girare alcune regioni sotto un simulatore (attualmente Havok 4) e altre regioni sotto Mono. Ad ogni teleport, verrà segnalato all&#8217;agent l&#8217;eventuale passaggio di simulatore.<br />
A poco a poco verranno coperte tutte le regioni dalla macchina virtuale mono ed, appena il passaggio verrà ultimato, la vecchia macchina virtuale verrà definitivamente deprecata.</p>
<p>Secondo i primi benchmarck della Linden, la macchina virtuale Mono risulta essere ben 220 volte più veloce della vecchia macchina virtuale. Se questo fosse vero, diciamo che il lag sarà un lontano ricordo almeno per qualche mese (il tempo di sfruttare al massimo le nuove potenzialità).</p>
<p>Permettetemi una critica al numero 220&#8230; il test prestazionale è stato fatto sicuramente sulla Beta Grid, notoriamente meno affollata della Main Grid, quindi l&#8217;unico dubbio è vedere come si comporta sotto sforzo Mono.</p>
<p>Per provare i nostri vecchi script sotto la nuova macchina virtuale Mono, ci basta:</p>
<ul>
<li> Scaricare la versione BETA del client</li>
<li>Teletrasportarci su una regione abilitata a Mono, Linden segnala le seguenti:<br />
- Sandbox Cordova MONO;<br />
- Sandbox Goguen MONO;<br />
- Sandbox Newcomb MONO;<br />
- Sandbox Wanderton MONO.</li>
<li> Editare lo script ed abilitare la casella Mono e salvare, come già accennato, infatti, il vecchio bytecode NON è compatibile, quindi dobbiamo ricompilare tutti i nostri script affinché possano girare correttamente sotto Mono (se la casella è oscurata, vuol dire che non siamo in una regione compatibile con mono);<br />
- Attenzione che dopo aver compilato il codice sotto Mono, quegli script funzioneranno esclusivamente in regioni compatibili con questo!</li>
</ul>
<p>Andiamo adesso nel dettaglio le differenze di Mono rispetto alla vecchia macchina virtuale LSL:</p>
<ul>
<li> La sintassi, gli stati, le funzioni, gli eventi del Linguaggio LSL sono le stesse nelle due macchine virtuali, quindi continueremo a scrivere gli script esattamente come abbiamo fatto fino ad adesso, quello che cambia è il compilatore (quindi il bytecode generato) e la macchina virtuale. In poche parole, il programmatore non si rende conto di nulla, visto che tutti i cambiamenti concentrati dopo il click al pulsante Save degli script;</li>
<li> Maggiore velocità di esecuzione, Linden dichiara che la macchina virtuale Mono è fino a 220 volte più veloce della vecchia macchina virtuale;</li>
<li> Maggiore memoria nei nostri script, fino a 64Kb rispetto ai vecchi 16Kb;</li>
<li> Gestione dinamica della memoria, probabilmente verrà incrementata la potenza della funzione llGetFreeMemory che potrà restituire lo stato effettivo della memoria e non soltanto il picco;</li>
<li> Tutti gli script compilati con il vecchio compilatore dovranno essere ricompilati sotto Mono (semplicemente aprendoli e cliccando su Save dopo aver selezionato la casella Mono, o utilizzando il Tool messo a disposizione del nuovo client per compilare contemporaneamente più tool). Di contro, gli script compilati sotto Mono non funzioneranno in regioni in cui gira la vecchia macchina virtuale e viceversa.</li>
<li> I vecchi script continueranno a funzionare ancora per lungo tempo, la vecchia macchina virtuale verrà dismessa, alleggerendo l&#8217;architettura, solo dopo che Mono avrà coperto tutta la Main Grid;</li>
<li> La macchina virtuale Mono è capace di interpretare e compilare codice proveniente anche da altri linguaggi come lisp, javascript, phyton. Ma,per il momento, non è prevista una espansione per linguaggi diversi dall&#8217;LSL.</li>
<li> Il codice verrà compilato direttamente dai server Linden, non dal client come avviene adesso. Questo significa un alleggerimento dei client ed una maggiore sicurezza nel controllo del codice scritto (non sarà più possibile infatti inviare bytecode dal client).</li>
</ul>
<p>Concludendo non posso che darvi un consiglio: per il momento ignorate Mono!<br />
Sicuramente questo è più veloce e performante, ma ci vorrà del tempo affinché tutta la Main Grid sarà coperta dalla macchina virtuale Mono e quindi si corre il rischio di avere degli script che funzionano in pochissime regioni e non funzionano nella maggior parte.<br />
Inoltre, le potenzialità di Mono non sono attualmente disponibili, il linguaggio è lo stesso e le librerie di sistema non sono ancora state adattate per sfruttare al massimo tutte le potenzialità offerte.</p>
<p>Quindi, meglio attendere un poco!</p>
<p>Maggiori informazioni si possono trovare nel <a href="http://wiki.secondlife.com/wiki/Mono" target="_blank">wiki ufficiale della Linden</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/06/12/il-secondo-mondo-cambia-in-mono/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terza Lezione di LSL</title>
		<link>http://www.marcoduff.com/2008/06/12/terza-lezione-di-lsl/</link>
		<comments>http://www.marcoduff.com/2008/06/12/terza-lezione-di-lsl/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 22:52:12 +0000</pubDate>
		<dc:creator>MarcoDuff</dc:creator>
				<category><![CDATA[Lezioni LSL]]></category>
		<category><![CDATA[Scripting LSL]]></category>

		<guid isPermaLink="false">http://www.marcoduff.com/?p=43</guid>
		<description><![CDATA[
Terza lezione di LSL alla Land del Forum!
Abbiamo continuato il discorso iniziato alla seconda lezione di LSL: la Comunicazione.
Ovvero come fa un oggetto ad ascoltare su di un canale ed a rispondere. Abbiamo creato due oggetti: il primo che ascolta su un canale, il secondo che appena toccato parla sullo stesso canale.
In questo modo abbiamo [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Terza Lezione di LSL" rel="lightbox" href="http://www.marcoduff.com/blog/wp-content/gallery/secondlife/snapshot_010.jpg"><img class="border" src="http://www.marcoduff.com/blog/wp-content/gallery/secondlife/snapshot_010.jpg" alt="Terza Lezione di LSL" width="400" /></a></p>
<p>Terza lezione di LSL alla <a href="http://slurl.com/secondlife/Beech/18/136/22" target="_blank">Land del Forum</a>!</p>
<p>Abbiamo continuato il discorso iniziato alla seconda lezione di LSL: la Comunicazione.</p>
<p>Ovvero come fa un oggetto ad ascoltare su di un canale ed a rispondere. Abbiamo creato due oggetti: il primo che ascolta su un canale, il secondo che appena toccato parla sullo stesso canale.</p>
<p>In questo modo abbiamo simulato la comunicazione tra i due oggetti. Il progetto consiste in due oggetti distinti, ognuno con il proprio script, che comunicano tra di loro.</p>
<p>Il primo script inizializza un listener tramite la chiamata a funzione llListen sul canale 1234567890. Al listen non vengono applicati filtri, quindi qualunque agent può interagire con esso.<br />
Dentro l&#8217;evento listen è stata inserita una chiamata a funzione llSay su canale PUBLIC_CHANNEL (ovveo il canale 0), per avere un feedback del messaggio ascoltato.</p>
<pre>integer CHANNEL = 1234567890;

default {
    state_entry() {
        key owner = llGetOwner();
        llSetText("Oggetto che riceve di "+llKey2Name(owner),&lt;0.0,1.0,0.0&gt;,1.0);
        llListen(CHANNEL,"",NULL_KEY,"");
    }

    listen(integer channel, string name, key id, string message) {
        llSay(PUBLIC_CHANNEL,name+" mi ha detto \""+message+"\" sul canale "+(string)channel);
    }

    changed(integer change) {
        if(change &amp; CHANGED_OWNER) llResetScript();
    }
}</pre>
<p>Il secondo script si occupa di attendere un click dal proprietario dell&#8217;oggetto per inviare nel canale prestabilito la stringa &#8220;NOME_AGENT mi ha toccato!&#8221;. In questo modo, questa stringa verrà intercettata dallo script del primo oggetto!</p>
<pre>integer CHANNEL = 1234567890;

default {
	state_entry() {
		key owner = llGetOwner();
		llSetText("Oggetto che invia di "+llKey2Name(owner),&lt;1.0,0.0,0.0&gt;,1.0);
	}

	touch_start(integer total_number) {
		key agent = llDetectedKey(0);
		if(agent==llGetOwner()) {
			llOwnerSay("Invio messaggio '"+llKey2Name(agent)+" mi ha toccato!' sul canale "+(string)CHANNEL);
			llSay(CHANNEL, llKey2Name(agent)+" mi ha toccato!");
		}
		else {
			llInstantMessage(agent,"Non puoi toccare il mio oggetto!");
		}
	}

	changed(integer change) {
		if(change &amp; CHANGED_OWNER) llResetScript();
	}
}</pre>
<p>In tutti e due gli script è stata fatta un&#8217;aggiunta: l&#8217;evento changed. Questa è stata fatta per gestire un eventuale cambio di owner. In questo caso, infatti, l&#8217;intero script viene resettato per permettere la ridefinizione dei listener.</p>
<p>Possiamo provare il funzionamento del progetto in due modi:</p>
<ul>
<li>Cliccando sul secondo oggetto;</li>
<li>Parlando sul canale (nel nostro caso ci basta scrivere nella chat &#8220;/1234567890 Prova!&#8221;).</li>
</ul>
<p>Alla prossima lezione!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcoduff.com/2008/06/12/terza-lezione-di-lsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
