giovedì 6 dicembre 2007

Metodologia OO2R

Ecco un modello pratico per la realizzazione di infrastrutture di persistenza per applicativi modellati su architetture Object Oriented. Il prodotto di questo modello non e' un vero e proprio DB Object Oriented, ma consente di sviluppare strati di persistenza consistenti per sistemi OO, sfruttando nel contempo quelli che sono i punti di forza (prestazionali) dei database relazionali.



Caratteristiche architetturali

Nello strato di persistenza non vengono implementati i metodi delle classi, ma soltanto gli attributi. Non sara' quindi possibile effettuare query con chiamate a metodi direttamente in SQL, ma sara' necessario passare dallo strato del linguaggio OO per questo tipo di query, con una penalizzazione delle prestazioni. Occorre quindi porre attenzione all'analisi architetturale del sistema, tenendo conto del trade-off tra design e performance.

Poiche' il sistema e' suddiviso in due strati (lo strato Java e lo strato DB) e' necessario sempre tenere presente quando e in che modo in due strati sono coinvolti nelle varie operazioni, per poter offrire una buona stima delle prestazioni del sistema in progetti reali dove queste siano essenziali.

Cerchero' sempre di sottolineare l'esatto livello di coinvolgimento dei due strati, con una digressione sulle performance.



Prerogative dei database OO

Elenco qui le golden rules dei database orientati agli oggetti: per quanto possibile cercherò di sviluppare un sistema che ricalchi queste regole, e quando non sarà possibile rispettarle, indicherò le motivazioni.

  • Oggetti complessi

Deve essere possibile creare oggetti complessi aggregando oggetti più semplici; inoltre deve essere possibile applicare i metodi di aggregazione ortogonalmente . Questa feature verrà implementata tramite una relazione di aggregazione.

  • Object identity

A differenza del modello relazionale in cui l'identità di una entità è relativa al valore dei suoi campi chiave, in un db object oriented è necessario identificare un oggetto indipendentemente dal suo valore; questa feature verrà implementa semplicemente inserendo come chiave di ogni tavola che rappresenta un oggetto un campo objectId (che in MySQL sarà un Integer con Auto-increment)

  • Incapsulazione

In questo caso, poichè i metodi degli oggetti non vengono implementati dal DB, ma dallo strato Java sovrastante, l'incapsulazione è implementata dall'oggetto “Java side”

  • Tipi e classi

Anche in questo caso ci baseremo sulle feature di Java. Solo lo strato di persistenza verrà delegato al DB, attraverso tavole rappresentanti le entità del sistema

  • Gerarchia di classi

Naturalmente la “Java side” del sistema implementa nativamente le gerarchie di classi. Da un punto di vista dello strato di persistenza, la relazione di ereditarietà verrà implementata utilizzando come chiave primaria e objectId della classe figlia, una foreign key puntante all'objectId della classe padre. Le interfaccie (che sono prive di attributi e quindi prive di stato di persistenza) verranno implementate come tavole il cui unico attributo è l'objectId. Questo per permettere il polimorfismo nelle query.



Componenti del sistema

Livello di database

Il database prevede due metaclassi di componenti:

  • Entità

  • Relazioni

Da un punto di vista OO le relazioni rimangono invariate rispetto al modello relazionale, mentre cambiano le entità: inoltre nasce un tipo di relazione di ereditarietà, che va quindi correttamente codificata in SQL.

Livello del linguaggio (Java)

Per ogni classe di oggetti persistenti sono necessari due componenti:

  • La classe stessa (che implementa DataObject)

  • Un gestore della persistenza specifico



La metodologia

Il punto di partenza di questa metodologia è il class diagram del sistema, che -ATTENZIONE! - dovrà essere nella “versione per l'implementazione in Java” piuttosto che nella “versione dell'architettura implementabile in qualunque linguaggio OO”. Questo perchè in Java tutti gli oggetti derivano da Object. Se questa feature viene in qualche modo sfruttata, anche nello strato di persistenza ci dovrà essere una tabella “Object” che offre foreign key a tutte le entità del sistema! Naturalmente questa implementazione potrebbe non essere accettabile (potrei avere un numero eccessivo di oggetti nel DB, tale da impattare troppo sulle prestazioni e sullo spazio utilizzato su disco). Inoltre lo strato di persistenza deve includere anche gli attributi privati e protetti dell'oggetto da serializzare (che normalmente nei diagrammi dell'architetto non compaiono).

Ad ogni classe persistente corrisponde una tabella di tipo Entità nel database. Inoltre ogni entità ha un objectId (regola della Object Identity dei DB ad oggetti) che è anche la chiave primaria della tavola.

Qualunque tipo di relazione (ereditarietà [is-a], composizione [has-a], oppure user defined [abita-presso], [ha-il-permesso-per], ecc) viene rappresentata da una relazione – sempre una tavola del DB – con eventuali attributi.

