Gen 09

Recensione di Artica Proxy Server

Share
Tempo di lettura: 2 min

surf-webPer motivi di lavoro dovevo fornire a un cliente un web filter ossia un sistema che permettesse agli utenti di naviagare solo su determinati siti, bloccando ad esempio siti porno, malware, virus e altro.

L'accoppiata squid+squidguard è risultata vincente e sono riuscito semplicemente a installare un server con questi due applicativi. Ovviamente la configurazione è tutta a riga di comando.

Per permettere all'utente una gestione user-friendly del prodotto mi sono messo alla ricerca di un'interfaccia web per squidguard e l'occhio m'è caduto su "Artica", un prodotto francese con un'interfaccia web veramente accattivante.

Dopo due giorni di prove mi è arrivata da artica una mail con una richiesta di feedback su come avessi trovato il prodotto.

Questa è la risposta che ho inviato e che equivale alla mia recensione del prodotto.

Salve, negli ultimi due giorni o provato il vostro prodotto sia come immagine ISO che come macchina virtuale VMWare nella versione 1.8.01012 e ho riscontrato diversi problemi. Ad esempio, moltissime impostazioni nell'intefaccia web non venivano applicate anche dopo il salvataggio. Inoltre il database delle statistiche si interrompe nel download al 99% e, da quel momento in poi, la pagina di download inizia a mostrare un errore di socket mysql non trovato.

Sulla ISO inoltre LDAP ha smesso di funzionare dopo che il mio dhcpd ha assegnato un altro IP al server

Non parliamo poi dell'interfaccia web che risulta veramente lenta e ingestibile con tutto quell'AJAX.

Inoltre, quando ho provato a aggionrare all'ultima night release sperando che qualcosa iniziasse a funzionare il numero di versione non è cambiato anche se il processo di upgrade sembra sia stato completato correttamente. E quando ho provato a fare di nuovo un check per nuovi update disponibili, l'interfaccia web è entrata in un loop tra diverse finestre modali che mostravano degli spinner.

Per tutto questo il prodotto è attualmente completamente inusabile. In lingua italiana, noi avremmo detto "non funziona un cazzo".

Ah, sono un Linux server administrato da 1994 dalla Slackware 1.2

Lug 20

Dinamica evolutiva dei Bug nei sistemi complessi.

Share
Tempo di lettura: < 1 min

Ecco cosa succede ad un programmatore quando mostra un prodotto appena rilasciato al proprio CEO che immediatamente trova un bug nella procedura.

Fase 1 - Negazione

  • Il programmatore nega la possibilità che un bug sia presente in quel punto della procedura ed esegue, come prima cosa, un reboot del PC del CEO

Fase 2 - Sconforto

  • Il programmatore sente dentro di se l'inutilità del proprio lavoro e la possibilità che il bug venga trovato e risolto prima della fine dell'universo

Fase 3 - Speranza

  • Il programmatore intravvede un barlume di luce dietro il buio del codice e imbocca una via che, si spera, lo porti verso la pace dei sensi

Fase 4 - CEO Test

  • Il programmatore torna dal CEO per mostrargli il lavoro perfettamente funzionante
    if (N++ <10) then
    Il CEO trova il bug ancora presente
    GOTO 2
    end if

Fase 5  - Pace dei sensi

Il programmatore, soddisfatto del proprio lavoro, torna su YouPorn.

Gen 29

RadioMobile, un modulo Perl per interfacciarsi ai file .net

Share
Tempo di lettura: < 1 min

Ho appena rilasciato su CPAN un modulo Perl per interfacciarsi ai file .net del programma di simulazione di propagazione elettromagnetica Radio Mobile.

Attualmente il modulo fa un'unica cosa, legge un file .net creato da Radio Mobile e ne analizza tutte le informazioni creando un modello ad oggetti del file. Questo modello ad oggetti può essere usato, ad esempio, per inserire le informazioni in esso contenute in un database.

Per esempio, questo pezzo di codice,

[code lang="perl"] use RadioMobile;
my $rm = new RadioMobile();
$rm->file('net1.net');
$rm->parse;

my $header = $rm->header;
my $units = $rm->units;

foreach my $idxUnit (0..$header->unitCount-1) {
my $unit = $units->at($idxUnit);
printf("%s at lon %s and lat %s\n", $unit->name,
$unit->lon, $unit->lat);
}
[/code]

produce come risultato roba di questo genere

[code]

