EagleNet: aggiornamento!

16 08 2008

google_translate.gif Translate To English!

Status attuale

Il lavoro procede senza sosta! E’ un software per me molto importante.

Ho completato il “core” del sistema (il motore del programma).  Attualmente il core gira senza problemi sia su Windows (Windows XP e Windows Vista) che su Linux (lo sviluppo avviene su piattaforma Linux Ubuntu 8.04, con kernel 2.6.24. Funziona correttamente sia su Gnome che KDE 3.5. (non dovrebbero comunque esserci problemi a farlo funzionare su KDE 4).

Il “core” attualmente gestisce…

  • Lo startup dell’engine;
  • Le opzioni della linea comando (il programma può funzionare sia come comando dato da console che con l’interfaccia grafica, simile ad un browser web).
  • L’apertura e la gestione della libraria newLisp (dll per Windows oppure so per Linux).
  • La comunicazione e le callback tra PureBasic e newLisp. Le callback funzionano perfettamente (la velocità è sorprendente).
  • La shared memory (permette lo scambio dati tra PureBasic e newLisp, e può gestire dati testuali e binari).

Il prossimo passo…

Ora sto sviluppando le funzioni che implementeranno la metodologia MVC, la creazione dell’interfaccia grafica (tramite l’innovativa tecnologia dei “magneti”, da me progettata). Riguardo la GUI e i “magnets”, non appena avrò implementato alcune funzioni minime, pubblicherò un articolo per spiegare in dettaglio il suo funzionamento ;-) (spero di riuscire anche a pubblicare un piccolo demo o qualche screenshot!).

A presto!





Callback e shared memory per scambio dati

15 08 2008

google_translate.gif Translate To English!

Salve, questo articolo si ricollega a quello che ho scritto un pò di tempo fà: Callback tra newLisp e Lazarus Pascal/Free Pascal/Delphi (prima parte).

Nel precedente articolo abbiamo visto come poter chiamare creare delle callback tra newLisp e Delphi/Free Pascal. Quello che però mancava era un sistema efficiente per scambiare dati tra i due linguaggi. In questo scambio dati dobbiamo anche tener presente che alcune volte le informazioni da scambiare potrebbero essere particolarmente voluminose (una immagine, un suono, etc…).

