martedì 19 marzo 2013

Wav file in Android

Per emettere suoni in un programma Android la prima cosa da fare e' trovare un file con il suono desiderato.
Una ottima fonte di suoni gratuiti e' Freesound.org

Una volta scaricato il file wav si clicca sulla cartella /res del progetto e si crea un nuovo folder denominato raw (si avra' quindi /res/raw) dove si copia il file del suono

a questo punto si puo' inserire questa funzione (copiata da qui) dove il suono in questo caso e' chiamato beep (da notare che si omette l'estensione)
-------------------------------------------------------------

private void playAlarm() {
            MediaPlayer mp = MediaPlayer.create(this,R.raw.beep);
            mp.start();
            mp.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.release();
                }

            });

giovedì 14 marzo 2013

martedì 12 marzo 2013

Esempio di utilizzo di Itext in Java

Presento adesso un esempio reale dell'utilizzo della libreria IText per la creazione di pettorali per una corsa podistica.
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)

Immagine di fondo

QrCode


Il risultato finale

Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------

package pettorale;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

/**
 *
 * @author l.innocenti
 */
public class Pettorale {
    private static PdfWriter writer;
    

    public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
        
    //String numero = args[0];
    String  numero = "175";
    int inizio = Integer.parseInt(numero);
    
    BufferedOutputStream out = null;
    try {
        out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        }
    
        //Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
        //Itext usa una unita'  di misura in punti tipografici 
        //1 cm = 28.35 unita' per cui le dimesioni del foglio sono
        //45 cm = 1285 u
        //32 cm = 907 u
        Rectangle pagina = new Rectangle(1275, 907);
        Document doc = new Document (pagina,0,0,0,0);

        try
        {
            writer = PdfWriter.getInstance (doc, out);
            doc.open ();
            PdfContentByte canvas = writer.getDirectContent();
            
            //inserisce lo sfondo 
            Image pettorale = Image.getInstance("pettorale/vuoto.png");
            pettorale.setAbsolutePosition(0f, 0f);
            pettorale.scalePercent(24.5f);
            doc.add(pettorale);

            //inserisce il QrCode del numero del pettorale
            Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
            qrcode.setAbsolutePosition(475f, 620f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);
            
            //2° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
            qrcode.setAbsolutePosition(1125f, 620f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);
            
            //3° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
            qrcode.setAbsolutePosition(475f, 170f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);

            //4° numero
            qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
            qrcode.setAbsolutePosition(1125f, 170f);
            qrcode.scalePercent(120f);
            doc.add(qrcode);

            
            //scrive il numero del pettorale alla giusta posizione
           //1° numero 
           if (inizio <10) {
                absText(Integer.toString(inizio),270,625);
            }
            if ((inizio >=10) && (inizio <= 99)) {
                absText(Integer.toString(inizio),235,625);
            }
            if ((inizio >=100) && (inizio <= 999)) {
               absText(Integer.toString(inizio),150,625);
            }
            
            //2°numero
            if (inizio+1 <10) {
               absText(Integer.toString(inizio+1),920,625);
            }
            if ((inizio+1 >=10) && (inizio+1 <= 99)) {
                absText(Integer.toString(inizio+1),885,625);
            }
            if ((inizio+1 >=100) && (inizio+1 <= 999)) {
               absText(Integer.toString(inizio+1),790,625);
            }

            //3°numero
            if (inizio+2 <10) {
               absText(Integer.toString(inizio+2),270,165);
            }
            if ((inizio+2 >=10) && (inizio+2 <= 99)) {
               absText(Integer.toString(inizio+2),235,165);
            }
            if ((inizio+2 >=100) && (inizio+2 <= 999)) {
               absText(Integer.toString(inizio+2),150,165);
            }
            
            //4°numero
            if (inizio+3 <10) {
               absText(Integer.toString(inizio+3),920,165);
            }
            if ((inizio+3 >=10) && (inizio+3 <= 99)) {
               absText(Integer.toString(inizio+3),885,165);
            }
            if ((inizio+3 >=100) && (inizio+3 <= 999)) {
               absText(Integer.toString(inizio+3),790,165);
            }

     
        }
        catch (DocumentException e)
        {
            System.out.println ("Fatal PDF error: " + e);
        }

        doc.close ();

    }
    
    private static void absText(String text, int x, int y) {
    try {
      PdfContentByte cb = writer.getDirectContent();
      BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
      cb.saveState();
      cb.beginText();
      cb.moveText(x, y);
      cb.setFontAndSize(slam, 200);
      cb.showText(text);
      cb.endText();
      cb.restoreState();
    } catch (DocumentException | IOException e) {
    }
  }
}
----------------------------------------------------------------------


Aggiornamento software Lumix DMC-LS5

Non pensavo che mi sarei mai ritrovato ad aggiornare il firmware ad una macchina fotografica (sarebbe curioso farlo con una Voigtlander  a rullino) ma e' accaduto con la Lumix DMC-LS5

