Una delle cose che non mi e' mai piaciuta di Nautilis e' l'interfaccia stile Explorer di Windows con la lista di una sola directory per ogni finestra...considero decisamente piu' funzionale l'interfaccia tipo Norton
In realta' con la 'sola pressione del tasto F3 si riesce ad avere una visione a due finestre affiancate
mentre con il tasto F9 si fa apparire e scomparire la colonna delle directory predefinite di destra (alla colonna delle directory predefinite si possono aggiungere elementi tramite il drag and drop)
Un altro metodo per creare grafici con Android e' quello di impiegare la libreria AChartEngine
Il problema con questa libreria e' che sostanzialmente priva di esempi e non e' cosi' immediato usarla
Si possono trovare dei video tipo questo
ma se si prova a seguire l'esempio il programma genera sempre un'eccezione
il trucco e' che in modo preliminare si devono modificare project.properties e Manifest.xml cosi' come evidenziato in giallo
project.properties
------------------------------------------------ # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
</manifest>
------------------------------------------------
Dopo di cio' si puo' iniziare a scrivere il codice
Di fatto il grafico vive in una sua finestra per cui va lanciato mediante Intent
public class MainActivity extends Activity { /** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void lineGraphHandler (View view) { LineGraph line = new LineGraph(); Intent lineIntent = line.getIntent(this); startActivity(lineIntent); } }
------------------------------------------------
Per il resto il codice per generazione del grafico e' piuttosto autoesplicativa
public class LineGraph { public Intent getIntent(Context context) {
// Our first data int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values! int[] y = { 30, 34, 45, 57, 77, 89, 100, 111 ,123 ,145 }; // y values! TimeSeries series = new TimeSeries("Line1"); for( int i = 0; i < x.length; i++) { series.add(x[i], y[i]); }
// Our second data int[] x2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values! int[] y2 = { 145, 123, 111, 100, 89, 77, 57, 45, 34, 30}; // y values! TimeSeries series2 = new TimeSeries("Line2"); for( int i = 0; i < x2.length; i++) { series2.add(x2[i], y2[i]); }
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); dataset.addSeries(series); dataset.addSeries(series2);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); // Holds a collection of XYSeriesRenderer and customizes the graph XYSeriesRenderer renderer = new XYSeriesRenderer(); // This will be used to customize line 1 XYSeriesRenderer renderer2 = new XYSeriesRenderer(); // This will be used to customize line 2 mRenderer.addSeriesRenderer(renderer); mRenderer.addSeriesRenderer(renderer2);
// Customization time for line 1! renderer.setColor(Color.WHITE); renderer.setPointStyle(PointStyle.SQUARE); renderer.setFillPoints(true); // Customization time for line 2! renderer2.setColor(Color.YELLOW); renderer2.setPointStyle(PointStyle.DIAMOND); renderer2.setFillPoints(true);
Al momento attuale esistono diversi plugin per Android o meglio diversi pacchetti
Scaricando il Google Plugin si ha oltre al necessario per sviluppare Android in Eclipse anche la possibilita' di scaricare l'SDK di Android e GWT ed AppEngine
Invece a questo link si trova il solo pacchetto ADT in cui e' presente il solo plugin Android per Eclipse. L'SDK dovra' essere scaricato a parte
Un'altra libreria (oltre alla gia' citata AndroidPlot) per disegnare grafici su Android e' GraphView
Rispetto alla precedente e' meno commentata ed di utilizzo un po' piu' difficile ma permette di mostrare dati in realtime ed ha lo zoom ed il pan dinamico mediante gesture
Un po' di indicazioni: il tutorial sul sito dello sviluppatore funziona solo con la versione 2.0 (al momento della scrittura di questo post la versione piu' recente e' la 3.0); per questo motivo anche io ho usato la versione 2
Inoltre di default i colori delle label sugli assi delle ascisse e delle ordinate ed il titolo sono bianchi per cui iniziando un progetto da zero con il nuovo SDK si deve cambiare il colore di background della activity (che gia' di suo e' bianco) altrimenti scompare tutto
</RelativeLayout>
-------------------------------------------
Usando il codice sotto riportato (un misto tra il codice di esempio ed alcune righe che ho inserito io) si ha come risultato questa immagine
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
int num = 150; GraphViewData[] data = new GraphViewData[num]; double v=0; for (int i=0; i<num; i++) { v += 0.2; data[i] = new GraphViewData(i, Math.sin(v)); } GraphViewSeries seriesSin = new GraphViewSeries("Seno", Color.rgb(200, 50, 00), data);
//attenzione l'array dei dati deve essere completo //se si omette per esempio di dichiarare dati[4] il programma genera una eccezione GraphViewData[] dati = new GraphViewData[5]; dati[0] = new GraphViewData(0,0); dati[1] = new GraphViewData(10,0.5); dati[2] = new GraphViewData(15,1.5); dati[3] = new GraphViewData(17,0.7); dati[4] = new GraphViewData(22,0.7);
GraphViewSeries seriedati = new GraphViewSeries("Misure", Color.rgb(0, 250, 00), dati);
LineGraphView graphView = new LineGraphView( this , "Titolo Grafico" );
// aggiungi la serie dati graphView.addSeries(seriesSin); graphView.addSeries(seriedati);
// finestra di visualizzazione del grafico graphView.setViewPort(0, 20); graphView.setScrollable(true); graphView.setScalable(true);
// Legenda graphView.setShowLegend(true); graphView.setLegendAlign(LegendAlign.BOTTOM); graphView.setLegendWidth(70);
Un esempio di come puo' avere dei trabocchetti la programmazione su Android anche su cose semplici come la creazione di un widget Toast
Nel referenziare il context del comando Toast.maketext e' necessario riportare il nome della activity in cui si sviluppa il comando (in questo caso MainActivity) altrimenti si genera un errore ------------------------------------------------------ btngraph.setOnClickListener(new View.OnClickListener() { private Toast toast; public void onClick(View v) { // Questo genera un errore toast = Toast.makeText(this, R.string.errore, Toast.LENGTH_LONG); // Questo NON genera un errore toast = Toast.makeText(MainActivity.this, R.string.errore, Toast.LENGTH_LONG);
Puo' accadere, specialmente adesso che Apple la sta facendo da padrona, di dover spacchettare un file .dmg ....come fare senza un Mac a disposizione ??
per prima cosa si scarica dmg2iso
apt-get install dmg2iso
in seguito si converte in formato img dmg2iso pacchetto.dmg
quindi si monta il modulo per il file system hfsplus e si monta il file immagine
modprobe hfsplus mount -t hfsplus -o loop pacchetto.img /media/sdc
Per passare i dati tra due Acitivity, senza la necessita' di dichiarare variabili globali, si puo' usare un Bundle e inserirci i valori (specificando il formato di ogni variabile)
Di seguito un esempio Attivita' 1 : spedisce i dati ---------------------------------------------------------------------------------- Bundle dataBundle = new Bundle(); dataBundle.putInt("gradini", gradino);
Intent Intentdati = new Intent(); Intentdati.setClass(MainActivity.this,Grafico.class); Intentdati.putExtras(dataBundle); startActivity(Intentdati); ----------------------------------------------------------------------------------
Attivita' 2 : riceve i dati ---------------------------------------------------------------------------------- public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_grafico);
Nel caso in cui sia necessario libera spazio da una Debian si puo' rimuovere la cache dei pacchetti .deb che sono contenuti nelle seguenti directory /var/cache/apt/archives /var/cache/apt/archives/partial
la loro cancellazione non crea problemi al normale funzionamento
Stavo cercando di convertire i dati ripresi da una EditText in un numero a virgola mobile utilizzando il seguente comando
st = Double.parseDouble(txtportata.getText().toString());
Immancabilmente pero' il programma mi generava una eccezione del tipo
NumberFormatException
relativa al fatto che la stringa non poteva essere convertita in un numero (per esempio per la presenza di spazi o comunque di caratteri differenti da quelli numerici).
Per forzare l'utente ad introdurre solo valori numerici ho modificato la proprieta' InputType a NumberDecimale della EditText.
In questo modo pero' non sembrava possibile inserire il valore del punto decimale.
Impiegando l'emulatore si ha la tasteria numerica sotto riportata e cliccando sui caratteri speciali appare la barra in cui sono comprese il punto, la virgola ed altri
Purtroppo pero' questi caratteri non vengono accettati dalla EditText
Per far apparire il punto decimale si deve arrivare alla tastiera sotto riportata ed effettuare doppio clic sul pulsante che racchiude la virgola ed il punto
A questo punto non vengono piu' generate eccezioni ed la conversione funziona correttamente
La libreria Zlib permette la compressione con un metodo simile (ma non uguale all'algoritmo LZW) a quello dei file Zip
per la compilazione si deve utilizzare la stringa sottostante gcc -Wall -O3 -lz zlib_test.c -o zlib_test
per comprimere i file si utilizza il seguente codice
----------------------------------------------------- FILE *infile = fopen(infilename, "rb"); gzFile outfile = gzopen(outfilename, "wb");
mentre questo e' per decomprimere un file
----------------------------------------------------- gzFile infile = gzopen(infilename, "rb"); FILE *outfile = fopen(outfilename, "wb");
Di seguito viene mostrato un esempio (sostanzialmente autoesplicativo nel codice) su come realizzare grafici ScatterPlot mediante la libreria AndroidPlot
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_grafico); //inizializza il grafino Grafico = (XYPlot) findViewById(R.id.Grafico); //definisce le coppie di valori X (portata) ed Y (soggiacenza) Number[] portata = {0,1.0, 2, 3, 4, 5}; Number[] soggiacenza = {0, -2, -4, -6, -8, -12};
XYSeries dati = new SimpleXYSeries(Arrays.asList(portata), Arrays.asList(soggiacenza), "Dati");
// crea lo stile per i punti LineAndPointFormatter series1Format = new LineAndPointFormatter( Color.rgb(0, 200, 0), // line color Color.rgb(0, 100, 0), // point color null); // fill color (none)
// aggiunge i dati al grafico Grafico.addSeries(dati, series1Format);
// AndroidPlot chiama Range l'asse X e Domain l'asse Y // riduce il numero di ticks su entrambi gli assi Grafico.setTicksPerRangeLabel(3); Grafico.setTicksPerDomainLabel(3);
// mette il colore bianco in background Grafico.getGraphWidget().getGridBackgroundPaint().setColor(Color.WHITE); Grafico.getGraphWidget().setMarginTop(10);
// cancella la legenda dal grafico Grafico.getLegendWidget().setVisible(false);
//scrive le label sugli assi Grafico.setDomainLabel("Portata"); Grafico.getDomainLabelWidget().pack(); Grafico.setRangeLabel("Soggiacenza"); Grafico.getRangeLabelWidget().pack();
Ho scaricato da Internet un file con estensione DAA e francamente non sapevo come usarlo
Dopo aver scoperto che e' sostanzialmente un file immagine (come un .iso) ho scaricato
apt-get install daa2iso
a questo punto ho convertito il file in iso
daa2iso file.daa file.iso
ed ho potuto leggere il contenuto dato che il gestore di archivi di Debian decomprime il formato iso
Per prima cosa si deve creare una immagine disco (ho scelto 10 G dato che con l'installazione da 2G rimane decisamente poco spazio per qualunque operazione)
stranamente utilizzando il comando qemu-img.exe create deb.img 4G
viene generato un file da 0 Byte (con 3G o 5G tutto funziona correttamente)
per installare Debian partendo dal Cd di installazione con Xfce-Lxde si digita il seguente comando qemu -localtime -m 256 -cdrom "debian-testing-i386-xfce+lxde-CD-1.iso" -hda deb.img -boot d -L . -net user -net nic
in questo modo si indicano
256 Mb di memoria
deb.img e' l'immagine del disco fisso
boot d fa partire l'installazione da CdRom
-net user -net nic abilita l'interfaccia di rete virtuale (questo e' l'unico sistema di abilitare la scheda di rete virtuale in ambiente in cui si e' amministratori del calcolatore)
Dato che il programma Qemu non e' installato ma il binario e' stato scompattato in una directory da un file zip e' necessario aggiungere lo swtich -L . (attenzione al punto)
Non e' stato possibile utilizzare KQemu perche' richiede l'installazione mentre sulla macchina su cui devo lavorare non possiedo i permessi di amministrazione
per utilizzare quindi la macchina virtuale una volta terminata l'installazione si deve effettuare lo shutdown e ripartire con qemu -localtime -m 768 -cdrom "debian-testing-i386-xfce+lxde-CD-1.iso" -hda deb.img -boot c -L . -net user -net nic -redir tcp:2222::22
Per l'utilizzo normale la memoria e' stata impostata a 768 m ed e' stata aggiunta una direttiva per abilitare la connessione SSH tra Host e Guest sulla porta 2222
si puo' quindi usare sia SFTP che SSH chiamando la macchina virtuale a localhost:2222
Per finire la macchina virtuale assume un indirizzo derivante dal DHCP interno a QEMU per cui risulta completamente invisibile all'esterno della macchina su cui e' in esecuzione (di solito l'IP e' 10.0.2.15) Per terminare la finestra di visualizzazione massima e' 1024x768 e non puo' essere allargata a meno di modifiche piuttosto complicate al server X. Mettere QEmu in modalita' FullScreen e' stata una pessima esperienza sulla mia macchina dual-monitor e la sconsiglierei