Unit  1 at lon 43.4223 and lat 13.4353
Unit  2 at lon 43.43242 and lat 13.4244
Unit  3 at lon 0 and lat 0
Unit  4 at lon 0 and lat 0
Unit  5 at lon 0 and lat 0
Unit  6 at lon 0 and lat 0
Unit  7 at lon 0 and lat 0
Unit  8 at lon 0 and lat 0
Unit  9 at lon 0 and lat 0
Unit 10 at lon 0 and lat 0
[/code]

Quanto prima, in una prossima versione, vedrò di realizzare la "magia" opposta ossia, da informazioni, caricate ad esempio da un database, andare a creare un file .net ex-novo, da dare poi in pasto a Radio Mobile.

Gen 08

Struttura del file .net di Radio Mobile

Share
Tempo di lettura: 5 min

I risultati di un sabato pomeriggio passato a studiare la struttura del file binario .net del software di simulazione di propagazione delle onde elettromagnetiche Radio Mobile in cui sono racchiuse tutti i punti e le caratteristiche elettromagnetiche di ogni apparato che poi vengono usate da questo software per generare le simulazioni di copertura.

Per questo studio ho usato un file binario di esempio guardandolo con un xxd e di un file .bas di Visual Basic che si trova sul forum di supporto del programma.

Purtroppo il file .bas fa riferimento a file .net nella versione 2000 e 3000 mentre i file generati dalle ultime versioni di Radio Mobile mostrano come numero di versione 4000.

Scrivo qui le mie conclusioni e le parti ancora ignote che spero prima o poi di colmare.

Il file inizia con una struttura di intestazione formata da 10 byte

[code lang="perl"]# HEADER STRUCTURE - Len 10 bytes
# VERSION           ([f] single-precision float - VB Single type - 4 bytes),
# NETWORK ELEMENTS  ([s] signed short - VB Integer type - 2 bytes),
# UNIT ELEMENTS     ([s] signed short - VB Integer type - 2 bytes),
# SYSTEM ELEMENTS   ([s] signed short - VB Integer type - 2 bytes),[/code]

dove, tra parentesi, ho trascritto la struttura come vista dalla funziona pack/unpack di Perl e, di seguito, come vista dal Visual Basic.

Usando un po' di codice e, in particolare queste righe

[code lang="perl"]my $HeaderLen       = 10;
my $HeaderPack      = 'fsss';
my @HeaderItems     = qw/version networkCount unitCount systemCount/;
struct( HeaderType => { map {$_ => '$'} @HeaderItems } );
# read and unpack the header
my @struct = unpack($HeaderPack,$f->get_bytes($HeaderLen));
my $header = new HeaderType(map {$HeaderItems[$_] => $struct[$_]} (0..@HeaderItems-1));
print Data::Dumper::Dumper($header);[/code]

dove $f è un oggetto della classe File::Binary che punta a un file .net aperto in lettura, si ottiene la seguente struttura autoesplicativa

[code lang="perl"]$VAR1 = bless( {
'HeaderType::systemCount' => 25,
'HeaderType::version' => '4000',
'HeaderType::unitCount' => 200,
'HeaderType::networkCount' => 50
}, 'HeaderType' );[/code]

che indica appunto il numero di versione e lo spazio assegnato e utilizabile per i network, i punti (unit) e i tipi di sistemi (system) gestibili da questo file .net.

Proseguendo nella lettura del file binario, subito dopo, si trova, ripetuta tante volte per quante sono il numero di punti nel file, la seguente struttura lunga 44 bytes

[code lang="perl"]# UNIT STRUCTURE - Len 44 bytes</pre>
# LON               ([f] single-precision float - VB Single type - 4 bytes),
# LAT               ([f] single-precision float - VB Single type - 4 bytes),
# H                 ([f] single-precision float - VB Single type - 4 bytes),
# ENABLED           ([s] signed short - VB Integer type - 2 bytes),
# TRANSPARENT       ([s] signed short - VB Integer type - 2 bytes),
# FORECOLOR         ([l] signed long - VB Integer type - 4 bytes),
# BACKCOLOR         ([l] signed long - VB Integer type - 4 bytes),
# NAME              ([A] ASCII string - VB String*20 - 20 bytes),[/code]

quindi segue la definizione dei system, con la seguente struttura, lunga 50 byte

[code lang="perl"]# SYSTEM STRUCTURE - Len 50 bytes
# TX                ([f] single-precision float - VB Single type - 4 bytes),
# RX                ([f] single-precision float - VB Single type - 4 bytes),
# LOSS              ([f] single-precision float - VB Single type - 4 bytes),
# ANT               ([f] single-precision float - VB Single type - 4 bytes),
# H                 ([f] single-precision float - VB Single type - 4 bytes),
# NAME              ([A] ASCII string - VB String*30 - 30 bytes),[/code]

ripetuta tante volte per il numero di system definiti nell'header.

