Seconda lezione di LSL

Giorno 26 Maggio si è tenuta la seconda lezione di LSL sempre alla Land del Forum. Oggetto della lezione, questa volta, la Comunicazione degli oggetti.

Abbiamo tre tipi fondamentali di comunicazione nel linguaggio LSL:

  • Comunicazione all’interno dell’oggetto, ovvero tra i prim che compongono l’oggetto;
  • Comunicazione tra un oggetto ed un altro oggetto o un Agent;
  • Comunicazione tra un oggetto e l’esterno.

Nella lezione ci siamo soffermati sulla comunicazione tra un oggetto e l’agent, ma abbiamo già predisposto l’oggetto per effettuare una comunicazione interna tra i prim che lo compongono. Abbiamo, infatti, creato un oggetto formato da due prim: un cubo come root e una piramide come child. Una primissima osservazione che abbiamo fatto è stata quella di notare la seguente differenza:

Uno script inserito nel prim root di un oggetto ha effetto su tutto l’oggetto, mentre uno script inserito in un prim child ha effetto esclusivamente su quel child.

Abbiamo notato questa differenza semplicemente inserendo lo script di default (quello che viene creato in automatico quando si crea un nuovo script) prima sul prim child e poi su quello root.

Ebbene, se inserito solo nel child ottenevamo la scritta “Touched.” esclusivamente se toccavamo il prim piramide dell’oggetto non nel cubo, mentre se inserito nel root ottenevamo la scritta “Touched.” sia se toccavamo la piramide sia se toccavamo il cubo.

Notata questa differenza, ci siamo inoltrati nello studio della Comunicazione tra oggetto ed Agent. Ci siamo quindi dedicati allo studio della funzione

integer llListen(integer canale, string nome, key id, string messaggio)

e del suo evento associato

listen(integer canale, string nome, key id, string messaggio)

I parametri di ingresso, come potete notare da soli, sono del tutto simili ed infatti assumono lo stesso significato:

Canale – Indica il canale di comunicazione. Vi ricordo che il canale pubblico ha valore 0 ed è identificato dalla costante PUBLIC_CHANNEL. Tutti gli altri canali, in un range compreso tra -2.147.483.648 a 2.147.483.647, sono i canali privati. Comunemente bisognerebbe utilizzare i canali negativi per interazioni tra oggetti e quelli positivi per interazioni con agent;
Nome – Indica il filtro di ascolto su un determinato nome;
Id – Indica il filtro di ascolto su una determinata key;
Messaggio – Indica il filtro su un determinato messaggio.

Il nostro intento è stato quello di creare uno script in ascolto su un canale privato della parola “Ciao” detta dall’owner, al quale l’oggetto doveva rispondere con messaggio “Ciao a te!” diretto esclusivamente
all’owner.

Abbiamo dovuto applicare i seguenti filtri alla funzione llListen:
Canale = 1
Nome = “”
Key = llGetOwner()
Messaggio = “Ciao”

Ovvero, abbiamo usato il canale 1, non abbiamo specificato il nome ma la key dell’owner dell’oggetto (recuperata in automatico grazie alla funzione llGetOwner()), ed abbiamo aggiunto il filtro “Ciao” al messaggio.

Tradotto in LSL, il comando da eseguire per impostare un ascoltatore è il seguente:

integer handler = llListen(1, "", llGetOwner(), "Ciao")

questo comando restituisce un handler dell’ascoltatore. Questo può essere usato per disattivare l’ascoltatore in un altro punto del codice. In questo nostro semplice script, abbiamo ignorato l’handler.

Una volta che abbiamo impostato il nostro ascoltatore, non ci resta che rispondere “Ciao a te!” quando viene sollevato l’evento ed il gioco è fatto!

Questo è lo script risultante:

default {
	state_entry() {
		llListen(1, "", llGetOwner(), "Ciao");
	}

	listen(integer canale, string nome, key id, string messaggio) {
		llOwnerSay("Ciao a te!");
	}
}

Per poterlo provare ci basta scrivere:

/1 Ciao

(vi ricordo che il “/1” iniziale significa “ridirigi questa stringa sul canale 1”. Infatti, questa comunicazione non viene letto in modo diretto da nessun agent, non essendo fatta nel canale pubblico).

