RMI. Introduzione DI GIOVANNI PULITI
|
|
|
- Bianca Guerra
- 10 anni fa
- Visualizzazioni
Transcript
1 2001 proprietà di MokaByte s.r.l. tutti i diritti riservati è vietata la riproduzione non autorizzata anche parziale RMI DI GIOVANNI PULITI Introduzione La programmazione distribuita è tra gli argomenti che hanno avuto negli ultimi tempi un rinnovato impulso grazie a Internet e alle tecnologie ad essa legate, fra cui Java. Tale modello prevede, per lo svolgimento di un determinato compito, di suddividere i vari sottotask che compongono quello complessivo fra i diversi soggetti che partecipano al network distribuito. Per computazione distribuita si intende tipicamente un modo di organizzare una applicazione in moduli differenti localizzati in spazi di indirizzamento differenti fra loro. I motivi per cui tale modello prende sempre più campo possono essere molteplici anche se, principalmente, due sono gli obiettivi che si desidera perseguire: un sensibile incremento delle prestazioni e una maggiore semplicità nella gestione delle risorse distribuite unitamente a un incremento delle potenzialità operative. Nel primo caso, ad esempio, si può pensare di suddividere un processo computazionalmente pesante in sottoroutine più leggere ed eseguire tali pezzi di applicazioni su macchine diverse ottenendo eventualmente una drastica diminuzione del tempo complessivo di esecuzione. Nel caso in cui invece l efficienza non sia l obiettivo principale, si può comunque trarre vantaggio da una organizzazione distribuita, con la possibilità di gestire meglio, e più semplicemente, le varie risorse localizzate in differenti spazi di indirizzamento. Si pensi ad esempio a una strutturazione a tre livelli (3-Tier) per la gestione di database relazionali in Internet: dal punto di vista del client ci si deve preoccupare esclusivamente dell interfacciamento con l utente e dello scambio con il server remoto delle informazioni contenute nel database. Vi è in realtà un altro motivo che spinge all utilizzo del modello distribuito: nel caso in cui si disponga di codice legacy, si può pensare di inglobare tali applicativi in oggetti remoti e pilotarne in tal modo le funzionalità da client remoti. Tipicamente questo aspetto non è molto utilizzato nel caso di RMI, che necessita di applicazioni full-java, e perciò verrà qui tralasciato rimandando la sua analisi ad altri ambiti. 1
2 In questo caso quindi sono ignorate le problematiche legate alla gestione del database, dato che tale compito è a carico delle altre parti della applicazione nel suo complesso, come il middleware e/o il demone incaricato di svolgere i compiti di DBMS. L obiettivo principale di RMI API è permettere a una applicazione in esecuzione su una macchina locale di invocare i metodi di un altro oggetto in esecuzione su un altro computer remoto: in tal modo si può passare, in maniera del tutto naturale, da una gestione locale degli oggetti a quella distribuita, senza dover effettuare scelte alternative o incompatibili con il resto della tecnologia Java. Per convenzione si definisce locale il programma che richiede l utilizzo di un servizio offerto da un programma server in esecuzione su un altra macchina. Per quella che è la struttura organizzativa funzionale del codice, in genere si definisce il programma chiamante client, mentre il remoto è detto server. Modelli distribuiti Uno dei requisiti fondamentali per implementare un sistema distribuito è disporre di un sistema di comunicazione fra macchine diverse, basato su standard e protocolli prestabiliti. Come è noto, Java permette una gestione semplificata dei socket, con i quali il programmatore è in grado di realizzare in maniera molto veloce un meccanismo di comunicazione per poter ad esempio invocare l esecuzione di un processo in remoto. Purtroppo, per quanto semplice possa risultare tale soluzione, l implementazione di una connessione via socket risolve solo il problema di fondo (come instaurare la connessione) ma lascia in sospeso tutta la parte di definizione delle modalità di invocazione e dei vari protocolli per lo scambio delle informazioni. Prima dell introduzione di RMI erano già disponibili soluzioni al problema dell esecuzione di parti di codice in remoto, basti pensare alla Remote Procedure Call (RPC): con questa tecnologia è possibile gestire procedure facenti parte di applicazioni residenti in remoto rispetto al chiamante. Le RPC hanno visto il massimo del loro successo nei sistemi Unix e sono strettamente legate al concetto di processo, ma male si inseriscono nel contesto del paradigma a oggetti. È questo il motivo principale che ha fatto nascere l esigenza di una tecnologia apposita per la gestione di oggetti distribuiti, la quale vede in RMI la soluzione full-java completamente O- bject Oriented. In realtà il panorama della progettazione e gestione di oggetti distribuiti offre valide alternative, come ad esempio DCOM (estensione di COM proprietaria di Microsoft) o CORBA: dato che una trattazione approfondita delle possibili alternative esula dagli scopi di questo documento, si può brevemente dire che la scelta può ricadere su RMI nel caso in cui si debba implementare una struttura a oggetti distribuiti full-java (sia il lato client che quello server devono essere realizzati obbligatoriamente in tale prospettiva), in maniera semplice e veloce. 2
3 L alta semplicità di RMI si paga a volte nei confronti di tecnologie concorrenti più sofisticate (e complicate) che offrono maggiori potenzialità e scalabilità. La serializzazione Il meccanismo alla base utilizzato da RMI per la trasmissioni dei dati fra client e server è quello della serializzazione: è quindi forse utile soffermarsi su questo importante sistema di trasmissione prima di affrontare nello specifico la Remote Method Invocation. Grazie all estrema semplicità con cui permette il flusso di dati complessi all interno di uno stream, la serializzazione spesso viene utilizzata anche separatamente da applicazioni RMI, e quindi quanto verrà qui detto resta di utilità generale. Il concetto di base della serializzazione è permettere una trasformazione automatica di oggetti complessi e strutture di oggetti in semplici sequenze di byte, da immettere in uno stream particolare. Tale stream, rappresentato dalla classe StreamObject, può essere manipolato nella maniera consueta di tutti gli altri stream presenti nel package java.io. Ad esempio, grazie alla serializzazione è possibile inviare oggetti di complessità arbitraria via socket (utilizzando gli stream associati al socket stesso), oppure salvarli su file al fine di mantenere la persistenza. La scrittura su stream avviene mediante il metodo writeobject() appartenente alla classe ObjectOutputStream. Ad esempio, volendo salvare su file un oggetto qualsiasi, si potrebbe scrivere Record record = new Record(); FileOutputStream fos = new FileOutputStream("data.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(record); dove si è salvato su file binario (data.ser) un oggetto di tipo Record. L operazione, in questo caso, è stata fatta in due fasi: creazione di uno stream di serializzazione prima, e associazione di tale stream a un comune FileOutputStream. Il punto fondamentale sta nel capire quando un oggetto possa essere serializzato; ma, prima di analizzare questo aspetto, si può vedere come sia altrettanto semplice l operazione opposta che permette la trasformazione da stream a oggetto. FileInputStream fis = new FileInputStream("data.ser"); ObjectInputStream ois = new ObjectInputStream(fis); record = (Record)ois.readObject(); ois.close(); Qui si utilizza la classe ObjectInputStream e il metodo readobject(): in questo caso è necessaria una operazione di cast, dato che viene restituito un oggetto di tipo Object. Ovviamente in entrambi i casi le operazioni di lettura e scrittura devono essere inserite in appositi blocchi try catch. 3
4 Per poter serializzare un oggetto, un gruppo di oggetti, una struttura di complessità arbitraria, il meccanismo è sempre lo stesso e non ci sono particolari differenze di cui tener conto. L unico vincolo inviolabile è che si possono serializzare solamente istanze di oggetti serializzabili. Un oggetto è serializzabile se implementa l interfaccia Serializable. Per questo, ad esempio, l oggetto Record visto nell esempio di cui sopra potrebbe essere così definito: public class Record implements Serializable { private String firstname; private String lastname; private int phone; public Record (String firstname, String lastname, int phone) { this.firstname = firstname; this.lastname = lastname; this.phone = phone; La regola della serializzazione è ricorsiva, per cui un oggetto, per essere serializzabile, deve inoltre contenere esclusivamente oggetti serializzabili. La maggior parte delle classi contenute all interno del JDK è serializzabile, fatta eccezione per alcuni casi particolari: tipicamente infatti non sono serializzabili tutte le classi che inglobano al loro interno strutture dati binarie dipendenti dalla piattaforma. Ad esempio molti degli oggetti del package JDBC, quello per l interfacciamento con database SQL, non sono serializzabili: in questo caso infatti i vari oggetti contengono al loro interno puntatori a strutture dati o codice nativo utilizzato per la comunicazione con lo strato driver del database. Per sapere se un dato oggetto sia serializzabile o meno si può utilizzare il tool Serial Version Inspector (comando serialver), messo a disposizione dal JDK, passandogli il nome completo della classe da analizzare. Ad esempio, per verificare che la classe java.lang.string sia serializzabile si può scrivere da linea di comando la seguente istruzione serialver java.lang.string che restituisce il seguente risultato java.lang.string: static final long serialversionuid = L; Con il comando serialver - show 4
5 si manda in esecuzione la versione con interfaccia grafica di tale strumento (vedi fig. 1). Figura 1 Il tool Serial Version Inspector è disponibile anche in versione grafica. La serializzazione e la trasmissione degli oggetti Benché il suo utilizzo sia relativamente semplice, la serializzazione nasconde alcuni aspetti importanti relativamente alla trasmissione degli oggetti. Per quanto visto finora si potrebbe immaginare che la serializzazione permetta la trasmissione di oggetti per mezzo di stream: in realtà questa concezione è quanto mai errata, dato che a spostarsi sono solamente le informazioni che caratterizzano un istanza di un particolare oggetto, mentre l oggetto vero e proprio non si sposta mai. Durante la trasmissione non viene mai spostato fisicamente l oggetto ma ne viene inviata solo una sua rappresentazione e successivamente viene ricreata una copia identica: al momento della creazione di questa copia, infatti, il runtime creerà un oggetto nuovo, riempiendo i suoi dati con quelli ricevuti dal client. Risulta ovvio quindi che, al fine di simulare questo spostamento virtuale, su entrambi i lati (sia server che client) debba essere presente il codice relativo all oggetto: in particolare il runtime deve poter accedere al file fisico.class, oppure deve poterlo scaricare dalla rete come ad esempio avviene in maniera automatica con le applet. Assume particolare importanza quindi il cosiddetto serialversionuid della classe che serve per identificare di quale tipo di oggetto siano i dati prelevati dallo stream. Si tenga presente che nella trasmissione delle informazioni relative all oggetto sono inviati solamente quei dati realmente significativi della particolare istanza. Per questo non vengono inviati i metodi (che non cambiano mai), e nemmeno le costanti. Non vengono inviate inoltre le variabili con specificatore static che formalmente sono associate alla classe e non alla istanza. Infine Java, tramite la parola chiave transient, mette a disposizione un ulteriore meccanismo di gestione delle variabili: in questo caso indica una variabile non persistente per cui, pur non trattandosi di una costante, il suo valore verrà istanziato al valore di default al momento della creazione in uscita dallo stream di serializzazione. 5
6 L interfaccia Externalizable Come si è potuto vedere, l unico passo fondamentale per rendere un oggetto serializzabile è l implementazione della interfaccia Serializable; ma questa non è la sola messa a disposizione dal JDK, dato che esiste anche la Externalizable. La differenza sta nel fatto che, mentre nel primo caso il processo di trasformazione da oggetto strutturato a stream viene gestito completamente dalle classi messe a disposizione dal JDK, con la Externalizable tale trasformazione deve essere implementata direttamente dal programmatore tramite una ridefinizione del corpo dei due metodi readexternal e write- External. Si utilizza quindi l interfaccia Externalizable se non si desidera usare il meccanismo standard ma piuttosto leggere e scrivere gli oggetti secondo un qualche protocollo proprietario. Ad esempio volendo creare un oggetto MyObject con una sua logica di serializzazione si potrebbe definire Public class MyObject implements Externalizable { String Name; public MyObject(String n) { Name = n; // salva i dati in modo personalizzato public void writeexternal(objectoutput out) {... // legge i dati in modo personalizzato public void readexternal(objectinput in) {... A questo punto l oggetto MyObject può essere serializzato e deserializzato in maniera standard. Architettura di RMI Si può passare adesso ad analizzare la struttura di una applicazione RMI: osservando la fig. 2 è possibile vedere come essa sia organizzata orizzontalmente in strati sovrapposti, e in due moduli verticali paralleli fra loro. 6
7 Figura 2 Organizzazione a strati della architettura lato client e lato server di RMI. Questa suddivisione verticale vede da una parte il lato client, e dall altra il server: il primo è quello che contiene l applicazione che richiede il servizio di un oggetto remoto, che a sua volta diviene il servente del servizio RMI. Lo strato più alto del grafico è costituito da entrambi i lati (client e server) da una applicazione eseguita sulla Java Machine in esecuzione su quel lato: nel caso del client si tratta di una applicazione che effettua le chiamate ai metodi di oggetti remoti, i quali poi sono eseguiti dalla applicazione remota. Questa ha quindi un ciclo di vita indipendente dal client che di fatto ignora la sua presenza. Subito sotto il livello applicazione troviamo i due elementi fondamentali dell architettura RMI, ovvero lo stub e lo skeleton. Questi due oggetti forniscono una rappresentazione duplice dell oggetto remoto: lo stub fornisce una simulazione locale sul client dell oggetto remoto che però, grazie allo skeleton, vive e viene eseguito sul server. Per questo motivo i due elementi non sono utilizzabili separatamente. Da un punto di vista funzionale, il client, dopo aver ottenuto un reference dell oggetto remoto, più precisamente lo stub di tale oggetto, esegue i metodi messi a disposizione per l invocazione remota, in maniera del tutto analoga al caso in cui l oggetto sia locale. Ad esempio si può quindi scrivere 7
8 oggetto_remoto.nome_metodo(); Da un punto di vista sintattico non vi è quindi nessuna differenza fra un oggetto locale ed uno remoto. In conclusione il client (intendendo sia il programma che il programmatore della applicazione lato client) non ha che in minima parte la percezione del fatto di stare utilizzando un oggetto remoto. Passaggio di parametri in RMI Uno dei grossi vantaggi nell utilizzo di RMI consiste nella semplicità con cui si possono passare parametri o similmente riceverne indietro dei risultati: senza nessuna differenza rispetto al caso locale, per passare un parametro a un metodo remoto si può scrivere risultato = oggetto_remoto.nome_metodo(parametro_1,..., parametro_n); In questo caso, riconsiderando lo schema riportato in fig. 2, i vari parametri vengono serializzati dalla virtual machine del client, inviati sotto forma di stream al server, il quale li utilizzerà in forma deserializzata per eseguire il corpo del metodo invocato. Anche il percorso inverso, ovvero quello che restituisce un risultato al client, effettua una serializzazione e quindi una deserializzazione dei dati. Il procedimento, che da un punto di vista teorico risulta essere piuttosto complesso, è semplicissimo da utilizzare. L unica reale avvertenza di cui si deve tener conto è che i parametri passati e il risultato ricevuto siano oggetti serializzabili. Si tenga presente che, durante il procedimento di trasmissione, degli oggetti in entrata ed in uscita sono trasmessi dal server al client e viceversa; viene sempre effettuata una copia (clonazione) dei reference, per cui non si ha la possibilità di lavorare su aree di memoria fisse, esigenza questa del resto non necessaria dato che si opera in uno scenario distribuito. Gli strati RRL e TL Si passi adesso ad analizzare gli strati sottostanti dello schema riportato in fig. 2: i lati server e client, sono collegati col sottostante Remote Reference Layer (RRL) che a sua volta si appoggia al Transport Layer (TL). Il primo dei due ha il compito di instaurare un collegamento logico fra i due lati, di codificare le richieste del client, inviarle al server, decodificare le richieste e inoltrarle allo skeleton. Ovviamente nel caso in cui quest ultimo fornisca dei risultati per il particolare tipo di servizio richiesto, il meccanismo di restituzione di tali valori avviene in maniera del tutto simile ma in senso opposto. 8
9 Al livello RRL viene instaurato un collegamento virtuale fra i due lati client e server, mentre fisicamente la connessione avviene al livello sottostante, quello definito Transport Layer. Tale collegamento è di tipo sequenziale ed è per questo che si richiede la serializzazione dei parametri da passare ai metodi. Il collegamento virtuale del RRL si basa su un protocollo di comunicazione generico e indipendente dal particolare tipo di stub o skeleton utilizzati: questa genericità permette di mantenere la massima indipendenza dal livello stub/skeleton, tanto che è possibile sostituire il RRL con versioni successive meglio ottimizzate. Per quanto riguarda invece il protocollo di conversione delle invocazioni dei metodi, dell impacchettamento dei riferimenti ai vari oggetti, e tutto quello che concerne la gestione a basso livello, abbiamo che una prima conversione dall astrazione del livello stub/skeleton avviene dal RRL, ma gran parte del lavoro viene fatto dal TL, in cui si perde la concezione di oggetto remoto e/o locale e i dati vengono semplicemente visti come sequenze di byte da inviare o leggere verso certi indirizzi di memoria. Quando il TL riceve una richiesta di connessione da parte del client, localizza il server RMI relativo all oggetto remoto richiesto: successivamente viene eseguita una connessione per mezzo di un socket appositamente creato per il servizio. Una volta che la connessione è stabilita, il TL passa la connessione al lato client del RRL e aggiunge un riferimento dell oggetto remoto nella tabella opportuna. Solo dopo questa operazione il client risulta effettivamente connesso al server e lo stub è utilizzabile dal client. Il TL è responsabile del controllo dello stato delle varie connessioni: se passa un periodo di tempo significativo senza che venga effettuato nessun riferimento alla connessione remota, si assume che tale collegamento non sia più necessario, e quindi viene disattivato. Mediamente il periodo di timeout scatta dopo 10 minuti. L ultimo livello che però non viene incluso nella struttura RMI, è quello che riguarda la gestione della connessine al livello di socket e protocolli TCP/IP. Questo aspetto segue le specifiche standard di networking di Java e non offre particolari interessanti in ottica RMI. RMI in pratica Si può ora procedere ad analizzare quali siano i passi necessari per realizzare una applicazione RMI. Tutte le classi e i metodi che si analizzeranno, e in generale tutte le API necessarie per lavorare con RMI, sono contenute nei package java.rmi e java.rmi.server. Anche se dal punto di vista della programmazione a oggetti sarebbe più corretto parlare di classi, in questo caso si parlerà genericamente di oggetti remoti e locali intendendo sia il tipo che la variabile. A tal proposito, in base alla definizione ufficiale, si definisce remoto un oggetto che implementi l interfaccia Remote e i cui metodi possano essere eseguiti da una applicazione client non residente sulla stessa macchina virtuale. 9
10 Un interfaccia remota invece rende disponibile al mondo intero il set di metodi utilizzabili per l invocazione a distanza; ovviamente non è necessario definire nell interfaccia quei metodi a solo uso interno della classe. Si immagini quindi di definire MyServer un oggetto per il momento non remoto. public class MyServer { public void String concat(string a, String b) { return a + b; Il metodo compute in questo caso esegue una concatenazione fra i due argomenti passati in input restituendo in uscita la stringa risultante. A parte il vincolo legato alla serializzabilità dei parametri, non ci sono limiti alla complessità delle operazioni eseguibili all interno di metodi remoti. Dopo aver definito questa semplice classe per trasformarla nella versione remota si deve per prima cosa definire la sua interfaccia remota. public interface MyServerInterface extends Remote { public String concat(string a, String b) throws RemoteException; Come si può osservare da queste poche righe di codice, per definire un interfaccia remota è necessario estendere la java.rmi.remote: questa è una interfaccia vuota e serve solo per verificare durante l esecuzione che le operazioni di invocazione remota siano plausibili. È obbligatoria la gestione dell eccezione java.rmi.remoteexception: infatti, a causa della distribuzione in rete, oltre alla gestione di eventuali problemi derivanti dalla normale esecuzione del codice (bug o incongruenze di vario tipo), si deve adesso proteggere tutta l applicazione da anomalie derivanti dall utilizzo di risorse remote. Ad esempio l host potrebbe venire a mancare improvvisamente la connessione fisica verso l host dove è in esecuzione il server RMI. Definita l interfaccia remota si deve modificare leggermente la classe di partenza, in modo che implementi questa interfaccia: public class MyServerImpl implements MyServerInterface extends UnicastRemoteObject { public MyServer() throws RemoteException { public String concat(string a, String b) throws RemoteException { return a + b; 10
11 Il nome della classe è stato cambiato a indicare l implementazione della interfaccia remota (convenzione questa piuttosto tipica in Java); come si può notare oltre a dichiarare di implementare l interfaccia precedentemente definita, si deve anche estendere la classe UnicastRemoteObject. Oltre a ciò, all oggetto è stato aggiunto un costruttore di default il quale dichiara di propagare eccezioni RemoteException: tale passaggio non ha una motivazione apparente, ma è necessario per permettere al compilatore di creare correttamente tutte le parti che compongono il lato server (stub e skeleton). La classe UnicastRemoteObject deriva dalle due classi, RemoteServer e RemoteObject: la prima è una superclasse comune per tutte le implementazioni di oggetti remoti, mentre l altra semplicemente ridefinisce hashcode() ed equals() in modo da permettere correttamente i confronti tra oggetti remoti. L utilizzazione della classe RemoteServer permette di utilizzare implementazioni di oggetti remoti diverse da UnicastRemoteObject, anche se per il momento quest ultima è l unica supportata. L organizzazione delle più importanti classi per RMI è raffigurata in fig. 3. Figura 3 Struttura gerarchica delle classi ed interfacce più importanti in RMI. Dopo questa trasformazione l oggetto è visibile dall esterno, ma ancora non utilizzabile dal meccanismo di RMI; si devono infatti creare i cosiddetti stub e skeleton. Essi sono ottenibili in maniera molto semplice per mezzo del compilatore rmic, disponibile all interno del JDK 1.1 e successivi: partendo dal bytecode ottenuto dopo la compilazione dell oggetto remoto, questo tool produce lo stub e lo skeleton relativi. 11
12 Ad esempio, riconsiderando il caso della classe MyServerImpl, con una operazione del tipo rmic MyServerImpl si ottengono i due file MyServerImpl_stub.class e MyServerImpl_skel.class. A questo punto si hanno a disposizione tutti i componenti per utilizzare l oggetto remoto MyServerImpl, ma si deve provvedere a rendere possibile il collegamento tra client e server per l invocazione remota. Sul lato server l applicazione che gestisce lo skeleton deve rendere pubblico al mondo che possiede al suo interno un oggetto abilitato all invocazione remota. Per far questo è necessario utilizzare il metodo statico java.rmi.naming.bind che associa all istanza dell oggetto remoto un nome logico con cui tale oggetto può essere identificato in rete. Quindi, dopo aver creato una istanza dell oggetto remoto, MyServer server = new MyServer(); si provvede a effettuarne la registrazione utilizzando un nome simbolico Naming.bind("MyServer", server); Questa operazione, detta registrazione, può fallire e in tal caso viene generata una eccezione in funzione del tipo di errore. In particolare si avrà una AlreadyBoundException nel caso in cui il nome logico sia già stato utilizzato per un altra associazione, una Malformed- URLException per errori nella sintassi dell URL, mentre il runtime produrrà Remote- Exception per tutti gli altri tipi di errore legati alla gestione da remoto dell oggetto. Ogni associazione nome logico oggetto remoto è memorizzata in un apposito registro detto rmiregistry. In questo caso rmiregistry è anche il nome della applicazione che gestisce tale archivio, applicazione che deve essere lanciata sul lato server prima di ogni bind. Il client a questo punto è in grado di ottenere un reference all oggetto con una ricerca presso l host remoto utilizzando il nome logico con cui l oggetto è stato registrato. Ad esempio si potrebbe scrivere MyServerInterface server; String url = "//" + serverhost + "/MyServer"; server = (MyServerInterface) Naming.lookup(url); e quindi utilizzare il reference per effettuare le invocazioni ai metodi remoti System.out.println(server.concat("Hello ", "world!")); Per ottenere il reference si utilizza il metodo statico Naming.lookup(), la cui invocazione può essere considerata sul lato client il corrispettivo alla operazione di bind sul server. 12
13 L URL passato come parametro alla lookup() identifica il nome della macchina che ospita l oggetto remoto e il nome con cui l oggetto è stato registrato. Si noti come sul client si ottiene un reference non tanto all oggetto remoto, ma piuttosto all interfaccia remota, dato che effettivamente sul client arriva lo stub, e non l oggetto vero e proprio. Entrambe le operazioni di registrazione e di ricerca accettano come parametro un URL: il formato di tale stringa è la seguente: rmi://host:port/name dove host è il nome del server RMI, port la porta dove si mette in ascolto il registry, name il nome logico. Sul server non è necessario specificare l host, dato che per default assume l indirizzo della macchina stessa sulla quale l applicazione server RMI è mandata in esecuzione. In entrambi i casi il numero della porta di default è la 1099, ma se si specifica altrimenti, allora tale informazione dovrà essere passata al rmiregistry con il seguente comando: rmiregistry numero_porta Download del codice da remoto La creazione della coppia stub skeleton permette di disaccoppiare l applicazione e dar vita al meccanismo di invocazione remota di RMI. Quello che è importante tenere ben presente è che lo spostamento dello stub dal server al client viene effettuato tramite la serializzazione delle classi, meccanismo che permette la ricreazione della struttura a oggetti da una parte all altra dell architettura parallela. Riprendendo in considerazione il meccanismo della serializzazione si potrà notare come in effetti questo sistema permetta lo spostamento solo delle informazioni importanti di un oggetto, informazioni che sono poi utilizzate per ricostruire l istanza di tale oggetto dall altra parte del socket. Questa impostazione ha numerose conseguenze: in RMI questo significa che, se il client riceve via serializzazione un oggetto remoto, per poterlo deserializzare e istanziare deve poter accedere al codice di tale oggetto remoto. Tipicamente questo significa dover fornire le classi al client installando i vari.class sulla macchina locale. Una possibile alternativa è quella di utilizzare direttamente il classloader della JVM del client per scaricare tali file: utilizzando un server HTTP infatti è possibile effettuare il download delle classi direttamente da Internet. In questo caso il classloader effettua una chiamata al motore HTTP del browser per scaricare le classi necessarie: in tale situazione non c è differenza fra oggetti remoti che devono essere 13
14 presenti in locale per la deserializzazione, o normali classi Java necessarie per far funzionare l applet. In questa condizione le varie classi sono localizzate automaticamente in Internet, facendo riferimento al codebase di provenienza (che tra l altro è l unico indirizzo dal quale il codice può essere scaricato). Per quanto riguarda invece le applicazioni, la mancanza del browser complica le cose, dato che devono essere risolti due problemi: il primo è come effettuare il download vero e proprio delle classi, e il secondo come localizzare il server dal quale scaricare tale codice. Per il primo aspetto non ci si deve preoccupare più di tanto, dato che esiste un oggetto apposito che effettua tale operazione: si tratta della classe RMIClassLoader che fa parte del package rmi.server, e può essere vista come una evoluzione della ClassLoader. Il meccanismo di download delle classi al solito avviene per mezzo di un server HTTP. Rimane da risolvere il modo in cui specificare l indirizzo dell host remoto dove è in funzione tale server. Questo può essere fatto in due modi: o lo si scrive direttamente dentro il codice (hardcoded URL), oppure lo si passa al client come parametro di configurazione dall esterno. Questa è una soluzione che, seppur non troppo elegante, è attuabile senza problemi solo nel caso delle applet: infatti, in questo caso il codice della applicazione client viene scaricato ogni volta dal server e si può avere la certezza che venga eseguita sempre l ultima versione del codice. Per le applicazioni invece, per ogni modifica del codice o ai parametri di configurazione (vedi URL remoto), si deve re-installare il client, fatto che non è molto in linea con la filosofia della programmazione distribuita. Anche in questo caso Java offre una soluzione molto più elegante, semplice e soprattutto automatizzata: invece di cablare le informazioni relative a dove reperire il codice nel client, si può pensare di memorizzarle nel server e passarle al client. Inoltre questo meccanismo fa parte del protocollo RMI per cui tale informazione viene passata direttamente al client al momento del bisogno. Per fare questo è necessario mandare in esecuzione il server RMI specificando nella opzione java.rmi.server.codebase l URL presso cui prelevare via HTTP le classi necessarie. Ad esempio, usando il comando Java Djava.rmi.server.codebase = ServerRmi Anche in questo caso ServerRmi indica il nome della applicazione server RMI, mentre nome_host:port specifica l indirizzo Internet e la porta dove è in funzione il server HTTP. Tale demone dovrà avere accesso alle classi remote che dovranno essere posizionate nella directory rmi_dir/. 14
15 Strettamente legato al problema del download del codice vi è quello della sicurezza: una delle prime cose che vengono dette quando si studia la programmazione legata alla rete è che, tutte le volte che si esegue del codice scaricato da remoto, questo può portare a problemi di sicurezza (chi garantisce che tale codice non esegua operazioni pericolose?). Java effettua in tal senso un controllo molto scrupoloso, grazie alla classe SecurityManager che, nel caso di RMI si chiama RMISecurityManager. Dal punto di vista del client, se nessun RMISecurityManager è stato installato, allora potranno essere caricate classi solamente dal classpath locale. Se il client viceversa tenta di invocare metodi di oggetti inviati al server per mezzo di una sorta di RMI rovesciato, e il server non possiede i vari stub localmente, tali invocazioni falliranno, e il client riceverà una eccezione remota. RMI e la programmazione per pattern L estrema semplicità con cui è possibile realizzare applicazioni distribuite in Java permette sicuramente di semplificare il lavoro in maniera notevole, ma spesso si dimostra essere anche la sua principale limitazione. Alcune delle limitazioni imposte dal modello alla base di RMI possono essere superate in maniera piuttosto brillante grazie a una opportuna progettazione della struttura delle classi che compongono lo scheletro dell applicazione. In particolare la programmazione per pattern ([GOF] [java pattern] [mokabyte pattern]), permette di dar vita a interessanti soluzioni, e proprio per questo saranno presi in esame due pattern particolarmente utili, il Factory Method e il Command. RMI ed il pattern Factory Se si ripensa per un momento alla modalità di pubblicazione di un oggetto remoto da parte del server RMI, si potrà osservare come la funzione di creazione e registrazione sia un compito totalmente a carico del server. Per una precisa scelta progettuale quindi, visto che la registrazione dell oggetto avviene una volta sola, l istanza dell oggetto remoto sarà l unica disponibile e quindi condivisa fra tutti i client possibili. Pensata per la massima semplicità possibile, in molti casi però questa soluzione risulta essere troppo rigida e non sufficiente per creare strutture distribuite complesse. Si pensi ad esempio a tali oggetti come a veri e propri servizi messi a disposizione dal server, accessibili dal client proprio perché oggetti remoti (e per questo per brevità verranno qui chiamati oggetti remoti di servizio ). Per rendere tali oggetti pubblici e invocabili da un client RMI, si potrebbe pensare di crearne un certo numero, e successivamente di registrarli nel registro remoto con nomi differenti. 15
16 Ovviamente tale soluzione non risolve il problema della condivisione fra i vari client, dato che per tanti che possano essere gli oggetti remoti di servizio registrati, i client potrebbero essere in numero maggiore; inoltre tale organizzazione non risolve il problema della creazione on demand da parte del client. Sebbene il modello teorico di RMI non preveda, almeno per il momento, una soluzione a tale limitazione, grazie all utilizzo di un particolare schema progettuale, il pattern Factory appunto, si può ovviare a tale inconveniente in modo piuttosto semplice. Si supponga ad esempio di avere un insieme base di oggetti strutturati come riportato in fig. 4. Figura 4 Struttura gerarchica di base per la gestione di messaggi di log. Si tratta di una semplice gerarchia di classi per la gestione dei messaggi di log all interno di una applicazione: per semplicità verrà preso in considerazione il caso in cui sia presente il solo metodo log(string messaggio) per la produzione di tali messaggi. La classe base (Logger) quindi serve per gestire messaggi di tipo generico, mentre le due derivate potrebbero implementare tecniche particolari per la gestione di messaggi verso file (classe FileLogger) e verso uno stream generico (classe StreamLogger). A tal punto si può immaginare che un ipotetico client possa aver bisogno di utilizzare i servizi di un oggetto di tipo FileLogger oppure StreamLogger, ad esempio per memorizzare alcune informazioni relative al suo funzionamento. Si potrebbe quindi ipotizzare che ogni client debba o voglia poter produrre messaggi propri indipendentemente dagli altri, e che tali messaggi siano gestiti da un server centrale. Utilizzando RMI allora si dovranno per prima cosa creare n oggetti remoti (in teoria uno per ogni client che desideri fare log da remoto) e successivamente registrarli. 16
17 Per rendere remoti gli oggetti visti in precedenza è necessario modificare leggermente la gerarchia di classi, cosa che può portare a una organizzazione delle classi come quella riportata in fig. 5. Figura 5 Versione remota delle classi per la gestione dei messaggi da client RMI. Come si può notare, la classe base è stata sostituita dalla interfaccia remota RemoteLogger, la quale, oltre a sopperire alla funzione di interfaccia standard, permette alle sottoclassi di essere oggetti remoti a tutti gli effetti. Si è predisposta in tal modo la base per permettere l utilizzo da client RMI di oggetti remoti. A questo punto si deve predisporre un qualche meccanismo che permetta la creazione di tali oggetti anche da parte di client RMI. La classe LoggerFactory che implementa il cosiddetto pattern Factory, è a tutti gli effetti un oggetto remoto come quelli visti in precedenza: tramite la sua registrazione nel registro RMI, ogni client potrà ottenerne lo stub ed invocarne il metodo remoto getlogger(), la cui implementazione è riportata di seguito. public RemoteLogger getlogger(int type) throws RemoteException { RemoteLogger ret = null; if (type == 1) { ret = new RemoteFileLogger(); 17
18 if (type == 2){ ret = new RemoteStreamLogger(); return ret; Come si può notare, tale metodo, controllando il valore del parametro passato, è in grado di restituire un oggetto (remoto) di tipo FileLogger e StreamLogger; più precisamente viene restituita un interfaccia remota Logger, cosa che permette di mantenere la massima genericità possibile. Da un punto di vista organizzativo le classi remote che implementano il Factory sono strutturate secondo lo schema UML riportato in fig. 6. Figura 6 Il factory remoto Il client invocando il metodo remoto getlogger() riceverà lo stub dell oggetto remoto, il quale verrà eseguito sul server remoto, in perfetto accordo con il modello teorico di RMI. Class Loader, Security Manager e Garbage Collection In maniera del tutto analoga a quanto avviene per le classi standard, la JVM carica automaticamente tutte le classi necessarie per utilizzare gli oggetti remoti: in particolare, questa operazione viene eseguita in modo automatico per gli stub che insieme agli skeleton risiedono sul Server RMI. Questa operazione viene eseguita dal class loader di RMI, il java.rmi.rmiclassloader, che utilizza l URL sorgente contenuto in java.rmi.server.codebase. Tale proprietà è automaticamente impostata all URL dell host da cui l applet è stata scaricata; mentre, se si tratta di un applicazione, essa va invece settata esplicitamente, per esempio da riga di comando: 18
19 java -Djava.rmi.server.codebase = //myhost MyClient Per quanto riguarda la sicurezza è noto come essa sia in Java di primaria importanza, ed è per questo motivo che, per gestire la nuova situazione distribuita, è stato introdotto un apposito security manager, chiamato java.rmi.securitymanager: tale componente deve essere e- splicitamente installato dall interno dell applicazione client prima di tentare ogni richiesta di servizio remoto per mezzo di una istruzione del tipo: System.setSecurityManager(new java.rmi.rmisecuritymanager()); Nel caso il client sia una applet, tale compito è a carico del browser sempre che questo supporti RMI. Per quanto riguarda la gestione della memoria, anche se la gestione distribuita in questo caso coinvolge una serie di problematiche notevolmente più complesse, il meccanismo di garbage collecting continua a funzionare in maniera del tutto simile al caso non remoto, e in modo del tutto trasparente ed automatico. Attivazione di oggetti remoti L utilizzo del pattern Factory risolve in maniera piuttosto agile alcune delle limitazioni imposte dal modello RMI: con tale tecnica infatti è possibile attivare oggetti al momento della effettiva necessità su richiesta del client, e in modo esclusivo. Rispetto alla situazione standard, il problema dello spreco delle risorse è quindi ridotto, dato che, tranne che per factory remoto, gli altri oggetti remoti sono inizializzati al momento dell effettivo bisogno. Con il rilascio della piattaforma Java 2 è stata introdotta una tecnica alternativa, che si basa su un altro tipo di oggetti remoti: invece che derivare da UnicastRemoteObject, in questo caso l oggetto attivabile su richiesta del cliente estende direttamente la classe java.rmi.activation.activatable. Questa maggiore flessibilità permette un più razionale utilizzo delle risorse, senza sconvolgere di fatto l organizzazione delle applicazioni, dato che dal punto di vista del client RMI il meccanismo di invocazione remota è identico al caso standard. Le operazioni da fare per modificare un oggetto remoto riguardano, come accennato in precedenza, esclusivamente il lato server. L oggetto remoto in questo caso deve essere modificato nel seguente modo: 1. estendere la classe Activatable invece che UnicastRemoteObject import java.rmi.*; import java.rmi.activation.*; public class Active extends Activatable si noti l import del package java.rmi.activation al posto del java.rmi.server; 19
20 2. rimuovere o commentare il costruttore vuoto che prima era obbligatoriamente necessario definire; al suo posto mettere la versione riportata di seguito public Active(ActivationId id, MarshallObject data) throws Exception { super(id, data); A questo punto formalmente l oggetto non è più un oggetto remoto ma è detto attivabile. Resta da vedere come modificare il server per permettere l installazione di tali tipi di oggetti. Per prima cosa si deve osservare che in questo caso il server deve restare sempre attivo per tutto il tempo necessario all utilizzo degli oggetti remoti da parte dei client: infatti in questo caso l oggetto viene direttamente gestito da un demone apposito (rmid), mentre quello che prima era detto server remoto ora svolge solamente la funzione di installazione degli oggetti remoti; dopo che tale installazione è terminata, il server può uscire. Proprio per questo motivo in genere si utilizzano nomi del tipo setupxxx invece di serverxxx. Il processo di installazione si traduce nel creare un ambiente di lavoro per l oggetto attivabile (quello che si definisce ActivationGroup), settando eventualmente delle variabili che verranno utilizzate al momento della inizializzazione dell oggetto attivabile; successivamente tale setup-class provvede a registrare tale oggetto nel registro RMI. Di seguito sono riportate sinteticamente le operazioni da svolgere per installare un oggetto attivabile import java.rmi.*; import java.rmi.activation.*; import java.util.properties; installare un security manager appropriato creare un istanza di ActivationGroup Properties props = (Properties)System.getProperties().clone(); ActivationGroupDesc agd = new ActivationGroupDesc(props, null); ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(agd); ActivationGroup.createGroup(agi, agd, 0); creare infine una istanza di ActivationDesc la quale fornisce tutte le informazioni di cui il demone rmid necessita per creare le istanze vere e proprie degli oggetti attivabili. Queste informazioni consistono di varie parti, come ad esempio il nome della classe, la collocazione del codice remoto, e una istanza della classe che serve per passare una configurazione di inizializzazione all oggetto remoto. 20
21 Ad esempio si può scrivere ActivationDesc desc; Desc = new ActivationDesc("EchoApp.EchoImpl", location, data); La classe MarshalledObject, introdotta con il JDK 1.2, contiene un bytestream dove viene memorizzata un rappresentazione serializzata dell oggetto passato al suo costruttore. public MarshalledObject(Object obj) throws IOException Il metodo get restituisce una copia non serializzata dell oggetto originale. La modalità con cui vengono effettuate le operazioni di serializzazione e deserializzazione sono le stesse utilizzate durante il processo di marshalling dei parametri durante una invocazione RMI di un metodo remoto. In particolare, durante la serializzazione l oggetto viene memorizzato con il codebase dell URL da dove la classe eventualmente può essere scaricata. Inoltre ogni oggetto remoto memorizzato all interno del MarshalledObject è rappresentato con una istanza serializzata dello stub dell oggetto stesso. La classe MarshalledObject risulta essere utile in tutti quei casi in cui si debbano implementare manualmente alcuni passaggi tipici di RMI, come il trasferimento di uno stub da client a server, oppure la serializzazione dello stesso secondo la semantica di serializzazione utilizzata in RMI. In particolare è molto utile la possibilità di scaricare, per mezzo del metodo get, la classe corrispondente all oggetto remoto, se questa non è presente in locale al momento della lookup da parte del client RMI. Questa funzione infatti permette di risolvere uno dei problemi principali di RMI, ovvero la necessità di dover installare sul client il codice (.class) corrispondente allo stub dell oggetto remoto, prima di effettuare una lookup. Bibliografia la specifica ftp://ftp.javasoft.com/docs/jdk1.2/serial-spec-jdk1.2.pdf le FAQ la HomePage dell RMI la specifica ftp://ftp.javasoft.com/docs/jdk1.2/rmi-spec-jdk1.2.pdf 2001 proprietà di MokaByte s.r.l. tutti i diritti riservati è vietata la riproduzione non autorizzata anche parziale 21
Socket & RMI Ingegneria del Software - San Pietro
Socket & RMI Ingegneria del Software - San Pietro Socket È possibile trattare la comunicazione di rete allo stesso modo con cui è possibile trattare la lettura da file. La classe Socket rappresenta la
Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144
Mobilità di Codice Abbiamo già visto come un dato host possa trasmettere un oggetto (serializzabile) ad un altro host. Quest ultimo potrà eseguire l oggetto pur non possedendo il bytecode della classe
RMI Remote Method Invocation
RMI Remote Method Invocation [Pagina intenzionalmente vuota] (1 12 2004) slide 4:1/18 (p.106) Un applicazione RMI è un applicazione distribuita ad oggetti. Applicazione RMI tipica, strutturata in: server:
Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247
Registri RMI Per poter interagire con un server remoto, un client deve essere in possesso di una sua referenza remota (ovvero un oggetto stub). Un servizio di Naming è una risorsa centralizzata che può
RMI. Java RMI RMI. G. Prencipe [email protected]
Java Remote Method Invocation -- RMI G. Prencipe [email protected] RMI RMI è una tecnologia JAVA che permette a una JVM di comunicare con un altra JVM per farle eseguire metodi È possibile che oggetti
Java Remote Method Invocation
Java Remote Method Invocation Programmazione in Rete e Laboratorio Comunicazione distribuita Port1 Java VM1 Java VM2 Port 2 Matteo Baldoni Dipartimento di Informatica Universita` degli Studi di Torino
Registratori di Cassa
modulo Registratori di Cassa Interfacciamento con Registratore di Cassa RCH Nucleo@light GDO BREVE GUIDA ( su logiche di funzionamento e modalità d uso ) www.impresa24.ilsole24ore.com 1 Sommario Introduzione...
Programmazione di sistemi distribuiti
Programmazione di sistemi distribuiti I Sistemi Distribuiti, per loro natura, prevedono che computazioni differenti possano essere eseguite su VM differenti, possibilmente su host differenti, comunicanti
UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124
UnicastRemoteObject Java RMI fornisce diverse classi base per definire server remoti: UnicastRemoteObject < RemoteServer < RemoteObject dove A < B significa che A è una sottoclasse di B. UnicastRemotObject
Gestione Risorse Umane Web
La gestione delle risorse umane Gestione Risorse Umane Web Generazione attestati di partecipazione ai corsi di formazione (Versione V03) Premessa... 2 Configurazione del sistema... 3 Estrattore dati...
Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise
Manuale Amministratore Legalmail Enterprise Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise Pagina 2 di 16 Manuale Amministratore Legalmail Enterprise Introduzione a Legalmail Enterprise...3
FPf per Windows 3.1. Guida all uso
FPf per Windows 3.1 Guida all uso 3 Configurazione di una rete locale Versione 1.0 del 18/05/2004 Guida 03 ver 02.doc Pagina 1 Scenario di riferimento In figura è mostrata una possibile soluzione di rete
Introduzione alla programmazione in C
Introduzione alla programmazione in C Testi Consigliati: A. Kelley & I. Pohl C didattica e programmazione B.W. Kernighan & D. M. Ritchie Linguaggio C P. Tosoratti Introduzione all informatica Materiale
Airone Gestione Rifiuti Funzioni di Esportazione e Importazione
Airone Gestione Rifiuti Funzioni di Esportazione e Importazione Airone Funzioni di Esportazione Importazione 1 Indice AIRONE GESTIONE RIFIUTI... 1 FUNZIONI DI ESPORTAZIONE E IMPORTAZIONE... 1 INDICE...
Approccio stratificato
Approccio stratificato Il sistema operativo è suddiviso in strati (livelli), ciascuno costruito sopra quelli inferiori. Il livello più basso (strato 0) è l hardware, il più alto (strato N) è l interfaccia
Modulo 4: Ereditarietà, interfacce e clonazione
Modulo 4: Ereditarietà, interfacce e clonazione Argomenti Trattati: Classi, Superclassi e Sottoclassi Ereditarietà Ereditarietà ed Attributi Privati Override super Ereditarietà e Costruttori Polimorfismo
Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento
I protocolli del livello di applicazione Porte Nelle reti di calcolatori, le porte (traduzione impropria del termine port inglese, che in realtà significa porto) sono lo strumento utilizzato per permettere
Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:
Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante
Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193
Servers Activatable Nelle lezioni precedenti abbiamo detto che una referenza remota ad un server di tipo UnicastRemoteObject rimane valida finchè il server è in esecuzione. Quando il server termina, o
Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati
Activation In generale i Sistemi ad oggetti distribuiti sono progettati per lavorare con oggetti persistenti. Dato che questi sistemi saranno composti da migliaia (forse milioni) di tali oggetti, sarebbe
Creare una Rete Locale Lezione n. 1
Le Reti Locali Introduzione Le Reti Locali indicate anche come LAN (Local Area Network), sono il punto d appoggio su cui si fonda la collaborazione nel lavoro in qualunque realtà, sia essa un azienda,
Programmazione distribuita
Programmazione distribuita 1 Architettura client-server È il modo classico di progettare applicazioni distribuite su rete Server offre un servizio "centralizzato" attende che altri (client) lo contattino
Il web server Apache Lezione n. 3. Introduzione
Procurarsi ed installare il web server Apache Introduzione In questa lezione cominciamo a fare un po di pratica facendo una serie di operazioni preliminari, necessarie per iniziare a lavorare. In particolar
MANUALE UTENTE Fiscali Free
MANUALE UTENTE Fiscali Free Le informazioni contenute in questa pubblicazione sono soggette a modifiche da parte della ComputerNetRimini. Il software descritto in questa pubblicazione viene rilasciato
SOMMARIO... 3 INTRODUZIONE...
Sommario SOMMARIO... 3 INTRODUZIONE... 4 INTRODUZIONE ALLE FUNZIONALITÀ DEL PROGRAMMA INTRAWEB... 4 STRUTTURA DEL MANUALE... 4 INSTALLAZIONE INRAWEB VER. 11.0.0.0... 5 1 GESTIONE INTRAWEB VER 11.0.0.0...
Manuale Utente Albo Pretorio GA
Manuale Utente Albo Pretorio GA IDENTIFICATIVO DOCUMENTO MU_ALBOPRETORIO-GA_1.4 Versione 1.4 Data edizione 04.04.2013 1 TABELLA DELLE VERSIONI Versione Data Paragrafo Descrizione delle modifiche apportate
FOXWave 1.0.0 Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA
FOXWave 1.0.0 Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA Redatto da IZ1FAL Secco Marco Pagina 1 di 15 INDICE 1 1- INSTALLAZIONE... 3 1-1 Scaricare i pacchetti aggiornati... 3 1-2 Startup
2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso
2.0 Gli archivi All interno della sezione archivi sono inserite le anagrafiche. In pratica si stratta di tutti quei dati che ricorreranno costantemente all interno dei documenti. 2.1 Inserire gli archivi
Introduzione alla teoria dei database relazionali. Come progettare un database
Introduzione alla teoria dei database relazionali Come progettare un database La struttura delle relazioni Dopo la prima fase di individuazione concettuale delle entità e degli attributi è necessario passare
JNDI. Massimo Merro Programmazione di Rete 214 / 229
JNDI Abbiamo già visto come i registri RMI espletino un servizio di Naming attraverso cui vengono associati nomi simbolici a referenze a server remoti. Esistono comunque altri servizi di naming: COS (Common
Database. Si ringrazia Marco Bertini per le slides
Database Si ringrazia Marco Bertini per le slides Obiettivo Concetti base dati e informazioni cos è un database terminologia Modelli organizzativi flat file database relazionali Principi e linee guida
RMI: metodi equals e hashcode
RMI: metodi equals e hashcode Per verificare se due oggetti remoti contengono gli stessi dati, la chiamata indirizzata al metodo equals() avrebbe bisogno di contattare i server dove si trovano gli oggetti
Mac Application Manager 1.3 (SOLO PER TIGER)
Mac Application Manager 1.3 (SOLO PER TIGER) MacApplicationManager ha lo scopo di raccogliere in maniera centralizzata le informazioni piu salienti dei nostri Mac in rete e di associare a ciascun Mac i
RICEZIONE AUTOMATICA DEI CERTIFICATI DI MALATTIA 1.1. MALATTIE GESTIONE IMPORT AUTOMATICO 1.2. ATTIVAZIONE DELLA RICEZIONE DEL FILE CON L INPS
RICEZIONE AUTOMATICA DEI CERTIFICATI DI MALATTIA 1.1. MALATTIE GESTIONE IMPORT AUTOMATICO Abbiamo predisposto il programma di studio Web per la ricezione automatica dei certificati di malattia direttamente
Programmazione a Oggetti Lezione 10. Ereditarieta
Programmazione a Oggetti Lezione 10 Ereditarieta Sommario Come definire sottoclassi Costruttori Abstract Classes Final Ereditarietà: promemoria Strumento tipico dell OOP per riusare il codice e creare
Reti di Telecomunicazione Lezione 8
Reti di Telecomunicazione Lezione 8 Marco Benini Corso di Laurea in Informatica [email protected] Livello di trasporto Programma della lezione relazione tra lo strato di trasporto e lo strato
Dispensa di Informatica I.1
IL COMPUTER: CONCETTI GENERALI Il Computer (o elaboratore) è un insieme di dispositivi di diversa natura in grado di acquisire dall'esterno dati e algoritmi e produrre in uscita i risultati dell'elaborazione.
Volume GESTFLORA. Gestione aziende agricole e floricole. Guidaall uso del software
Volume GESTFLORA Gestione aziende agricole e floricole Guidaall uso del software GESTIONE AZIENDE AGRICOLE E FLORICOLE Guida all uso del software GestFlora Ver. 2.00 Inter-Ware Srl Viadegli Innocenti,
10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.
ESERCIZIARIO Risposte ai quesiti: 10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress. 10.2. Un numero intero in Java è compreso nell'intervallo ( 2 31 ) e (2 31
19. LA PROGRAMMAZIONE LATO SERVER
19. LA PROGRAMMAZIONE LATO SERVER Introduciamo uno pseudocodice lato server che chiameremo Pserv che utilizzeremo come al solito per introdurre le problematiche da affrontare, indipendentemente dagli specifici
Soluzione dell esercizio del 2 Febbraio 2004
Soluzione dell esercizio del 2 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. E evidenziato un sotto caso di uso. 2. Modello concettuale Osserviamo
Replica con TeraStation 3000/4000/5000/7000. Buffalo Technology
Replica con TeraStation 3000/4000/5000/7000 Buffalo Technology Introduzione La funzione di replica consente di sincronizzare una cartella in due diversi dispositivi TeraStation quasi in tempo reale. Il
Gestione della memoria centrale
Gestione della memoria centrale Un programma per essere eseguito deve risiedere in memoria principale e lo stesso vale per i dati su cui esso opera In un sistema multitasking molti processi vengono eseguiti
Panoramica: che cosa è necessario
Scheda 02 L installazione dell SDK G IOVANNI PULITI Panoramica: che cosa è necessario Per poter lavorare con applicazioni Java o crearne di nuove, il programmatore deve disporre di un ambiente di sviluppo
Consiglio regionale della Toscana. Regole per il corretto funzionamento della posta elettronica
Consiglio regionale della Toscana Regole per il corretto funzionamento della posta elettronica A cura dell Ufficio Informatica Maggio 2006 Indice 1. Regole di utilizzo della posta elettronica... 3 2. Controllo
Reti di Telecomunicazione Lezione 6
Reti di Telecomunicazione Lezione 6 Marco Benini Corso di Laurea in Informatica [email protected] Lo strato di applicazione protocolli Programma della lezione Applicazioni di rete client - server
Sviluppata da: Lo Russo - Porcelli Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL.
Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL. 2ELHWWLYL GD UDJJLXQJHUH SHU JOL VWXGHQWL alla fine dell esercitazione gli studenti dovranno essere in grado di: 1. utilizzare
Corso di Informatica
Corso di Informatica Modulo T3 1-Sottoprogrammi 1 Prerequisiti Tecnica top-down Programmazione elementare 2 1 Introduzione Lo scopo di questa Unità è utilizzare la metodologia di progettazione top-down
MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE
1/6 MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE Per prima cosa si ringrazia per aver scelto ImmobiPhone e per aver dato fiducia al suo autore. Il presente documento istruisce l'utilizzatore sull'uso del programma
LA GESTIONE DELLE VISITE CLIENTI VIA WEB
LA GESTIONE DELLE VISITE CLIENTI VIA WEB L applicazione realizzata ha lo scopo di consentire agli agenti l inserimento via web dei dati relativi alle visite effettuate alla clientela. I requisiti informatici
Remote Method Invocation (RMI)
(RMI) Remote Method Invocation (RMI) in Java. Walter Cazzola Dipartimento di Informatica e Comunicazione Università à degli Studi di Milano. e-mail: cazzola@disi disi.unige.it Walter Cazzola Java: Remote
DINAMIC: gestione assistenza tecnica
DINAMIC: gestione assistenza tecnica INSTALLAZIONE SU SINGOLA POSTAZIONE DI LAVORO PER SISTEMI WINDOWS 1. Installazione del software Il file per l installazione del programma è: WEBDIN32.EXE e può essere
Istruzioni di installazione di IBM SPSS Modeler Text Analytics (licenza per sito)
Istruzioni di installazione di IBM SPSS Modeler Text Analytics (licenza per sito) Le seguenti istruzioni sono relative all installazione di IBM SPSS Modeler Text Analytics versione 15 mediante un licenza
1) GESTIONE DELLE POSTAZIONI REMOTE
IMPORTAZIONE ESPORTAZIONE DATI VIA FTP Per FTP ( FILE TRANSFER PROTOCOL) si intende il protocollo di internet che permette di trasferire documenti di qualsiasi tipo tra siti differenti. Per l utilizzo
Servizi Remoti. Servizi Remoti. TeamPortal Servizi Remoti
20120300 INDICE 1. Introduzione... 3 2. Consultazione... 4 2.1 Consultazione Server Fidati... 4 2.2 Consultazione Servizi Client... 5 2.3 Consultazione Stato richieste... 5 3. Amministrazione... 6 3.1
Brochure Internet. Versione 2010.1 The Keyrules Company s.r.l. Pagina 2 di 8
Ogni organizzazione possiede un sistema di regole che la caratterizzano e che ne assicurano il funzionamento. Le regole sono l insieme coordinato delle norme che stabiliscono come deve o dovrebbe funzionare
Progettaz. e sviluppo Data Base
Progettaz. e sviluppo Data Base! Introduzione ai Database! Tipologie di DB (gerarchici, reticolari, relazionali, oodb) Introduzione ai database Cos è un Database Cos e un Data Base Management System (DBMS)
EXPLOit Content Management Data Base per documenti SGML/XML
EXPLOit Content Management Data Base per documenti SGML/XML Introduzione L applicazione EXPLOit gestisce i contenuti dei documenti strutturati in SGML o XML, utilizzando il prodotto Adobe FrameMaker per
Manuale Utente Amministrazione Trasparente GA
Manuale Utente GA IDENTIFICATIVO DOCUMENTO MU_AMMINISTRAZIONETRASPARENTE-GA_1.0 Versione 1.0 Data edizione 03.05.2013 1 Albo Pretorio On Line TABELLA DELLE VERSIONI Versione Data Paragrafo Descrizione
Database e reti. Piero Gallo Pasquale Sirsi
Database e reti Piero Gallo Pasquale Sirsi Approcci per l interfacciamento Il nostro obiettivo è, ora, quello di individuare i possibili approcci per integrare una base di dati gestita da un in un ambiente
MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena [email protected]
MODELLO CLIENT/SERVER Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena [email protected] POSSIBILI STRUTTURE DEL SISTEMA INFORMATIVO La struttura di un sistema informativo
Progettazione : Design Pattern Creazionali
Progettazione : Design Pattern Creazionali Alessandro Martinelli [email protected] 30 Novembre 2010 Progettazione : Design Pattern Creazionali Aspetti generali dei Design Pattern Creazionali
FIRESHOP.NET. Gestione Lotti & Matricole. www.firesoft.it
FIRESHOP.NET Gestione Lotti & Matricole www.firesoft.it Sommario SOMMARIO Introduzione... 3 Configurazione... 6 Personalizzare le etichette del modulo lotti... 6 Personalizzare i campi che identificano
Soluzioni integrate per la gestione del magazzino
Soluzioni integrate per la gestione del magazzino whsystem Light è la versione di whsystem dedicata alla gestione di magazzini convenzionali. Questa variante prevede un modulo aggiuntivo progettato per
Ti consente di ricevere velocemente tutte le informazioni inviate dal personale, in maniera assolutamente puntuale, controllata ed organizzata.
Sommario A cosa serve InfoWEB?... 3 Quali informazioni posso comunicare o ricevere?... 3 Cosa significa visualizzare le informazioni in maniera differenziata in base al livello dell utente?... 4 Cosa significa
SUAP. Per gli operatori SUAP/amministratori. Per il richiedente
Procedura guidata per l inserimento della domanda Consultazione diretta, da parte dell utente, dello stato delle sue richieste Ricezione PEC, protocollazione automatica in entrata e avviamento del procedimento
Object Oriented Programming
OOP Object Oriented Programming Programmazione orientata agli oggetti La programmazione orientata agli oggetti (Object Oriented Programming) è un paradigma di programmazione Permette di raggruppare in
Protezione. Protezione. Protezione. Obiettivi della protezione
Protezione Protezione La protezione riguarda i meccanismi per il controllo dell accesso alle risorse in un sistema di calcolo da parte degli utenti e dei processi. Meccanismi di imposizione fissati in
I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte.
I TUTORI Indice Del Manuale 1 - Introduzione al Manuale Operativo 2 - Area Tutore o Area Studente? 3 - Come creare tutti insieme i Tutori per ogni alunno? 3.1 - Come creare il secondo tutore per ogni alunno?
Base di dati e sistemi informativi
Base di dati e sistemi informativi Una base di dati è un insieme organizzato di dati opportunamente strutturato per lo svolgimento di determinate attività La base di dati è un elemento fondamentale per
Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.
DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti
Una minaccia dovuta all uso dell SNMP su WLAN
Una minaccia dovuta all uso dell SNMP su WLAN Gianluigi Me, [email protected] Traduzione a cura di Paolo Spagnoletti Introduzione Gli attacchi al protocollo WEP compromettono la confidenzialità
Introduzione alle basi di dati. Gestione delle informazioni. Gestione delle informazioni. Sistema informatico
Introduzione alle basi di dati Introduzione alle basi di dati Gestione delle informazioni Base di dati Modello dei dati Indipendenza dei dati Accesso ai dati Vantaggi e svantaggi dei DBMS Gestione delle
Sistema Informativo Gestione Fidelizzazione Clienti MANUALE D USO
Sistema Informativo Gestione Fidelizzazione Clienti MANUALE D USO Login All apertura il programma controlla che sia stata effettuata la registrazione e in caso negativo viene visualizzato un messaggio.
MODULO 5 Appunti ACCESS - Basi di dati
MODULO 5 Appunti ACCESS - Basi di dati Lezione 1 www.mondopcnet.com Modulo 5 basi di dati Richiede che il candidato dimostri di possedere la conoscenza relativa ad alcuni concetti fondamentali sui database.
Introduzione alla consultazione dei log tramite IceWarp Log Analyzer
Introduzione alla consultazione dei log tramite IceWarp Log Analyzer L Analizzatore di Log è uno strumento che consente un'analisi statistica e logica dei file di log generati dal server. Lo strumento
COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO. 2015 e PARAMETRI2015
COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO. 2015 e PARAMETRI2015 Vicenza, 3 giugno 2015 Gentile cliente, si ricorda che a partire dall aggiornamento PROFIS 2011.1 è stato automatizzato
Appunti sulla Macchina di Turing. Macchina di Turing
Macchina di Turing Una macchina di Turing è costituita dai seguenti elementi (vedi fig. 1): a) una unità di memoria, detta memoria esterna, consistente in un nastro illimitato in entrambi i sensi e suddiviso
Oggetti Lezione 3. aspetti generali e definizione di classi I
Programmazione a Oggetti Lezione 3 Il linguaggio Java: aspetti generali e definizione di classi I Sommario Storia e Motivazioni Definizione di Classi Campi e Metodi Istanziazione di oggetti Introduzione
1.0 GUIDA PER L UTENTE
1.0 GUIDA PER L UTENTE COMINCIA FACILE Una volta effettuato il login vi troverete nella pagina Amministrazione in cui potrete creare e modificare le vostre liste. Una lista è semplicemnte un contenitore
MOCA. Modulo Candidatura. http://www.federscacchi.it/moca. [email protected]. [Manuale versione 1.0 marzo 2013]
MOCA Modulo Candidatura http://www.federscacchi.it/moca [email protected] [Manuale versione 1.0 marzo 2013] 1/12 MOCA in breve MOCA è una funzionalità del sito web della FSI che permette di inserire
Funzioni in C. Violetta Lonati
Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni
Indice generale. OOA Analisi Orientata agli Oggetti. Introduzione. Analisi
Indice generale OOA Analisi Orientata agli Oggetti Introduzione Analisi Metodi d' analisi Analisi funzionale Analisi del flusso dei dati Analisi delle informazioni Analisi Orientata agli Oggetti (OOA)
La VPN con il FRITZ!Box Parte II. La VPN con il FRITZ!Box Parte II
La VPN con il FRITZ!Box Parte II 1 Introduzione In questa mini-guida mostreremo com è possibile creare un collegamento su Internet tramite VPN(Virtual Private Network) tra il FRITZ!Box di casa o dell ufficio
Installazione e caratteristiche generali 1
Installazione e caratteristiche generali 1 Introduzione SIGLA Ultimate e SIGLA Start Edition possono essere utilizzati solo se sono soddisfatti i seguenti prerequisiti: Microsoft.Net Framework 3.5 (consigliato
TERM TALK. software per la raccolta dati
software per la raccolta dati DESCRIZIONE Nell ambiente Start, Term Talk si caratterizza come strumento per la configurazione e la gestione di una rete di terminali per la raccolta dati. È inoltre di supporto
Progettazione della componente applicativa
7 Progettazione della componente applicativa In questo capitolo illustreremo la progettazione della componente applicativa di un sistema informativo. La metodologia da noi utilizzata sarà basata sull utilizzo
Che differenza c è tra una richiesta XML ed una domanda XML? (pag. 4)
FAQ INVIO DOMANDE CIGO CON FLUSSO XML Cosa serve per inviare una domanda CIGO con il flusso XML? (pag. 2) Come si prepara una domanda in formato XML? (pag. 3) Che differenza c è tra una richiesta XML ed
Introduzione Ai Data Bases. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San giovanni
Introduzione Ai Data Bases Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San giovanni I Limiti Degli Archivi E Il Loro Superamento Le tecniche di gestione delle basi di dati nascono
La VPN con il FRITZ!Box Parte I. La VPN con il FRITZ!Box Parte I
La VPN con il FRITZ!Box Parte I 1 Introduzione In questa mini-guida illustreremo come realizzare un collegamento tramite VPN(Virtual Private Network) tra due FRITZ!Box, in modo da mettere in comunicazioni
12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)
12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,
Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione
Automatizzare i compiti ripetitivi I file batch Anno accademico 2000-01 1 Spesso capita di dover eseguire ripetutatmente una data sequenza di comandi Introdurli uno a uno da tastiera è un processo lento
Light CRM. Documento Tecnico. Descrizione delle funzionalità del servizio
Documento Tecnico Light CRM Descrizione delle funzionalità del servizio Prosa S.r.l. - www.prosa.com Versione documento: 1, del 11 Luglio 2006. Redatto da: Michela Michielan, [email protected] Revisionato
Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci
Corso di Laurea Magistrale in Ingegneria per l Ambiente e il Territorio A.A. 2014-2015 Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci Strutture di dati: DB e DBMS DATO E INFORMAZIONE Dato: insieme
Mon Ami 3000 Produzione base Produzione articoli con distinta base e calcolo dei fabbisogni
Prerequisiti Mon Ami 3000 Produzione base Produzione articoli con distinta base e calcolo dei fabbisogni L opzione Produzione base è disponibile per le versioni Azienda Light e Azienda Pro. Introduzione
Guida alla registrazione on-line di un DataLogger
NovaProject s.r.l. Guida alla registrazione on-line di un DataLogger Revisione 3.0 3/08/2010 Partita IVA / Codice Fiscale: 03034090542 pag. 1 di 17 Contenuti Il presente documento è una guida all accesso
3. Introduzione all'internetworking
3. Introduzione all'internetworking Abbiamo visto i dettagli di due reti di comunicazione: ma ce ne sono decine di tipo diverso! Occorre poter far comunicare calcolatori che si trovano su reti di tecnologia