Visto che ho da poco ufficializzato lo sviluppo di EagleNet (progetto open source sviluppato con newLisp e Pure Basic), in questa seconda parte userò proprio Pure Basic (http://www.purebasic.com); non vi preoccupate però, in quanto i programmi di esempio presentati sono molto brevi, inoltre i concetti illustrati sono facilmente implementabili in quasi qualunque linguaggio.

Un pò di teoria

Per scambiare dati tra un programma newLisp e Pure Basic, in cui il software creato in Pure Basic usa newLisp come dll (oppure so nel caso di Linux), possiamo procedere in vari modi:

  1. La funzione newLisp chiama la callback e passa a PureBasic i dati sotto forma di argomenti della funzione chiamata.
  2. Creazione di un’area di memoria condivisa, accessibile sia da newLisp che da PureBasic.

Nel secondo caso, anche se dovremo “formattare” l’area di memoria (dobbiamo definire di volta in volta un formato dei dati che andremo a leggere/scrivere), avremo diversi vantaggi, tra cui:

  1. I dati non verranno mai copiati, guadagnando in velocità (soprattutto nello scambio di molti dati).
  2. Potremo scambiare agevolmente sia dati testuali che binari, senza dover ricorrere a stratagemmi particolari.
  3. Una shared memory è una memoria che possiamo “formattare” a nostro piacimento, così da non essere costretti a priori a definire il tipo di dato da scambiare (datatype primitivi oppure complessi).

Allocare la memoria in PureBasic

Prima di tutto dobbiamo creare, in Pure Basic, un’area di memoria, che useremo come shared memory.
Sarebbe opportuno allocare tale memoria nello heap-space e non nello stack (quando il linguaggio di programmazione che utilizzate vi permette di fare questa scelta!).

Per allocare memoria, si possono usare istruzioni come malloc() del C, oppure AllocateMemory() in PureBasic:

Global *sharedMemoryEagleNet = AllocateMemory(5000)
If Not *sharedMemoryEagleNet
  MessageRequester("Error", "Cannot allocate shared memory. EagleNet cannot continue.")
  End -100
EndIf

In questo esempio, ho allocato 5000 bytes. Se l’allocazione avverrà con successo, allora sharedMemoryEagleNet conterrà un puntatore alla prima locazione di memoria allocata. Alcuni linguaggi inizializzano la memoria allocata, altri no. Leggete quindi con attenzione il manuale delle API usate nel vostro linguaggio. Nel nostro caso la memoria è initizializzata con valori NULL – char(0) – nil.

Condividere la memoria con newLisp

Lo step successivo sarà quello di comunicare a newLisp, in qualche modo, dove si trova l’area di memoria da condividere. Per falro, potete usare il seguente codice newLisp:

(set 'gloSharedMem __gloSharedMem__)
(cpymem (pack "ld" <DO_SHARED_MEMORY> ) (+ (first (dump gloSharedMem)) 12) 4)

Il tag <DO_SHARED_MEMORY> và sostituito con un numero rappresentante la locazione di memoria inziale dell’area condivisa. Per usare quest’area dovrete successivamente fare riferimento alla variabile gloSharedMem.

Potete usare il codice seguente per sostituire a tale tag la locazione di memoria allocata:

myFile = ReplaceString(myFile, "<DO_SHARED_MEMORY>", Str(*sharedMemory))

Dove myFile contiene il codice newLisp mostrato in precedenza.

Come fà newLisp a scrievere in quest’area di memoria?

newLisp potrà scrivere in questa shared memory in modo molto semplice:

(cpymem (pack "ld" (length tmpData)) (address gloSharedMem) 4 )
(cpymem tmpData (address gloSharedMem) (length tmpData) )

Il codice newLisp appena presentato non farà altro che scrivere nella shared memory tutto ciò che è contenuto nella variabile tmpData. In pratica viene usata la funzione cpymem per copiare il contenuto di tmpData nella memoria in questione.
La funzione (address gloSharedMem) fornisce la prima locazione di memoria della shared memory.
FATE ATTENZIONE! Nel precedente codice non c’è nessun controllo sul numero di bytes scritti nella shared memory!! Fate i dovuti controlli o diventerete ben presto “prede” dei crackers!!!

Leggere la shared memory da PureBasic

Bene, ora newLisp ha messo dei dati nella shared memory, ma come posso rileggerli da Pure Basic?

Una difficoltà che potrete incontrare è “formattare” i dati della memoria condivisa, ovvero non leggere le informazioni in essa contenute come semplici sequenze di bytes, ma come blocchi di dati con un vero significato. Per esempio, allocando 100 bytes, io potrei utilizzarli per inviare una stringa da newLisp a PureBasic in questo  modo:

Locazioni:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
H  E  L  L  O     N  E  W  L  I  S  P  !

Ma potrei anche decidere di trasmettere due stringhe diverse in un sol colpo:
Locazioni:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
T  E  S  T  O  _  1  T  E  S  T  O  _  2

Nel secondo esempio, dalla locazione (offset rispetto l’indirizzo base allocato) inizia il secondo testo.

Per leggere il testo nel modo corretto, posso usare le strutture (structure, oppure i record del Pascal):

Structure TStructTesto
  nome1.s{7}
  nome2.s{7}
EndStructure

In questo modo ho definito una struttura che “formatta” dei dati: infatti i primi sette caratteri apparterranno al primo testo (nome1), mentre i sette caratteri successivi apparterranno al nome2.
Come usare tale struttura?

*memoria.TStructTesto = *sharedMemoryEagleNet
MessageRequester("newLisp", "Nome_1 -> " + *memoria\nome1)
MessageRequester("newLisp", "Nome_2 -> " + *memoria\nome2)

In pratica ho creato un puntatore che punta alla shared memory (prima riga dell’esempio). Tale puntatore accetta un datatype definito dalla mia structure.
Il codice *memoria\nome1 mi permette quindi di accedere al primo blocco di dati formattato (nome1). Per chi non conoscesse PureBasic, vi dico che la notazione *memoria\nome1 è analoga al “classico” *memoria->nome1 oppure memoria.nome1.

Con questo metodo potrete agevolmente leggere/scrivere dati nella shared memory, passando dati molto rapidamente da un linguaggio all’altro.

Questo è il modo che sto utilizzando io nel progetto EagleNet

A presto!!!





Viviamo in un mondo simulato?

12 08 2008

google_translate.gif Translate To English!

Un pò di tempo fà ho pubblicato un articolo su un mio vecchio blog, riguardante la possibilità che noi tutti viviamo in un mondo simulato. Giorno per giorno, quella che per me era solo una vaga idea, si consolida sempre di più.

Prima di tutto vorrei riproporvi un estratto di quell’articolo che avevo scritto, poi vorrei sottoporvi alcuni altri commenti.

Articolo originale

Viviamo in un simulatore?

Vorrei affrontare un argomento a mio parere molto stuzziante.

Da molti anni, ogni tanto, mi passano per la testa domande sul luogo in cui viviamo: è possibile che la nostra realtà altro non sia che una simulazione ad un computer?
Potete immaginare il mio stupore quando, facendo un pò di ricerche su internet, scopro di non essere l’unico a cui sia passata per la testa questa strana idea.

Ho cominciato così, un pò per scherzo, un po` per passare il tempo, un poco seriamente, a pensare alla cosa.

Ho scritto così qualcosa e, soprendentemente, sono usciti fuori risultati interessanti.

Premetto che, con queste considerazioni, non ho la benchè minima intenzione di offendere nessuno, religione, politica, etc… E` mia intenzione solamente fornire un punto di partenza per una riflessione.

Viviamo in un mondo reale… ma cosa è “reale”? E` plausibile pensare che, anche se il luogo dove siamo nati e cresciuti sia per noi un luogo reale, per altri non lo sia?
Facciamo un gioco: immaginiamo, solo per un attimo, che la nostra realtà altro non sia che una simulazione prodotta in un sistema informatico, in un computer. Ovviamente, non mi riferisco ad un PC, nè ad un server, ma immaginate semplicemente qualcosa, creato da alcuni esseri (i nostri creatori…), che sia in grado di riprodurre un ambiente (l’ambiente in cui noi esistiamo). Parliamo quindi di un sistema straordinariamente potente (almeno rispetto ai nostri…).
Se, solo per un attimo, accettassimo questo, allora alcune domande che l’uomo si fà da sempre, avrebbero una risposta, straordinariamente semplice, lineare, pulita; così pulita da non sembrare vera…

1) Esiste un dio? Si. Certo, esiterebbe un creatore, e sarebbe colui (coloro) che hanno creato tutto questo.

2) Come è nato l’universo? Gli scienziati parlano di Big-Bang… parlando di un “punto” nello spazio con una energia elevatissima che, in “poco” tempo, ha “invaso” lo spazio (autocontenuto) circostante. Purtroppo però, non riescono ad avvicinarsi che a qualche millesimo di secondo dall’inizio, dal tempo ZERO. Bene… cosa è il tempo zero?
Da dove viene tutta quella energia che ha creato il Big-Bang? Pensate all’ipotesi della simulazione: è banale fino all’inverosimile: una simulazione al computer è in grado di creare qualcosa dal nulla (all’interno della simulazione stessa): quindi il tempo zero altro non è che uno stratagemma creato dai nostri creatori per iniziare una simulazione. La materia da dove viene? Semplice: è stata creata dal simulatore! E ci troviamo alla prossima domanda…

3) Cosa è l’Universo? Dove si trova? Doce si espande? Una delle idee più diffuse è che lo spazio sia “autocontenuto” (concetto abbastanza complesso). E se invece, molto semplicemente, l’universo si trovasse nel nulla? Come? Semplicemente nella memoria di un computer. Immaginate il vostro PC: finchè nella memoria del vostro computer non mettere qualcosa, tutto quello “spazio” (solo digitale, visto che non si parla di spazio come lo intendiamo noi…) altro non è che il nulla. Cercherò di essere più chiaro (a voce sarebbe più facile…): avete mai giocato ad un gioco nel PC? Simulazione di calcio? Corse d’auto? RPG? Ovviamente lo spazio simulato in cui giocate non è uno spazio fisico; il circuito per le gare automobilistiche potrebbe essere di 3km come di 3 miliardi di km, sempre tutto nella ram del vostro PC… in pochi cm quadrati. Non vi sembra che ci sia una straordinaria somiglianza con il nostro spazio?
Entrambi sembrano poter diventare sempre più grandi, si espandono nel nulla, lo spazio sembra non finire mai (almeno per noi che viviamo all’interno della simulazione), etc…

4) Quando si parla di simulazioni, ho sentito spesso dire che il nostro è un mondo troppo complesso da essere simulato: ovviamente! E` ovvio che per noi che ci “viviamo” si tratti di un sistema estrememamente complesso… ma non abbiamo un reale metro di paragone: forse il nostro universo è straordinariamente semplice messo a confronto con quello “reale” (quello in cui vivono i nostri creatori). Anzi, lo studio del nostro universo potrebbe essere un buon punto di partenza per immaginare come sia fatto quello dei nostri creatori…

5) Parliamo di anima, spirito e corpo: anche questa definizione si adatta ad un simulatore. Basta pensare al corpo come all’oggetto che rappresenta noi stessi nel mondo simulato, mentre al nostro spirito come al “programma” che ci guida (pensateci bene, l’anima, lo spirito sono molto simili ad un programma: nessuno dei due è tangibile, non hanno spessore, non si possono toccare, ma esistono, e sono proprio loro che muovono i “corpi” all’interno di una simulazione. Avete mai giocato a Doom? A Quake? I personaggi che popolano il labirinto sono “il corpo”, mentre i programmi (che voi NON vedete mentre giocate) sono lo spirito, l’anima del personaggio.

6) In tutte le epoche, in ogni luogo, si parla di oggetti misteriosi, di poteri soprannaturali, etc… Forse esistono sul serio. Forse sono degli oggetti inseriti (coscentemente o per “errore”) nella simulazione e che permettono a noi, all’interno del simulatore, di “modificare” il normale comportamento dei programmi, causando quelli che per noi sono effetti soprannaturali, ma che in realtà hanno una spiegazione scientifica, plausibile. Se vivessimo veramente in un simulatore, forse potrebbe esistere una “bacchetta magica” in grado di sollevare “misteriosamente” il tavolo di accanto a voi; ma forse, semplicemente, avete trovato un oggetto in grado di modificare il programma che gestisce il tavolo, variando le sue coordinate nello spazio, in barba ad ogni fenomeno fisico simulato.

7) Se ci trovassimo realmente in un simulatore si spiegherebbe anche la misura di Plank. Forse è proprio un modo per “proteggere” il simulatore: un modo per non consentirci di “scavare” troppo in fondo all’atomo (ma si tratta veramente di un atomo?….).