In sostanza si deve scaricare il file di aggiornamento PDCE570a.elf ed inserirlo nella radice della scheda SD. Si accende quindi la macchina premendo contemporaneamente il tasto di scatto ed il tasto di accensione.

Dopo qualche secondo la macchina si spenge in automatico ed al nuovo riavvio si vede l'avvenuto aggiornamento




La prossima volta voglio i tasti CTRL+ALT+DEL insieme al pulsante di scatto

Falsi (Fake) Casio F-91W e G-9200-Riseman

Recentemente mi si e' rotto il cinturino del mio Casio F-91W (cosa abbastanza per questo orologio che e' sostanzialmente indistruttibile) e cercando mi sono accorto che i cinturini vanno dai 5 ai 10 euro mentre l'orologio nuovo completo viene venduto dai 17 ai 25 euro....insomma non conviene sostituito il pezzo

Andando a giro su Alibaba ho trovato un modello di Casio F-91W a 3 dollari (spedizione compresa)...un affare. Una volta arrivato l'oggetto mi sono reso conto che non si tratta di un vero Casio ma di una replica, seppur ben fatta. Esternamente le differenze sono solo sul fondello (la copia indica Made in China mentre l'originale Made in Thailandia) e sulla luce dell'illuminazione (sulla replica e' blu)

Originale a sinistra

Originale a sinistra

Le funzioni dell'orologio sono le medesime nella copia e nell'originale

Con lo stesso ordine ho preso anche un Casio G9200 a meno di 9 euro per una eventuale sostituzione del mio Casio W-753 (anche questo con problemi di cinturino). Francamente non sapevo che questo e' il modello di punta della serie G-Shock con prezzi di oltre 150 euro e la cosa mi doveva insospettire...io cercavo solo un orologio con un altimetro integrato.
Inutile dire che anche questo e' una copia dell'oroginale ma le funzioni sono purtroppo differenti: non e' presente l'altimetro/barometro/termometro, non ha la calibrazione via radio e non possiede la cella solare


Il metodo piu' semplice per distinguere la copia dall'originale e' la presenza di una G nel cerchio rosso (che e' presente solo nella copia)
Insomma. ho speso 10 euro per due copie ma volendo in fondo avere due cinturini direi che la spesa e' stata congrua. In piu' ho imparato una lezione per il futuro

Selezionare scheda di rete per Internet su LInux

In questo post verra' descritto come gestire una scheda di rete wireless USB in Linux.

Nel caso, come il mio, il portatile non possegga un pulsante fisico per disattivare la scheda di rete integrata non e' proprio banale utilizzare la scheda di rete supplementare in quanto il sistema operativo riconosce per prima la scheda integrata e la usera' come default


Una soluzione semplice potrebbe essere quella di disattivare una interfaccia di rete con

ifconfig wlan0 down

in questo modo si spenge la scheda integrata (wlan0) ma ci si accorge subito che non e' la soluzione finale in quanto non si riesce  a navigare su internet. In pratica si riesce ad utilizzare tutta la rete interna e si riesce a pingare il router ma nessun pacchetto viene instradato all'esterno

E' chiaro che deve essere configurata la tabella di routing
Se si digita route con le due schede attive si ottiene
---------------------------------------------------

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    0      0        0 wlan0
link-local      *               255.255.0.0     U     1000   0        0 wlan0
192.168.0.0     *               255.255.255.0   U     0      0        0 wlan0
---------------------------------------------------

disattivando la scheda integrata wlan0
---------------------------------------------------
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
link-local      *               255.255.0.0     U     1000   0        0 wlan1
192.168.0.0     *               255.255.255.0   U     0      0        0 wlan1
---------------------------------------------------
si vede chiaramente la perdita dell'interfaccia di default

Supponendo che l'indirizzo del router di 192.168.168.0.1 si puo' scrivere

route add default gw 192.168.0.1 wlan1

a questo punto la  tabella di routing viene cosi' modificata
---------------------------------------------------
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    0      0        0 wlan1
link-local      *               255.255.0.0     U     1000   0        0 wlan1
192.168.0.0     192.168.0.1     255.255.255.0   UG    0      0        0 wlan1
192.168.0.0     *               255.255.255.0   U     0      0        0 wlan1
---------------------------------------------------
e si riesce a navigare in Internet

In conclusione la sequenza di comandi per utilizzare a pieno la scheda Usb e'
ifconfig wlan0 down

route add default gw 192.168.0.1 wlan1

Errore Resource out of sync in Eclipse

Nel momento di esportare come file zip (Export to archive file) un progetto Android da Eclipse mi e' stato notificato l'errore di "Resource out of sync" su un file di cache del progetto.



La soluzione al problema risiede semplicemente nell'effettuare un Refresh del progetto

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...