Ricordatevi che c’è differenza tra “Ciao”, “CIAO” e “ciao”… il nostro script funziona solo con la prima stringa visto che il linguaggio LSL è case-sensitive!

Se tutto va bene il nostro oggetto ci risponderà con “Ciao a te!” e noi abbiamo completato con successo la nostra comunicazione tra Agent e Oggetto!

Alla prossima lezione!

Concerto di Vasco

Vasco Rossi

Ebbene si… Vado al concerto di Vasco Rossi… GRATIS! 😯

L’azienda dove lavoro, infatti, mette in premio dei biglietti… ed io li ho vinti!!!

Il concerto si terrà giorno 30 Maggio allo Stadio Olimpico di Roma… ed io sarò li!

🙂

Memoria Virtuale di Windows XP

Questo articolo spiega come ottimizzare le prestazioni del nostro sistema Windows XP migliorando la gestione della memoria virtuale.

Questo sistema, utilizzato e consigliato da sempre nei sistemi Linux, consiste nel creare una partizione ad hoc per la memoria virtuale di Windows, ovvero creare quella che viene definita la partizione di Swap.

Prima di procedere, vediamo di capire meglio in cosa consiste il problema.

Ogni sistema ha un quantitativo di memoria volatile, ovvero la memoria RAM, limitato. Quando la capacità di questa memoria volatile si esaurisce, il sistema operativo applica una politica di paginazione: copia i dati meno utilizzati che occupano spazio nella memoria volatile, portandoli in nella memoria di massa, ovvero il nostro disco rigido. Operazioni di questo tipo sono molto comuni nel ciclo di vita di una sessione, quindi il sistema operativo è costretto ad applicare questa politica abbastanza spesso.

Questo continuo movimento di dati, scrittura e lettura dal nostro disco fisso, rallenta il sistema e aumenta il rischio di frammentazione del disco. Per questo motivo, è preferibile utilizzare una partizione del nostro disco totalmente ed esclusivamente dedicata al file di paginazione.

L’ideale, ovviamente, sarebbe di non avere nessun file di paginazione… ma questo significa avere un quantitativo di ram tale da non richiedere questa operazione. Se non si dispone di un quantitativo di RAM tale da annullare la paginazione, conviene almeno limitare i danni della frammentazione creando una partizione dedicata a questo scambio di dati tra RAM e disco fisso.

Dialog Memoria VirtualeL’operazione da compiere è semplice, ma servono un solo requisito. Una partizione di dimensione doppia rispetto alla RAM installata può bastare. Ci basta andare sulle proprietà delle risorse del computer, pagina Avanzate, pulsante Impostazioni dell’area prestazioni, pagina Avanzate e pulsante Cambia dell’area Memoria Virtuale. In questa notiamo che attualmente il nostro file di paginazione risiede nella stessa unità del sistema operativo, quello che ci interessa conoscere, per il momento, è che consiglio ci da il nostro sistema operativo per la dimensione minima della nostra partizione dedicata. Prendiamo nota quindi del numero in MB dell’etichetta Consigliata nell’area Dimensioni totali file di paging per tutte le unità. Nella figura, risulta essere 3070MB. Andiamo a creare una partizione da Pannello di controllo, Prestazioni e manutenzione, Strumenti di amministrazione, Gestione computer, Gestione disco. Li creiamo una nuova partizione. Le dimensioni consigliate della partizione sono il doppio della nostra RAM o il doppio di quella consigliata da Windows. Nel mio caso, ho creato una partizione di 6077 MB per il mio file di paginazione.

Ultimata la fase di creazione della paginazione possiamo tornare alle impostazioni della memoria virtuale. Indichiamo che la partizione contenente il sistema operativo non deve contenere nessun file di paging, ed impostiamo un file di paging a dimensioni fisse nella partizione dedicata con Dimensioni iniziali uguali a quelle consigliate e Dimensioni massime uguali alla dimensione della partizione meno 5 MB (tutte le partizioni Windows, infatti, devono sempre avere almeno 5 MB liberi).

Al prossimo avvio di Windows avremo il nostro file di paginazione (pagefile.sys) confinato nella partizione di swap e il nostro disco non soffrirà molto meno, aumentando le sue prestazioni, di prima per il problema della frammentazione dei file.