La relazione di ereditarietà viene espressa tramite una chiave esterna utilizzata anche come primary key nella classe specializzata.



Esempio pratico

Prendiamo un diagramma UML:


Per il momento tralasciamo i particolari implementativi, ci interessa principalmente la struttura.

Un DocumentoVendita è una classe astratta, implementata da Fattura e Bolla, che ne implementano il metodo astratto stampa().

Inoltre aggiungono ognuno un attributi specifico di questa classe. D'altra parte abbiamo un'interfaccia RigaDocumento, e due classi implementanti, RigaFattura e RigaBolla, ognuna con le sue caratteristiche specifiche (che tralasciamo). Un DocumentoVendita contiene (usa) una collezione di RigaDocumento (la relazione potrebbe essere has-many).

Vediamo come possiamo implementare in Java questo modello, e come possiamo realizzarne lo strato di persistenza su un DB relazionale:


La classe astratta DocumentoVendita viene implementata dalla tavola documento_vendita, che oltre ad enumerare tutti gli attributi (attenzione! sia pubblici che privati!) della classe aggiunge come PK objectId, e come attributo normale objectRTTI. Il primo è un numerico con auto-incremento, mentre il secondo contiene il nome della classe reale (foglia nell'albero della gerarchia) dell'oggetto polimorfo. Questo secondo attributo è necessario soltanto nelle classi base. Lo strato di persistenza delle classi che ereditano da documentoVendita, viene implementato attraverso tavole (una per ogni classe implementante, quindi bolla e fattura). Queste tavole contengono gli attributi specifici delle classi ereditate, oltre a objectId. Quest'ultimo però, oltre ad essere chiave primaria, è anche foreign key sull'omonimo campo della tavola della classe base (documento_vendita), e non è auto-increment. Di fatto lo stato persistente di un oggetto fattura è dato dal join naturale tra “bolla JOIN documento_vendita ON (bolla.objectId = documento_vendita.objectId)”.

[qui manca una bella disquisizione sulla relazione has_many]

Ora supponiamo di dover estendere il nostro sistema, aggiungendo un ulteriore livello di specializzazione nelle fatture:

In particolare abbiamo aggiunto la classe derivata FatturaPersonalizzata.

Vediamo come adattare lo schema del DB:

La query per il data retriving di una fattura personalizzata:

SELECT *

FROM fattura_personalizzata JOIN fattura JOIN documento_vendita

ON (fattura_personalizzata.objectId = fattura.objectId AND fattura.objectId = documento_vendita.objectId)

WHERE fattura_personalizzata.objectId = ?

E' importante notare che anche con una elevata profondità nel grafo della gerarchia, le ricerche per objectId hanno sempre un costo estremamente limitato!



New features for new OSes (part 3)

Advanced profiling for user and system configuration

Configuration should be classified in three fields: system configuration, users configuration and application configuration. These three sets can eventually intersect and share some data (for example, an application could check system configuration for printing or current user configuration for colour preferences), so the configuration system should be able to permit partial access to some data to some applications. This means that the configuration system should be much more intelligent than – for instance – a registry file, and some database capabilities will definitely come up in this context.

In a network environment, an advance configuration system should also provide the capacity to centralize system administration (in collaboration with the auto-update and auto-heal system) and to remote user configuration and permissions, so that the machines attached to the network are able to download on demand whatever the logged user needs.

How would be possible to obtain this behaviours? With a DBMS managed configuration system, we could identify three entities (systems, users and applications): each entity has its own credentials (in commercial systems this could also include licence checking) and it is stored in the configuration database. The database engine is able to retrieve informations also from the centralized server to obtain network administration and user distribution abilities; there are very strict rules on how entities can access data: for example an application executed from a certain user can only gain access to this specific user configuration, and is permitted to write configuration informations concerning only the “this user, this application” join; the very same limitations are applied in the “this application, this system” join.


lunedì 3 dicembre 2007

Aforisma

Sono convinto che l'informatica abbia molto in comune con la fisica. Entrambe si occupano di come funziona il mondo a un livello abbastanza fondamentale. La differenza, naturalmente, è che mentre in fisica devi capire come è fatto il mondo, in informatica sei tu a crearlo. Dentro i confini del computer, sei tu il creatore. Controlli - almeno potenzialmente - tutto ciò che vi succede. Se sei abbastanza bravo, puoi essere un dio. Su piccola scala. (Linus Torvalds, "Rivoluzionario per caso", 2001)

giovedì 29 novembre 2007

New features for new OSes (part 2)

Different types of data deserve different procedures for disk storage

I would split the files stored in my disks in categories:
  • System files (kernel, drivers, GUI)
  • System libraries (file system access, graphic, hardware devices, special routines optimized for the processor's capabilities such as SSE codecs and so on)
  • Application libraries shared among different applications
  • Applications
  • Configurations (for applications and user profiling)
  • User data (documents)

Different categories of files have different requirements: system files should not be modified by users and userland applications, while should be automatically maintained by auto-update or auto-heal utilities. I also like very much the microkernel architecture such as Minix's, with drivers running at a lower lever than the kernel. This could lead to some worsening of performance, but more stability and security. I'd also like to have the opportunity to keep trace of all the updates in the system, so that in the event of a buggy new driver version, the system could be able to recover loading a previous version. An intelligent cleaning system is also required, enabling the system to delete unused, older versions of components and freeing storage space.
System libraries are the interface between the core and the higher level applications: they wrap the behave of drivers, offering access to higher level languages (Java?); of course all the file system access is filtered by this level, and here I would set all the accessors to the “differed categories file system”.
This leads to another point: file system access is somehow filtered by a permission layer. Next part soon...

giovedì 22 novembre 2007

New features for new OSes (part 1)

I'm quite satisfied by Ubuntu, Gnome and Compiz fusion, but I still have some ideas on how I would like to improve my user experience in the daily use of my computers. None of theme is dramatically new, as I heard that soon (maybe on Vista SP1) Microsoft is going to introduce WinFS on Windows, and Gnome is working on Gnome Storage. The point is that unlike user interfaces, which have evolved a lot in their metaphors, file systems are organized mostly the same way they were years ago. Actually they offer more functionality and performance, but from the user point of view the disks are always “folders” and “files”, both for documents, user data, configurations, applications.
I'd like to organize the disk differently, to gain in usability and in system stability.
Also, modern systems have self healing and self updating capabilities that could be improved with a different disk management, something able to discern between system data, programs and user documents. What could we obtain by combining a file system, a database, an intelligent system (maybe with the ability to track what the users do and adapt to their needs) and new application development techniques based on the security of virtual machines?

mercoledì 21 novembre 2007

1 anno di blog...

...durante il quale sono successe un sacco di cose interessanti :)
Mi sono munito (finalmente!) di uno smartphone, Ubuntu 7.10 è stabile ed installato sia sul desktop che sul portatile, con Compiz a pieno regime sia sulla nVidia del desktop che sulla Ati del portatile.
Ma nel mio prossimo sistema operativo vorrei vedere un'innovazione ancora più rivoluzionaria: una nuova gestione del file system.
Durante il (pochissimo, aimè) tempo libero rimasto, cercherò di organizzare un discorso più stutturato sul tema, anche perchè ho intenzione di provare a prototipare qualcosa utilizzando il motore OODB che ho in cantiere (cantina?) da tempo immemorabile..
Utilizzando la ormai onnipresente connessione in rete a banda larga, è possibile rivoluzionare la gestione del disco da parte del sistema operativo? E' possibile utilizzando le attuali infrastrutture di virtualizzazione dello strato hw (intendo Java, Mono e .NET) riorganizzare la struttura OS/Applicazioni/Dati dei computer?
Ma soprattutto, c'è vita nell'universo all'infuori di noi?

sabato 3 novembre 2007

Compiz oltre compiz

Sul blog di uno dei tipi di compiz fusion, c'è un post veramente tonante: con Octopus abbiamo sempre discusso la possibile innovazione di un interfaccia uomo-macchina veramente 3D. Questo è un passo significativo.
Ora però bisogna trovare gli occhiali...

giovedì 1 novembre 2007

Enhancements on new OSes

I've been writing various times now about the new user interfaces provided by the major Oses (Mac OS X, Linux with Compiz fusion, Vista with Aero) and I've discussed about the increased productivity made possible by these systems: they look so nice and they are so amazing that working in their environments becomes a pleasure. Still, apart from the UI there are still fields in which these systems could be improved. I have a working machine with many services and applications loaded at start up time, because I have different open projects and I need to work on different development environments (different db servers, different http servers, lot of utilities such as monitors, bluetooth and whatever); I'd like to collect some statistic about the use of the components loaded on my system, such as the shared libraries, services an so on. I want to make the system learn “how much time after my login am I using this?”, and I'd like to delay the load of some components so that the bootstrap and login gets faster; actually I am going to try something in linux: I know that right after the logon I am usually going to load the web browser and read my webmail, and just after some minutes I am going to start my IDE and database server. Also, I would like to delay the start of my desktop gadgets so that the boot + login + start browser operations gets faster, and just after about 2 minutes I want the system to load all the other stuff. I think the next step in the development of operating systems (at least the user oriented set ups, not the servers) will be the introduction of intelligent agents that monitors what the user usually do and try to “get him there quicker”.

I think Vista has something like this, but actually I haven't tried it yet, but I hope Linux will move toward this direction.

martedì 30 ottobre 2007

gDesklets



Per installare le gDesklets su Ubuntu, è sufficiente andare su Applicazioni->Aggiungi/Rimuovi, cercare il package ed installarlo.
Per poi mettere il demone gdesklet in startup automatico, Sistema->Preferenze->Sessioni, click sul bottone aggiungi, ed inserite "gDesklets" nella casella nome, e "gdesklets start" nella casella comando; ad ogni startup vi ritroverete le vostre desklets attive!
Inoltre, in caso di pasticci, per "ricominciare tutto da capo" è sufficiente cancellare la cartella ".gdesklets" dalla vostra home. Da provare assolutamente la "StarterBar" e le "StickyNotes"!
Facile, bello, utile?

venerdì 26 ottobre 2007

F#

Questo piacerà sicuramente a Ubik...
M$ ha implementato un linguaggio funzionale ispirato ad Ocaml per la piattaforma .NET

martedì 16 ottobre 2007

Ubuntu 7.10


lunedì 8 ottobre 2007

Wikibooks

Segnalo a chi - come me fino a 5 minuti fa - non era al corrente dell'esistenza di questo progetto:
http://wikibooks.org/ ovvero libri, manuali, testi open source.
In particolare ne ho trovato uno interessante: More C++ Idioms.

giovedì 4 ottobre 2007

Atom feed

Sondaggi...

Geniale... ora si possono mettere i sondaggi sul Blog.
Oh, votate!!!

martedì 25 settembre 2007

WinMerge

Una diff per windows, integrabile con SVN. Utile, superiore alla windiff offerta in visual studio 6 (e incredibilmente utile in questi assembly times!).

Assembly ad oggetti

Ai - per fortuna - pochi che hanno avuto il piacere di conoscere il più eclatante assemblerista ad oggetti della storia, posso ora dire con certezza che "l'assembler ad oggetti" (inteso come metodologia di sviluppo) non esiste. Sono giunto a questa conclusione dopo il refactoring del firmware di un device embedded, che mi ha procurato notti quasi insonni, e pochi momenti di sonno disturbati da un incubo ricorrente (una voce cavernosa che dal profondo di una gola oscura urlava "perchè iooooo....").
Strutturare un software poco più che banale in linguaggio macchina richiede capacità di concentrazione talmente elevate che risulta un compito praticamente impossibile a qualunque umano (solo un compilatore può farcela); è troppo difficile non introdurre bachi assurdi e indebuggabili in migliaia di linee di codice pseudo-organizzato, privo di controlli semantici, privo di vincoli strutturali... ogni tentativo di introdurre struttura (documentata peraltro a piu' non posso, con mooolte più linee di commenti che di istruzioni) introduce una probabilità in più di bachi. Fare binding dinamico in assembly è troppo error-prone, e al di fuori di qualche piccolo esperimentuccio, diventa impossibile riuscire sia a strutturare il software che renderlo efficiente (per efficiente intendo: terribilmente efficiente, sfruttando fino all'ultimo le risorse modeste dell'hardware).
L'uso indiscriminatamente ottimizzato dei registri (solo 16) su un processore RISC che sembra morire ad ogni accesso in memoria, il windowing virtuale (3 finestre da 4 registri) implementato per la chiamata ricorsiva (dalla 4 ricorsione in poi, i registri vengono dumpati sullo stack)... no, è troppo. L'assembly è fatto per programmarci in assembly, poi c'e' il C++. E quando si esce dal mondo embedded ci sono i vari Java e C#.
L'assembly ad oggetti è morto.
Lunga vita all'assember ad oggetti, e ai gloriosi pionieri dell'informatica.

mercoledì 12 settembre 2007

BMW M3 Challenge

Un gioco GRATUITO per tutti gli amanti della guida. Merita, merita.

http://www.m3-challenge.com/

venerdì 31 agosto 2007

No OOXML, no piccolo&moscio

Intanto subito subito una visita al sito: http://www.noooxml.org/.
E ora la mia critica: supponiamo che io voglia scrivere del software in grado di interagire con documenti salvati in formato ODF: è uno standard aperto e mi garantisce la compatibilità con tutti i sistemi SERI. Perchè mai dovrei scrivere anche il "codec" per la lettura dei documenti ooxml? Ma chi me lo fa fare di spendere il doppio di tempo (soldi)?
Uno standard c'è già, e funziona.
VOTATE LA PETIZIONE CONTRO M$, NON FATEMI LAVORARE IL DOPPIO!

mercoledì 29 agosto 2007

Memory manager errata corrige

E' inutile... non riesco a far visualizzare correttamente i parametri dei template...
Se a qualcuno interessa il codice giusto, mandatemi una mail che ve lo spedisco!

MemoryManager.cpp

#include "MemoryManager.h"

namespace ManagedMemory
{
using namespace std;

MemoryManagerImpl::MemoryManagerImpl(void *p, size_t heapSize):
_heapSize(heapSize),
_heap(p)
{
_freeBlocks.push_front(MemBlock(_heap, _heapSize));
}

MemoryManagerImpl::~MemoryManagerImpl(void)
{
}

void * MemoryManagerImpl::alloc(size_t amount) throw(MemoryAllocationException)
{
for(list::iterator it = _freeBlocks.begin(); it != _freeBlocks.end(); it++)
{
if(it->_size >= amount)
{
void *memPointer = it->_pointer;
size_t memResidua = it->_size - amount;
_freeBlocks.erase(it);
_usedBlocks.push_back(MemBlock(memPointer, amount));
if(memResidua > 0)
_freeBlocks.push_back(
MemBlock(reinterpret_cast(
reinterpret_cast(memPointer)+amount),
memResidua));
return memPointer;
}
}
return 0;
}

void MemoryManagerImpl::free(void *p) throw(NotOwnedMemoryException, DeallocOnNotAllocatedMemory)
{
if(
( reinterpret_cast(p) <>(_heap)) ||
( reinterpret_cast(p) >= (reinterpret_cast(_heap) + _heapSize))
) throw NotOwnedMemoryException();

for(list::iterator it = _usedBlocks.begin(); it != _usedBlocks.end(); it++)
{
if(it->_pointer == p)
{
_freeBlocks.push_back(*it);
defrag();
_usedBlocks.erase(it);
return;
}
}
throw DeallocOnNotAllocatedMemory();
}

void MemoryManagerImpl::defrag()
{
if(_freeBlocks.size() < 2) return;
_freeBlocks.sort();
list::iterator it1 = _freeBlocks.begin();
list::iterator it2 = _freeBlocks.begin();
it2++;

while(it2 != _freeBlocks.end())
{
if(
(reinterpret_cast(it1->_pointer) +
it1->_size) == (reinterpret_cast(it2->_pointer)))
{
// Unisco e libero
_freeBlocks.push_back(MemBlock(it1->_pointer, it1->_size + it2->_size));
_freeBlocks.erase(it2);
_freeBlocks.erase(it1);

// Ricomincio
if(_freeBlocks.size() < 2) return;
_freeBlocks.sort();
it1 = _freeBlocks.begin();
it2 = _freeBlocks.begin();
it2++;
}
else
{
it1++;
it2++;
}
}
}
};

MemoryManager.h

#pragma once
#pragma warning( disable : 4290 )

#include
#include "MemoryExceptions.h"

namespace ManagedMemory
{
struct MemBlock
{
void *_pointer;
size_t _size;

MemBlock(void *pointer, size_t size):
_pointer(pointer), _size(size)
{}

bool operator< (const MemBlock& b) const
{
return
reinterpret_cast(_pointer) <
reinterpret_cast(b._pointer);
}
};

/**
Interfaccia per gestore di memoria
*/
class MemoryManager
{
public:
virtual void *alloc(size_t amount) throw(MemoryAllocationException) = 0;
virtual void free(void *p) throw(NotOwnedMemoryException) = 0;
};

class MemoryManagerImpl: public MemoryManager
{
void *_heap;
size_t _heapSize;

std::list _usedBlocks;
std::list _freeBlocks;

protected:
void defrag();

public:
MemoryManagerImpl(void *p, size_t heapSize);
virtual ~MemoryManagerImpl(void);

virtual void *alloc(size_t amount) throw(MemoryAllocationException);
virtual void free(void *p) throw(NotOwnedMemoryException, DeallocOnNotAllocatedMemory);

};
};

MemoryExceptions.h

#pragma once

namespace ManagedMemory
{
class MemoryException
{};
class MemoryAllocationException: public MemoryException
{};
class NotOwnedMemoryException: public MemoryException
{};
class DeallocOnNotAllocatedMemory: public MemoryException
{};
};

Memory management in C++

Ripensando sempre al discorso di gestione della memoria, ho scritto un gestore di memoria minimalista in C++, eventualmente utilizzabile per un sistema embedded, utilizzando come parametri di costruzione del gestore di memoria direttamente l'indirizzo fisico dello heap e la sua grandezza. Posto il file sorgenti separatamente, perche' altrimenti impazzisco con la formattazione (trasformare i < in &lt; ecc...)

lunedì 27 agosto 2007

Pool di risorse e gestione della memoria

Recentemente mi sono messo a meditare sulla gestione della memoria in Java: visto l’alto costo della new, pensavo di creare un generico contenitore template Pool in grado di contenere e riutilizzare risorse senza invocare la new; chiaramente gli oggetti avrebbero dovuto essere “abilitati” al riutilizzo attraverso un metodo di “rigenerazione” che facesse lo stesso lavoro di un’invocazione al distruttore + un’invocazione al costruttore senza coinvolgere il gestore della memoria della virtual machine (in C++ basterebbe sovraccaricare l’operatore di assegnamento). A questo punto avrei voluto implementare un qualche sistema per “sentire” l’uscita dallo scope di una reference all’oggetto per poter indicare al Pool quando segnare l’oggetto come inutilizzato e renderlo disponibile per essere riutilizzato. Non ci sono riuscito, e mi sono accontentato di un metodo “release” da invocare manualmente, rendendo così l’utilizzo di questo sistema soggetto ai soliti errori di memory leak, e quindi inutile.

Così ho cominciato a ragionare in C++: il meccanismo più efficiente per abbattere i costi dell’allocazione di memoria (in particolare la copia di oggetti complessi) è l’utilizzo di referenze come parametri di funzioni che consentono un comportamento “Java like” (e quindi il polimorfismo…) in modo totalmente trasparente al programmatore (che non deve gestire cioè manualmente la memoria): il limite delle referenze è che funzionano solo in una direzione (verso l’alto dello stack) e quindi non possono essere utilizzate per delle object factory. La soluzione è utilizzare gli auto_ptr, per consentire l’utilizzo di simil-referenze anche verso il basso dello stack: è così possibile creare una funzione del tipo:auto_ptr<resourcehandler> getResource(…);

A questo punto il distruttore di ResourceHandler avrà il compito di “rilasciare” la risorsa dal pool, e questo rilascio avverrà in automatico all’atto dell’uscita dallo scope dell’auto_ptr (bisogna quindi definire come virtuale il distruttore, per poter specializzare liberamente ResourceHandler).

Rimane però un problema: gli auto_ptr non possono essere utilizzati nei contenitori stl standard (o forse si… non mi ricordo come funzionano gli allocatori…). Certo che se Java mettesse a disposizione una callback tipo “finalize” (chiamiamola “referenceOutOfScope”) all’uscita dello scope di una referenza, il suo potenziale espressivo crescerebbe molto, mantenendo comunque la semplicità della gestione automatica della memoria.

sabato 4 agosto 2007

Doxygen&graphviz

Per creare la documentazione del codice, disponibile sia per Linux che per Windows, l'accoppiata doxygen + graphviz permette di generare files HTML, LaTex, RTF con tanto di diagrammi UML. Imperdibile!

venerdì 29 giugno 2007

Write in C

Geniale... prelevato da qui:

Write in C (based on "Let it Be" - The Beatles)

When I find my code in tons of trouble,
Friends and colleages come to me,
Speaking words of wisdom:
"Write in C."

As the deadline fast approaches,
And bugs are all that I can see,
Somewhere, someone whispers:
"Write in C."

Write in C, write in C,
Write in C, oh, write in C.
LISP is dead and buried,
Write in C.

I used to write a lot of FORTRAN,
For science it worked flawlessly.
Try using it for graphics!
Write in C.

If you've just spent nearly 30 hours
Debugging some assembly,
Soon you will be glad to
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
Only wimps use BASIC.
Write in C.

Write in C, write in C
Write in C, oh, write in C.
Pascal won't quite cut it.
Write in C.

{ Guitar Solo }

Write in C, write in C,
Write in C, yeah, write in C.
Don't even mention COBOL.
Write in C.

And when the screen is fuzzy,
And the editor is bugging me.
I'm sick of ones and zeros,
Write in C.

A thousand people sware that T.P.
Seven is the one for me.
I hate the word PROCEDURE,
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
PL1 is 80s,
Write in C.

Write in C, write in C,
Write in C, yeah, write in C.
The government loves ADA,
Write in C.

Carlo: "Got Multicore? ... "

Consiglio caldissimamente la lettura di questo post di Carlo Pescio, ancora un'eccezionale intuizione del Grande Maestro: design di software parallelo, con un approccio ibrido simmetrico/asimmetrico basato su considerazioni... geniali!

sabato 23 giugno 2007

Il nuovo Desktop

Un'occhiata al sito http://www.stardock.com/ ha stuzzicato la mia voglia di desktop effects... Le nuove distro di Linux, MacOS, e ora Vista offrono tutti nuove "experiences" di utilizzo del desktop.
Ma non solo. Anche gli smartphone, con i loro potentissimi processori (ma ci pensate? Il mio N70 e' svariate volte piu' potente di un vecchio Archimedes...) e i loro avanzati sistemi operativi, offrono all'utente funzionalita' eccezionali (riconoscimento vocale, servizi di assistenza automatica per le chiamate, interazione con i PC per la gestione dell'agenda).
E tutto questo incrementa la nostra produttivita', non tanto nell'utilizzo degli strumenti di lavoro tradizionali (IDE per lo sviluppo di software, word processor e fogli elettronici), quanto nella gestione delle informazioni personali, contatti, agenda e in generale comunicazione. E in piu' la possibilita' di personalizzare la scrivania, il nostro ambiente di lavoro virtuale, consente da un lato un utilizzo piu' razionale delle risorse, dall'altro aumentando la godibilita' dell'ambiente di lavoro migliorano la nostra produttivita': ricordo un articolo di eXtreme Programming dove si suggeriva di migliorare l'architettura degli uffici (mobili, distribuzione dei punti luce) per ottenere un aumento della produttivita' dei programmatori.

venerdì 15 giugno 2007

Great news! (For me at least...)

Looks like I will be involved in a great (both big and challenging) C++ project!
I will be working in a team, using agile methods and UML modelling...
Since the "great times" with the Dev-Team, this is the most intriguing project. Surely I'll write on this soon.

mercoledì 13 giugno 2007

Nice utilities

A couple of nice piece of software for windows:
RocketDock is a very nice bar Mac style, while Gantt Designer is a - wow! - Gantt diagrams designer... both of them were quite useful in my working enivonment, worth have a look!

Free online translation dictionaries

Very, very interesting. On http://www.wordreference.com/ it is possible to find a very useful translation dictionary, which is free and able to translate into English, Italian, Spanish, French and Portuguese. It's a very handy service!

And again I had a small problem with my Ubuntu desktop: by updating to the new kernel, the grub configuration was lost again, so I had to bootstrap again from CD and fix it by hand...

mercoledì 6 giugno 2007

Il futuro è Symbian

Da poco mi sono finalmente dotato di uno smart phone con Symbian OS. Temo che presto dovrò cominciare a sfruttarne a fondo le caratteristiche, per giustificare a me stesso l'esoso prezzo di acquisto...

sabato 7 aprile 2007

Useful Windoz utils

Recently I've been working mainly on Windows environments in C#. I've discovered the Windows Sysinternals utilities, which I find really useful - of course, Unix users are used to tools like these.
Have a look to the FileMon util, which lets you monitor all the file system access with nice quering facilities; the ProcessMonitor is a very nice utility too...

venerdì 23 febbraio 2007

Subversion not only for source code

I have lot of important documents, on different computers, in different locations, for different purposes.
I wanted to keep all this data as safe as I can, so I’ve set up a repository on our Subversion server for this purpose.
With TortoiseSVN I have a very nice user interface that permits me to easily keep all this documents both safe
(out server has an automatic backup system) and versioned (wow! Once you get used to it, you can’t do without!).
But subversion can be very useful even on a single machine: install subversion and TortoiseSVN, and create a repository:
svnadmin create file:///c:/svn/Documents
Now, you can add to the repository all the documents you want to keep safe and versioned (eventually organized into directories):
using explorer, open your Document folder, right-click on the document you want to add, go on the TortoiseSVN menu,
and select “add” (or “Aggiungi”, if you have the Italian language pack ;-) ).
Well, that’s all! Whenever you modify the document, its icon will change, and you’ll be able to commit it to the repository,
and do the same things you usually do on your versioning system when you work with source code.
To do a backup copy of the repository, you can use svnadmin with the dump or hotcopy commands
(I’m using both of them on our server, to keep a mirror with hotcopy and a full backup on DVD with the dump).
It’s really easy and fast to set up, even easier to use, useful… and open source! Try it!

Get subversion
Get TortoiseSVN

Here also a small Backup.bat utility I use to backup my repos:

@echo off
cd c:\svn
for /D %%i in (*) do svnadmin dump c:\svn\%%i > c:\Backup_svn\%%i_dump
cd C:\Backup_svn
del *.old.7z
ren *.7z *.old.7z
for %%f in (*_dump) do C:\Programmi\7-Zip\7z a %%f.7z %%f
for %%f in (*_dump) do del %%f
cd ..


For this script you'll need 7z as well.

sabato 17 febbraio 2007

.NET and svn

I've finally started my new job! I have to join the development of different projects in C#. There are 2 up to 7 developers for each project; until now, they used Visual Source Safe to handle all the projects, but now we have the need to export over the Internet the ability to work with centralized source. Also, from some locations we have the ability to access only the web via http or https (there are firewalls which we can't configure specifically). The solution was to use Subversion - thanks Simon, even if you'll hate me for using it with Microsoft ;) - in combination with Apache to set up a centralized service for source revision, control, and backup. All you need is:
and optionally:
Yesterday I've set up a beta environment, lets do some testing.
Keep tuned!

JUG-TO Meeting - febbraio 2007

Ok, nuovo mese, nuovo JUG meeting.
Questa volta niente ospiti internazionali (phew!), ma Bruno e Domenico ci parlano rispettivamente di UML for dummies, e di Decorator pattern.
Ovviamente solo un vuaier si perderebbe il meet...

mercoledì 24 gennaio 2007

Web 2.0 vs Client/Server

Web 2.0 is the trend! Any application developed from 2-3 years to this part is web based; I've seen even intranet applications developed with a web based interface, even if this meant a drastic reduction of performance, and a even more drastic increase of development time. Web based application are, from the administrative point of view, maintenance free, as they don't need to be deployed over the clients: I think this is the most relevant feature, and the only reason why a intranet application should be development as a web application.

But there are some good news from the traditional client/server side too: technologies like Java Webstart can drastically decrease the administration effort in distributing/maintaining applications. And also, Java code can be run on different architectures, just like web pages can be view by browsers running on almost any machine; still, I believe that client/server systems are most efficient, easier to develop, most capable on the user interface.

Surely every time I need to develop a new system, I carefully analyze pros and cons of the two models.

sabato 20 gennaio 2007

Open Terracotta

Open source and the low cost of hardware capable of advanced features - such as main boards with integrated RAID controllers, multi core processors, faster and larger RAM modules (features that few years ago were offered only on high level systems), are now offering the chance to get impressive fault tolerance and clustering features on non-dedicated systems; lots of applications like web services could gain great benefit from this kind of features, and even new approaches to normal office applications became possible: with the reliability and performance of a high end system, it is possible to implement departmental web implementations of word processors or spreadsheet with a low enough cost to compete with the licensing cost of traditional office suites. Up to now I've been thinking of cluster able software as a clustering engine (an API) used in a custom designed application: something like an application with transactions or similar constructs used to keep consistency through the various nodes of the cluster. Up to now.
Yesterday, Jonas Boner from Terracotta Inc., presented in occasion of the Turin JUG meeting, gen. 2007, Open Terracotta. Please, have a look at it! terracotta.org.
One important thing Jonas was saying is that Open Terracotta is proposing a model of clustering/replication of enterprise Web 2.0 applications based on two layers: the usual database, which is responsible to maintain clustering/replication for the persistence layer - that is the data you usually store in the DB, and Terracotta, which is aimed to maintain consistency through cluster nodes for the Session Data – that is the data about the user logged in.
I think this kind of approach is the most effective, and fits perfectly in a Web 2.0 application. But what about other contests? First of all it's important to focus on the reasons that are leading to a clustering choice: it is a matter of scaling capability, fault tolerance, or both? It's very important to understand that in the case fault tolerance becomes a concern, a “software only” solution could not be sufficient, exposing for example the network layer as a SPOF; in this contest, software becomes part of the system (and not the system itself), so the whole system must be designed as a fault tolerant composition of software AND hardware. Assumed this, I still see in Terracotta a great and easy (for the developer) way to write software focusing on the business domain instead of having to deal with the technical detail of managing replication consistency.

Java was the first language I used with an integrated concurrency model (synchronized keyword, wait() and notify(), the new concurrent package): I thought this was such a leap forward for programmers, but yesterday we discussed the “what if” scenario in which Terracotta's heap consistency clustering approach is plugged inside the open source JVM; this could lead to new great applications! Imagine how easy could be to implement a chat system, or in general any kind of application (client based or web based) using shared informations. But personally I think that Sun doesn't want to plug into the free VM features that it's willing to sell to its customers!

giovedì 18 gennaio 2007

.NET Part 2

Some more on .NET: I've started the “build your first web application” part, and I'm quite impressed: ISS behaves like a servlet container, and can handle both C# and VB code behind. And it's quite responsive, at least in a “single-user developing and testing” situation. It integrates quite easily with Ms SQL Server, but the most impressive thing (at least for me, as I've always developed web apps with Java and with tons of frameworks or library not supported by the IDE) is the capability of editing web pages WYSIWYG. And still... all this with the “Express” editions, which are free... Naturally all this works well rendered with MS Internet Explorer, and the question is: “Will it work with other browser/OSes?”. Well... try going on “msdn.microsoft.com” with firefox and linux... guess what: it works!

venerdì 12 gennaio 2007

JUG gennaio 2007

Venerdi' 19 gennaio 2007 sera... da segnare in agenda: si va tutti al JUG! Vietato mancare!

http://www.jugtorino.it/vqwiki/jsp/Wiki?MeetingGennaio2007

lunedì 8 gennaio 2007

Imperdibile!

Ubuntu e' diventato obbligatorio!!!
Ubuntu Satanic Edition: Buzz, non hai piu' scuse, questo lo *DEVI* installare!

martedì 2 gennaio 2007

Wolfenstein: Enemy Territory

Ma che bel gioco aggratis!
Ecco qualche link:
Qui si puo' scaricare il gioco
Qui anche, e non dimenticate la patch 2.60

E poi il manuale

I bot per allenarsi
Ed infine, 62.149.202.164 per giocare con noi!!
Ricordatevi di aggiornare il PunkBuster (c'e' un'eseguibile nella directory pb - che sta per punk buster, non piciu bastard! ;)