Dopo di questo il file .bas riportava di due strutture di byte di forma matriciale bidimensionale di dimensione pari al prodotto tra il numero di unità e quello di reti. Io ne ho trovate invece, nella versione 4000, tre.  Il file VB identifica la prima come net_role e la seconda come net_system. Probabilmente identificano in che network è situata ogni unit e con che sistema radio. Ovviamente è da investigare.

Subito dopo arriva la definizione dei network con una struttura di 72 byte

[code lang="perl"]# NET STRUCTURE - Len 72 bytes
# MINFX             ([f] single-precision float - VB Single type - 4 bytes),
# MAXFX             ([f] single-precision float - VB Single type - 4 bytes),
# POL               ([s] signed short - VB Integer type - 2 bytes),
# EPS               ([f] single-precision float - VB Single type - 4 bytes),
# SGM               ([f] single-precision float - VB Single type - 4 bytes),
# ENS               ([f] single-precision float - VB Single type - 4 bytes),
# CLIMATE           ([s] signed short - VB Integer type - 2 bytes),
# MDVAR             ([s] signed short - VB Integer type - 2 bytes),
# TIME              ([f] single-precision float - VB Single type - 4 bytes),
# LOCATION          ([f] single-precision float - VB Single type - 4 bytes),
# SITUATION         ([f] single-precision float - VB Single type - 4 bytes),
# HOPS              ([s] signed short - VB Integer type - 2 bytes),
# TOPOLOGY          ([s] signed short - VB Integer type - 2 bytes),
# NAME              ([A] ASCII string - VB String*30 - 30 bytes),[/code]

ripetuta tante volte per quanti network sono definiti nell'header.

Segue quindi una struttura denominata Coverage che, sostanzialmente contiene i parametri della finestra "Single Polar Radio Coverage" di Radio Mobile.

La struttura, lunga 74 byte è cosi fatta

[code lang="perl"]# COVERAGE STRUCTURE - Len 74 bytes
# DMAX              ([f] single-precision float - VB Single type - 4 bytes),
# THMIN             ([f] single-precision float - VB Single type - 4 bytes),
# THMAX             ([f] single-precision float - VB Single type - 4 bytes),
# THINC             ([f] single-precision float - VB Single type - 4 bytes),
# ANTAZT            ([f] single-precision float - VB Single type - 4 bytes),
# FILE              ([A] ASCII string - VB String*20 - 20 bytes),
# TRESHOLD          ([s] signed short - VB Integer type - 2 bytes),
# LEVEL             ([f] single-precision float - VB Single type - 4 bytes),
# AREA              ([S] unsigned short - VB Boolean - 2 bytes, non credo bool)
# CAREA             ([l] signed long - VB Integer type - 4 bytes),
# CONTOUR           ([S] unsigned short - VB Boolean - 2 bytes)
# CCONTOUR          ([l] signed long - VB Integer type - 4 bytes),
# VHS               ([f] single-precision float - VB Single type - 4 bytes),
# VHT               ([f] single-precision float - VB Single type - 4 bytes),
# DMIN              ([f] single-precision float - VB Single type - 4 bytes),
# VCOL              ([l] signed long - VB Integer type - 4 bytes),[/code]

e probabilmente è qui, per la gestione delle copertura in batch. Segue infine un signed-short di 2 byte con la lunghezza di una stringa che contiene il percorso al file .map che segue subito dopo e, successivamente a questa stringa, si entra in un loop finchè non finisce il file o i successivi 2 byte non sono zero, in cui si legge un signed-short di 2 byte che contiene la lunghezza della successiva stringa che contiene il percorso ad ogni singola picture da aprire all'apertura del file .net.

Indi, almeno per il file VB, c'è il caricamento di una matrice di single di grandezza pari al prodotto tra il numero di unità e quello di reti, quindi un elenco che identifica le icone di ogni unit, di tipo byte e di lunghezza uguale al numero di unit e, per finire, delle lineLossPerMeter di tipo single di lunghezza pari al numero di system.

Il problema con quest'ultima parte è che, a parte non aver identificato bene le strutture, e questo è da fare, ma il fatto è che, mentre per il file VB, il file .net dovrebbe essere finito, nella realtà c'è dell'altra roba, tra cui un percorso ad fantomatico file landheight.dat che sembra pure roba obsoleda.

C'è ancora da studiare ma ovviamente, se qualcuno ne sa più di me, si faccia avanti.

Feb 11

Domande imbarazzanti da Symantec

Share
Tempo di lettura: < 1 min

Symantec è il noto produttore e distibutore di prodotti antivirus tra cui il malefico famoso Norton Antivirus.

