venerdì 12 ottobre 2012

Creare grafico (scatterplot) con AndroidPlot

Di seguito viene mostrato un esempio (sostanzialmente autoesplicativo nel codice) su come realizzare grafici ScatterPlot mediante la libreria AndroidPlot




activity_grafico.xml
-------------------------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
   
    <com.androidplot.xy.XYPlot
        android:id="@+id/Grafico"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        title="Well Test" />

</RelativeLayout>

 -------------------------------------------------------------
Grafico.java
-------------------------------------------------------------
package com.luca.innocenti.well.test;

import java.util.Arrays;

import com.androidplot.series.XYSeries;
import com.androidplot.ui.AnchorPosition;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XLayoutStyle;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.YLayoutStyle;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;

public class Grafico extends Activity {

    private XYPlot Grafico;

    @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();

        Grafico.disableAllMarkup();
       
        Grafico.position(Grafico.getDomainLabelWidget(),0,XLayoutStyle.ABSOLUTE_FROM_CENTER,5, YLayoutStyle.ABSOLUTE_FROM_BOTTOM, AnchorPosition.CENTER);

       
        //Grafico.setGridPadding(15, 0, 15, 0);
    }
}

-------------------------------------------------------------

asd



martedì 9 ottobre 2012

Decomprimere DAA

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

lunedì 8 ottobre 2012

Debian Testing in QEmu/Windows



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)

qemu-img.exe create deb.img 10G
Formating 'deb.img', fmt=raw, size=10485760 kB

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
 

Snippet : apici inversi in Bash

Una cosa che mi scordo regolarmente quando utilizzo bash ovvero come si crea il carattere apice rovescio su tastiere che ne sono sprovviste

La soluzione e' semplice

Alt Gr + apice diritto

Esempio con GUI con Zenity in shell Bash

Mentre stavo giocando con airoscript mi sono accorto di un script bash che mostrava delle simpatiche finestre di interfaccia; curiosando dentro il codice ho visto che il generatore delle finestre era Zenity, un programma studiato appositamente per rendere piu' interattiva la shell

Impiegando questo strumento e' stato possibile simulare un esempio di GUI da Bash
---------------------------------------------------------------
VALUE=`zenity --scale --text="Selezionare il valore" --value=0`

case $? in
    0)
        zenity --info --text="E'stato selezionato il valore $VALUE%"
        zenity --progress --title="Progress Bar" --text="Valore selezionato $VALUE%" --percentage=$VALUE;;
    1)
        zenity --error --text="Nessun valore selezionato";;
    -1)
        zenity --info --text="Errore non atteso";;
esac
---------------------------------------------------------------
Qui il link allo script



sabato 6 ottobre 2012

Webcam Logitech C310 su Debian Testing

Mi sono comprato la Logitech C310 perche' sembrava essere pienamente compatibile con Raspberry, cosa che in realta' si e' rivelata errata



In compenso la Webcam funziona in modo decisamente buono (se non ottimo) se paragonata alle altre Webcam dal costo di qualche euro inferiore
Le prove sono state effettuate nelle peggiori condizioni per una webcam ovvero in una stanza buia con la sola lampada della scrivania accesa ma la resa e' notevole

Screenshot da VLC



utilizzando FFMpeg invece si puo' usare la stringa (ripresa da qui)

ffmpeg -f alsa -ac 2 -ar 48000 -i hw:0,0 -acodec mp2 -f video4linux2  -r 30 -i /dev/video0 -vcodec mjpeg -sameq ffmpeg.avi

Per quanto riguarda Debian nella versione testing vengono riconosciuti correttamente sia la parte video che la  parte audio (microfono) ma il programma Cheese non riesce a funzionare correttamente (ha un ritardo veramente notevole)



venerdì 5 ottobre 2012

Esempio Mandelbrot con GD/C e palette personalizzata

In questo esempio viene creato l'insieme di Mandelbrot utilizzando la libreria GD che si puo' installare in Debian mediante

apt-get install libgd2-noxpm-dev
(esiste una versione che include anche il formato xpm ma nel caso non interessa)

Vengono inoltre presentati due metodi per creare delle palette per la gestione dei colori (entrambe a 256 colori)
Palette 1

Palette 2


Link al progetto

Da compilare con clang -Wall -O3 mand_gd.c -o mand_gd -lgd
-------------------------------------------------------

#include <gd.h>
#include <stdio.h>
#include <math.h>
#include <error.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define RGB2INT(r,g,b)  (b + 256 * g + 256 * 256 * r)

float re_min = -2.0;
float im_min = -1.2;
float re_max = 1.0;
float im_max = 1.2;
int iterazioni = 255;

float a,b;
float x,y,x_new,y_new;
int k,j,i;

FILE *fp = {0};
gdImagePtr img = {0};
char *fname = "./mand_gd.png";
int s, color;
int red, green, blue;
int palette[256] = {0};

int main() {

float re_factor = (re_max-re_min);
float im_factor = (im_max-im_min);

//Inizializza lo schermo
img = gdImageCreateTrueColor(SCREEN_WIDTH, SCREEN_HEIGHT);

// crea la palette
for(s = 0; s < 256; s++) {
red   = (int)(128.0 + 128 * sin(3.1415 * s / 16.0));
green = (int)(128.0 + 128 * sin(3.1415 * s / 32.0));
blue  = (int)(128.0 + 128 * sin(3.1415 * s / 64.0));
palette[s] = RGB2INT(red, green, blue);
}

// crea una seconda palette
s = 0;
for(int ared=0;ared<=255;ared+=51)
{
for(int agreen=0;agreen<=255;agreen+=51)
{
for(int ablue=0;ablue<=255;ablue+=51)
{
palette[s]=RGB2INT(ared,agreen,ablue);
++s;
}
}
}

for (i=0;i<SCREEN_HEIGHT;i++)
{
for (j=0;j<SCREEN_WIDTH;j++)
{
a = re_min+(j*re_factor/SCREEN_WIDTH);
b = im_min+(i*im_factor/SCREEN_HEIGHT);

x = 0;
y = 0;
for (k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
red   = gdImageRed(img, palette[k]);
green = gdImageGreen(img, palette[k]);
blue  = gdImageBlue(img, palette[k]);
color = gdImageColorAllocate(img, red, green, blue);
gdImageSetPixel(img,j, i, color);
break;
}
x = x_new;
y = y_new;
}
}
}
if((fp = fopen(fname, "w")) == NULL)
  error(1, 0, "Error - fopen(): %s", fname);
 else {
  gdImagePng(img, fp);
  fclose(fp);
 }
gdImageDestroy(img);
return(0);
}


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...