|
per sviluppare il codice faro' fede e riferimento a queste righe che "per quanto incomplete e scritte in una ventina di minuti" aspirerebbero ad essere una specifica per la realizzazione del programma questa e' la bozza di partenza
Le seguenti non sono le specifiche iniziali, ma quelle "riviste", dopo il diario di sviluppo1:
LATO UTENTE: Il Programa di Test e' composto da 1 programma di controllo chiamato CtrlP che gira su un unico computer, e da svariati programmi di test TestP, che sono connessi alla rete da testare (che potrebbe essere lo stesso computer dove gira pure CtrlP). [Vi forniro anche una guida su come usare il programma, ora non mi dilungo]
COSA FA IL PROGRAMMA: Dopo che tutti i TestP sono stati lanciati, CtrlP decide (o meglio attraverso CtrlP l'utente decide) chi invia i dati di test (pacchetti UDP ) e chi li riceve, i vari TestP che ricevono i pacchetti registrano i pacchetti arrivati, la data di arrivo, e calcolano alcune statistiche (per ora solo la velocita'). Quando tutti i pacchetti (che sono in un numero predeterminato) sono arrivati a destinazione e il test e' concluso, i vari TestP di ricezione, inviano a CtrlP le varie statistiche registrate, che le mostrera a schermo (e forse in futuro potra salvare su file in un forato facilmente leggibile [html, xml]).
COME LO FA IL PROGRAMMA: [EDIT] Ho cambiato alcune scelte implementative in corso d'opera, questo e' al momento in cui scrivo il modo attuale di agire del programma. CtrlP appena lanciato avvia un annunciatore che a intervalli regolari invia ad un determinato indirizzo IP (multicast) e ad una determinata porta, il proprio indirizzo IP e la Porta, a cui i vari TestP dovranno collegarsi se vogliono partecipare al test. Quando il servizio e' attivo, e' possibile lanciare i vari testp sui computer da testare. Automaticamente CtrlP rileva la conessione e iscrive il computer al test, chiedendo all'utente se il computer collegato sara' un computer che invia i dati oppure uno che li riceve(tipologia di tester), al momento ancora(l'ho fatto per una questione di pigrizia mia, se ho tempo rimedio) non e' possibile cambiare in modo dinamico lo stato di un TestP, una volta assegnata la tipologia. Finita la fase di iscrizione, il programma chiede di configurare le coppie invio/ricezione. Una volta assegnate le coppie, vengono eliminati dal sistema i computer spaiati(che termineranno tranquillamente da soli), poi il sistema avverte i computer che invia a chi inviare i dati, e infine chiede all'utente quando e' pronto di premere invio per avviare il test. Premuto invio, crtlP manda a tutti gli inviatori (sempre in multicast) contemporaneamente un messaggio di start. E i ricevitori incominceranno a ricevere dati calcolando la differenza tra il tempo un momento prima di ricevere il pacchetto e il momento successivo la ricezione. Conoscendo la dimensione dei pacchetti inviati e dividendo per il tempo medio di invio, viene ricavata
la velocita' di download(ricezione) dei pacchetti ricevuti, e il numero di pacchetti persi(l'invio di dati avviene tramite UDP, che non garantisce la consegna- magari espando il test con il test del TCP) per ogni coppia precedentemente creata. Il test sollecita abbastanza la rete, sicche "credo" sia naturale avere un alto numero di pacchetti persi specialmente se inviati tramite wireless.[eventuali modifiche al comportamento del programma le riportero' qui]
NOTA un interfaccia grafica sarebbe l'ideale, ma perderei tempo su dove/come posizionare bottoni e scritte pero' cerchero' di implementare il tutto in modo che possa essere facilmente estensibile
AVVERTENZE PER L'USO: Dato che credo nei programmi Open e nello scambio di idee , se avete osservazioni, migliorie, domande (postate pure.. e' un progetto di tutti per tutti e per qualche giorno sono libero da impegni)So anche che il programma fa una cosa abbastanza comune e che sotto linux sarebbe implementabile con uno script bash in 10 righe.Pero' volevo innanzitutto fare un programmino portabile su tutti i sistemi operativi.. in modo da poter eseguire il test tra un computer che magari fa girare windows e un macbook(e non solo da quelle 2-3 persone -me compreso- che utilizzano linux)E poi, mi piaceva riprendere un po' in mano java che e' da qualche mese che non lo tocco piu'..
LINK AL PROGRAMMA
http://dl.dropbox.co... case/ctrlp.jar <-- ctrlp
http://dl.dropbox.co...se/testp.jar<-- testp
DIARIO DI SVILUPPO
parte 1
parte 3
CALCOLA TEMPO CORRENTE1 RICEVI IL PACCHETTO CALCOLA TEMPO CORRENTE2 SALVA TEMPOCORRENTE2-TEMPOCORRENTE1 FINITO IL LOOP CALCOLA DIMENSIONE PACCHETTO X NUMERO PACCHETTI/TEMPO MEDIO RICEZIONE PACCHETTIHo risolto cosi il dubbio:Il programma testa in quanto tempo un computer mediamente puo' ricevere un certo numero di byte inviati attraverso una rete.
Ogni osservazione e commento su questo (e su altro) e' ben accetto
parte 4
parte 5
MINIGUIDA JAVA
Come Installare java(OpenJdk-7) da console su ubuntu
a ogni tag [ code ] corrisponde un comando seguito da invio
sudo apt-get install openjdk-7-jrelibrerie e programmi per creare i programmi in java
sudo apt-get install openjdk-7-jdkverifica:
java -version
javac -versionproblemi noti:
versione di java diversa da quella scaricata
sudo update-alternativies --config javae selezionare il numero che corrisponde alla versione desiderata
versione di javac diversa da quella scaricata
sudo update-alternativies --config javac
la verifica fallisce, chiedendo di installare pacchetti gia' installati:
occorre linkare il programma dalla directory di installazione all'interno della cartella /usr/bin, prima si cerca dove il programma e' stato installato(nome programma e' puo' essere java o javac ):
sudo find / -name nome_programma 2>/dev/nullsi annota il percorso_completo (se e' presente piu' di un percorso chiedete qui quale usare ), e infine si scrive
ln -s percorso_completo /usr/bin/nome_programmae alla fine si effettua di nuovo la verifica per vedere se tutto funziona
Breve (e traumatica ) INTRO - tutto(ma proprio tutto) quello che serve per scrivere 3 righe di codice
/* To change this template, choose Tools | Templates and open the template in the editor.*/ package pacchetto; /** @author Ciccio Pasticcio*/ public class Test { /** @param args the command line arguments*/ public static void main(String[] args) { // TODO code application logic here } }Le parti che iniziano con /* e finiscono con */ sono commenti su piu' linee. Le parti che iniziano con // sono commenti su un unica linea.Le parti che iniziano con /** e finiscono con */ sono commenti per la documentazione JAVA e che verranno utilizzate (in modo automatico) per generare dei documenti carini tipo questi:http://docs.oracle.c...ractAction.htmle che sono istruzioni per chi migliorera' o ri-utilizzera' il nostro codice per fare altri programmiI commenti sono un aiuto alla comprensione per chi legge il programma(e sono particolarmente utili a chi tende a dimentcarsi le cose )dopo i commenti si nota: un' intestazione
package pacchetto;il package e' una struttura che raccoglie funzionalita' simili del programma, e serve per realizzare grandi progetti in modo modulare, semplificando la vita ai poveri programmatoriche altrimenti dopo 4000-5000 di codice fitto fitto letteralmente impazzirebbero e non riuscirebbero a fare i programmi. ( di fatto e' una cosa che non ci serve direttamente a noi perche' il nostro programma di prova e' piccolo piccolo , pero' serve' ad un meccanismo di NetBeans che permette di poter realizzare(compilare) il programma per poter essere correttamente eseguito su qualunque macchina java )il nome dell'autore che ha scritto il programma.. u_ue poi inizia il codice vero e proprio con una scritta oscura:
public class Test {}iniziamo dalla fine: le parentesi graffe
{ }denotano un blocco di codice JAVA, tutte i nomi delle variabili che usiamo all'interno del blocco sono invisibili all'esterno del blocco anche se sono scritte nello stesso file. Inoltre le variabili all'esterno del blocco definite nello stesso file SONO visibili all'interno del blocco.
class Testinvece indica che stiamo realizzando una classe: siamo in un linguaggio ad oggetti: i file che scriviamo possono essere classi o interfacce, le classi sono dei modelli che vengono utilizzati per creare gli oggetti (delle interfacce non parlo ora, che non ci servono)esempio scemo: Nella realta' esiste il concetto di Bottiglia, tutte le bottiglie si ispirano a questo concetto: hanno una data capacita' (quanto liquido contengono) e hanno la possibilita' di essere riempite, oppure di poter essere svuotate di una parte del contenuto. Una classe in pratica e' il modello ideale.Quando nel programma mi servera' una bottiglia, creero' quell'oggetto(in un particolare modo che spieghero' piu' avanti) partendo dal modello che sto definendo
publicindica chi puo' accedere a questa "struttura" cioe' tutti in questo caso.la classe che stiamo scrivendo ora pero', non da la possibilita' di creare oggetti, ma e' solo un involucro per una serie di azioni che il nostro programma dovra' eseguire una volta lanciato:in particolare l'unica azione da eseguire sara' questa
public static void main(String[] args) { /* TODO code application logic here*/ }cioe' tutto quello che scriveremo qui dentro verra' eseguito dal nostro programmaQuesto aggeggio che si trova dentro al blocco classe e' un METODO,ovvero un azione che un oggetto o una classe puo' compiere(ritornando all'esempio di prima della bottiglia, versare e/o riempire)la parola
staticdenota che il metodo e' legato non all'oggetto ma alla classe(ritornero' in futuro sul significato di queste parole e sulle conseguenze che ha mettere o non mettere la parola static).la parola
voidinvece indica cosa restituisce l'azione(il metodo) che andiamo a fare.in questo caso "void" sta a indicare che l'azione non restituisce niente
maine' il nome del metodo: main e' come detto prima il punto di inizio del nostro programma, e' un metodo predefinito e per forza non deve restituire nullae per forza deve essere static e public.la parte tra parentesi tonde invece
(String[] args)sono i dati che il nostro metodo riceve interpreta e trasforma,dato che il metodo main e' un metodo speciale,sono tutte le informazioni che vogliamo che il nostro programma usi per poter svolgere il suo lavoro: in questo caso e' una serie(indicata dalle parentesi quadre) di stringhe (parole) di testo.Ora abbiamo un nucle minimo di informazioni con il quale poter iniziare a programmare
JAVA non OO -
riassumendo se volete scrivere un programma che non fa niente, ma che comunque possa venire tradotto nel linguaggio dei computer (compilato) correttamente dovete scrivere come minimo
public class PrimoProgramma{ public static void main(String[] args){} }in un editor di testo qualsiasi. Se salvate questo file come PrimoProgramma.java (occhio alle estensioni)e poi digitate
javac PrimoProgramma.javaverificate che non vengano fuori errori: e' successo che il comando javac ha prodotto un file PrimoProgramma.class. Se scrivete
java PrimoProgramma, non succede niente cioe' abbiamo scritto il nostro primo programma che non fa assolutamente nulla( ). Per fargli fare qualcosa, e' necessario disporre di dati e di diversi comandiche un programma java puo' capire.
I dati base(tipi di variabile di base) che java riconosce sono:
boolean/*in cui si memorizzano il valore true(vero) o false(false)*/ byte/*in cui si memorizzano valori interi da -128 a 127*/ short/*in cui si memorizzano interi da -32.768 a 32.767*/ char/*in cui si memorizzano interi da 0 a 65535 utili per memorizzare caratteri*/ int /*in cui si memorizzano interi da -2miliardi fino a 2miliardi e qualcosa*/ long/*in cui si memorizzano in cui si memorizzano interi da -9,223,372,036di miliardi a 9,223,372,036 di miliardi*/ float /*in cui si memorizzano numeri a 32 bit con la virgola(mobile)*/ double/*in cui si memorizzano numeri a 64 bit con la virgola(mobile)*/i dati base possono essere organizzate in tabelle dette array, che sono indicati mediante le parentesi quadre [], i valori che gli array possono assumere vengono scritti in parentesi graffe e sono separate da una virgola. Questi dati base possono essere estesi con dati piu' complessi ma che rientrano nella parte Orientata agli Oggetti di cui non si parla per il momento.
I comandi sono separati da ; (a dire la verita' si dovrebbe scrivere tutto in BNF, ma me ne frego , rinunciando a un bel po di rigore matematico.. ) i piu' importanti sono
questi sono i comandi base, che possono essere mescolati a caso mantendo pero'(dato base) nome_variabile /*dichiarazione*/
nome_variabile=val /*assegnamento di una variabile*/
+ * / - /*sono operatori matematici che producono un valore partendo da due valori o dati di un determinato tipo, il risultato dipende dal tipo*
* coinvolto nell'operazione:ad esempio se sommo un double con un int *
*ottengo un double, se sommo un int con un int ottengo un int */
> < == <= >= /*test di condizione tra due valori(o variabili contenenti un valore): producono un valore boolean(e possono essere messi dove ci vuole un true o false) */
while(cond){/*codice che fa qualcosa*/}
/*ciclo che continua fintanto che cond (una valore boolean o una *
variabile con dentro un valore boolean)dentro le parentesi tonde e' true *
* esempio while(4==5){/*esegui qualcosa*/} non verra' mai eseguito */
for(variabile;cond;op){/*esegui qualcosa*/} /*loop che viene eseguito finche cond
e vera op e' un operazione che viene eseguita prima di iniziare un nuovo loop
(cioe' alla fine di ogni iterazione) */
do{/*qualche comando*/}while(cond)/*come while ma viene fatta almeno una iterazione*/
della regole:
1- alla fine di ogni comando deve esserci il punto e virgola.
2- una variabile non puo' essere definita due volte nello stesso blocco(parte con le parentesi graffe non si puo' scrivere {int i=5;int i =6} ):
...(ce ne sono altre ma non mi vengono in mente u__u queste sono le principali..)
Per poter rendere i programmi piu' interessanti occorre dire un ultima cosa, che non riguarda java ma il sistema operativo:
Per ogni programma che viene avviato il sistema operativo assegna tre "canali" di comunicazione verso l'esterno(altri programmi):
1. Standard Input (cioe' un canale in entrata) 2. Standard Output(un canale in uscita) 3. Standard Error(un canale per gli errori/i log)A questi canali possono essere collegati dei file dal quale ricevera' o al quale inviera' i dati. Normalmente il comportamento predefinito del sistema operativo e' quello di collegare la tastiera allo standard input(generalizzando un po' si puo' dire che ogni periferica viene visto come un file), mentre lo standard output e lo standard error per default vengono collegati alla riga di comando dove si e' lanciato il programma java(con il comando java nomeprogramma).
Questi file speciali predefiniti possono essere richiamati mediante una funzionalita speciale:
esiste un elemento chiamato System che contiene al suo interno questi tre file, per potervi accedere occorre scrivere
System.in che permette di connettersi allo standard input
System.out che permette di connettersi allo standard output
System.err che permette di connettersi allo standard error
Questi file dispongono di operazioni speciali, per leggere(standard input) e per scriverci su(gli altri due ).
detto questo dovremmo essere in grado di scrivere il nostro programma di test(mi raccomando sotto windows mettete le estensioni visibili dei file):
supponendo che nel nostro programma abbiamo una sequenza(array) di numeri prefissata di cui vogliamo fare la somma.
abbiamo scritto il nostro programma. Lo salviamo con lo stesso nome che compare dopo la scritta class, nel nostro caso dobbiamo salvare il file come Esempio.java se blocco note non ci permette di salvare con l'estensione java, occorre rinominare il file una volta creato.public class Esempio{
public static void main(String[] args){
/*supponiamo che la sequenza di numeri data sia di 4 numeri e sia 65.345 21.65 2.12 8.214 */
float[] var={65.345f,21.65f,2.12f,8.214f};
/*per prima cosa definiamo(definire=assegnamento +dichiarazione) una variabile di tipo sequenza di float*/
/*e assegnamo staticamente alla variabile la sequenza di numeri: (siamo costretti a fare assegnamento e dichiarazione in una volta
a causa del metodo che abbiamo scelto per creare la sequenza, non mi dilungo troppo, nella parte Java OO sara tutto piu' chiaro )
il bello della sequenza e' che possono essere accedeute per posizione: ad esempio in prima posizione (pos. numero 0)
e' presente il numero 65.345 e cosi via. Occorre aggiungere la f perche' abbiamo definito la variabile come sequenza di float
un numero scritto semplicemente con un punto nel mezzo, viene assunto che sia di tipo double e occorre dichiarare a java che invece noi
vogliamo considerare quel valore come float */
/*ora viene la parte "difficile": dobbiamo scorrere la sequenza dal primo all'ultimo elemento questa cosa si puo' fare in diversi modi:*/
int i;
float risultato;
risultato=0;/*dobbiamo inizializzare la variabile risultato ad un valore,perche' quando la dichiariamo, la variabile non ha nessun valore
sappiamo solo che c'e'*/
/*il metodo piu' immediato e' con un ciclo for, se avete voglia provate a scriverlo in un altro paio.. ma ce ne sono molti */
for(i=0;i<4;i=i+1){/*notare che ci sono solo due punto e virgola */
/*IMPORTANTE: la prima posizione di una sequenza di n posizioni e' la posizione 0, l'ultima la 3
(e' dal 1200 che conosciamo lo zero ma ancora potrebbe risultare strano utilizzarlo correttamente)*/
risultato=risultato+var;/*dato che ad ogni giro viene aggiornata la variabile i
la utilizzo per accedere alla posizione corrispondente nella sequenza*/
}
System.out.println(risultato);/*System.out ha un operazione speciale chiamata print che scrive sul file collegato
tutto quello che e' dentro le parentesi tonde(detto in informatichese: "System.out ha un metodo print")
la parola ln attaccata a print e' un abbreviazione per dire che dopo che ha scritto il testo deve andare a capo*/
}
}
(se il percorso a java fa parte delle variabili globali e' sufficiente digitare da linea di comando, una volta collocati nella cartella dove abbiamo salvao il file)
javac Esempio.java
verificare che non ci siano errori, e alla fine eseguire il comando con
java Esempio
e gustarci il risultato dei nostri sforzi
Modificata da pio ping 34, 05 October 2012 - 02:44 AM.