Per il mondo "business" ha però anche altri prodotti. Ed è proprio durante l'installazione di uno di questi che Symantec inizia a fare delle domande imbarazzanti. Come vi sentireste se un software, durante l'installazione, vi chiedesse:

L'utilizzo finale è collegato a un'organizzazione politica, militare o governativa? L'utente finale è un organismo di polizia, militare o governativo?

oppure

L'utilizzo finale è legato alla progettazione, allo sviluppo, alla produzione, all'immagazzinaggio o all'impiego di armi chimiche o biologiche?

o anche

L'utilizzo finale è legato alla progettazione, allo sviluppo, alla produzione o all'impiego di missili?

e cosi, via.

Se siete curiosi, guardatevi sotto tutte le domande e lo stimolo impellente avuto dal sottoscritto nel rispondere a tutte: "SSSSSSIIIIIIIIIIIIIIIIII e moh che vuoi????"


domande_imbarazzanti_da_symntec.png

Un grazie a DoM e a Sugo per aver fornito le immagini.

Set 14

Spore, il gioco dell'evoluzione

Share
Tempo di lettura: 3 min


spore_box.jpg

Un altra genialata da quel Will Wright, sviluppatore, tra le altre cose di giochi che hanno fatto epoca quali Sim City e The Sims.

Ovviamente anche questo gioco cavalca l'onda della simulazione. Mentre in Sim City si andava a simulare una città, dalla creazione di palazzi, strade e altro, mentre in The Sims si andava a simulare la vita di ogni giorno di un individuo, con Spore, Will Wright ci regala un nuovo livello di gioco, quello di far evolvere una cellula dal brodo primordiale  fino alla conquista della galassia.

L'evoluzione della cellula passa per sei momenti fondamentali:

Fase cellulare

Creatura

Tribù

Civilizzazione

Conquista dello spazio.

Ognuna di queste fasi è caratterizzata da differenti modalità di gioco. Io per ora posso raccontare solo le prime due fasi, quella cellulare e quella di creatura, in quanto sono appena passato alla fase Tribù e devo ancora capire qualcosa di questa nuova fase.

Nella fase cellulare, lo scopo del gioco è semplicemente quello di raccogliere i resti di cibo e di mangiare, eventualmente gli altri animali che popolano il brodo primordiale. Ovviamente vale la legge del "più forte mangia il più debole" quindi bisogna stare attenti a cercare il combattimento solo con animali più piccoli o meno forniti di difese del nostro personaggio. Il mangiare ci fa crescere, ci da punti DNA che ci permettono di evolverci acquisendo nuove forme e nuovi componenti per il nostro corpo come nuovi flagelli per nuotare più veloce, aculei per divenderci, appendici per sparare veleno o scariche elettriche e cosi via.

Ecco, per esempio, nella mia prima sessione di gioco, la mia evoluzione da organismo cellulare fino al raggiungimento della terra ferma

Spore_GIF_2008-09-12_01-36-24.gif

A questo punto si esce dal brodo primordiale e si esce sulla terra ferma. E' la fase Creatura, il cui scopo è ovviamente continuare ad evolverci, combattendo contro i nidi di altre forme di vita presenti sul territorio, da soli o in branco, con altri della nostra stessa specie. Oltre che combattare si può anche formare delle allenze con altre specie che diventeranno quindi nostre amiche. Più si mangia e più si può modificare il proprio aspetto con nuove appendici, nuovi artigli e nuovi attributi.

Ecco qui sotto la mia evoluzione dallo stato Creatura a quello Tribù

Spore_GIF_2008-09-12_02-09-50.gifSpore_GIF_2008-09-14_12-34-38.gif Spore_GIF_2008-09-14_12-48-06.gif

La cosa più bella del gioco è sicuramente l'editor per cambiare l'aspetto del nostro personaggio. Veramente ben fatto, è possibile cambiare aspetto in ogni minima parte. Pensate che è possibile selezionare la colonna vertebrale del nostro avatar e allungarla, ridurla, curvarla in ogni minima parte.

Alla fine è possibile, prima di ritornare al gioco, testare le modifiche fatte su un'arena, fare delle foto e inviare un eventuale filmato direttamente su YouTube.

Ecco per esempio, un primo piano della mia creatura

CRE_LaMorte-06f70bb3_ful.png

Veramente terrificante. Vero?

Ecco qui sotto il video girato nell'arena durante la prova di alcune sue caratteristiche di abilità

 

Ovviamente, un gioco consigliato per tutti, per passare qualche ora di svago a creare nuove forme di vita e civiltà fino ad arrivare la dove nessun xxxhvshgsvgds è mai arrivato prima