A questo punto, meglio fare partire una deframmentazione del disco (sempre da Gestione computer, Utilità di deframmentazione dischi) per sistemare i danni causati dal file di paginazione in un luogo non a lui dedicato!

!!! Aggiornamento !!!

Dopo i commenti di Giuffrolo, che ringrazio, aggiungo che per ottimizzare il procedimento conviene

  • Disabilitare l’indicizzazione della partizione di swap (Risorse del computer -> Pulsante destro sulla partizione di swap creata -> Proprietà -> Togliere la spunta da “Indicizza il disco per una ricerca rapida dei file”);
  • Creare la partizione di swap prima possibile, possibilmente subito dopo la partizione del disco che contiene il Sistema Operativo;
  • Rendere le dimensioni della partizione fissa, impostando la dimensione iniziale uguale alla dimensione massima pari alla dimensione della partizione meno 5 MB.

Cambio di stile

Openswitch.org Logo

Ebbene si, ogni tanto un cambiamento ci vuole proprio… certo, magari è arrivato un poco troppo presto (o forse troppo tardi se guardate l’orario), ma finalmente ho trovato l’assetto definitivo per il mio Blog!

Ho cambiato il tema e, tra tutti quelli che ho visto in giro, ho scelto il bellissimo (almeno per me) tema di Openswitch chiamato unsleepable (a detta dell’autore, la scelta del nome è causato proprio dalle tanti notti insonni passate alla progettazione del tema stesso!).

Devo dire che, prima di vederlo in funzione, ho dovuto applicare e create un poco di fix per i bug (non tutti ancora risolti, anzi se qualche cosa non funziona vi prego di segnalarmelo!). Ho creato la nuova intestazion e mi sono dedicato anche alla traduzione in italiano di tutto il tema, creando i file .po e .mo che ho proprio intenzione di passare all’autore!

Allora che dire… spero tanto che il nuovo tema vi piaccia… a voi le eventuali critiche!

Ciau!

Prima lezione di LSL

Lezione di LSL alla Land del Forum

Giorno 19 Maggio alle 21:30 si è tenuta la prima Lezione di Scripting LSL alla Land del Forum. Era la prima lezione ufficiale, in passato ne avevo tenuta un’altra per fare delle prove generali. Devo dire che nel complesso tutto è andato bene! Alcuni miei problemi legati al client: ho avuto tre crash e addirittura una schermata blu… ma forse quello è più un problema di Vista!

Il log completo della serata e tutte le foto della serata, compresa questa nel mio blog, sono disponibili nel Blog di Eleonora Porta.

Il tema della serata è stato quello di spiegare, banalmente, come è strutturato un listato LSL: che cosa sono gli stati, che cosa sono gli eventi, che cosa sono le funzioni. Fatto questo ci siamo dedicati allo studio di una funzione in particolare: llSetText, utile per visualizzare un testo sopra un prim. La firma della funzione è la seguente:

llSetText(string testo, vector colore, float alpha)

Testo – Indica il testo da visualizzare sopra il prim;
Colore – Indica il colore del testo nelle componenti RGB;
Alpha – Indica il livello di trasparenza in percentuale (1.0 totalmente opaco, 0.0 trasparente).

Molti dubbi sono nati con l’utilizzo del colore. Infatti, non si riesce a capire infatti come rappresentare un colore attraverso tre numeri. La questione è più semplice di quello che sembra. La totalità dei colori rappresentabili non sono altro che una combinazione dei tre colori del modello RGB (Red, Green, Blue).

Per fare qualche esempio:
la totale assenza dei tre colori indica il Nero;
la presenza contemporanea massima dei tre colori indica il Bianco;
la presenza massima delle sole componenti Red è Green indica il Giallo.

Quindi ci basta mischiare nella variabile vector colore la presenza in percentuale dei vari colori, per ottenere il colore voluto.

Alla fine della lezione abbiamo ottenuto il seguente codice:

default {
	state_entry() {
		llSetText("Esempio prima lezione LSL!",<1.0,0.0,0.0>,1.0);
	}
}

che visualizza il testo “Esempio prima lezione LSL!” di colore rosso sopra il prim.

Ringrazio tutti gli intervenuti alla Lezione e rinnovo l’appuntamento per la seconda lezione!