8) Se ci trovassimo realmente in un simulatore allora è plausibile pensare che la nostra sia una realtà con lo spazio/tempo discreto e non continuo: ciò che è curioso è che recenti studi, sembrano andare proprio in questa direzione…

Sono solo all’inizio.
Spero pero` di avervi stuzzicato un po` la curiosita`.

Alcune riflessioni…

LO SPAZIO E IL TEMPO…

Quello che avete appena letto era un articolo che riassumeva, in modo molto superficiale, alcune idee.

Proprio ieri stavo leggendo un articolo sulla bellissima rivista “Le Scienze” riguardo il tempo. Si parlava della possibilità di navigare nel tempo, si affrontavano argomenti come l’entropia, il funzionamento della nostra memoria (ricordiamo gli eventi passati ma non quelli futuri), etc…

Mi sono quindi fatto una domanda (domanda che si sono poste molte altre persone!): ma il tempo esiste veramente? Ha senso parlare di tempo come una sequenza di minuti e secondi, uno dietro l’altro? Io credo che il tempo, come lo intendono “le persone normali”, non esista, ma che esso altro non sia che un modo inventato dall’uomo per misurare il movimento.
Mi spiego meglio: immaginate di non essere una persona, ma qualcosa di astratto (per esempio un punto geometrico): vi trovate in un luogo (un nuovo universo) dove tutto è fermo, tutto, ma proprio tutto, anche gli atomi che compongono la materia… proprio tutto. Bene, in questo scenario, che senso ha parlare di tempo? Il tempo sta realmente trascorrendo in questo mondo? Io credo che non abbia senso. Credo che il tempo non esista. Il tempo è solo un modo per “misurare” qualcosa. Non ha quindi senso parlare di “passato” e “futuro”, in quanto il futuro è ciò che la simulazione in cui viviamo deve ancora elaborare, ed il passato è ciò che la simulazione ha appena elaborato. Il tempo segna due eventi in successione, il tempo segna due elaborazioni in successione. Nient’altro.
Da qui è facile immaginare cosa sia il passato.

I SENSITIVI…

Salto da un argomento all’altro, vi chiedo scusa. Ma stavo vedendo un documentario dove si parlava di un sensitivo che aiutò la polizia a trovare due ragazze morte soffocate da un assassino (è una storia vera).
La mia domanda è questa: è possibile che ci siano persone in grado di ricevere alcune informazioni che altre non ricevono? E’ possibile che alcune persone possano “vedere” la registrazione della simulazione sugli eventi accaduti (registrati da qualche parte)?

Ok, per oggi basta così… a presto!