martedì 12 marzo 2013

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

venerdì 8 marzo 2013

Tastiera per MK808

Mi sono comprato per l'Mk808 una tastiera vera al posto del mouse Logitech che usavo fino ad ieri piu' che altro per la navigazione internet perche' digitare gli indirizzi con il topo e' piuttosto noioso

La scelta e' caduta su una Logitech K700 che, acquistata su un sito cinese, e' costata meno dei Fly Mouse (che adesso vanno cosi' di moda) ed ha un touchpad integrato sulla tastiera classica



La K700 funziona al volo sull'MK808 e sono riconosciuti quasi tutti i tasti (compresi i tasti volume, tasti cursore, tasto home e back)

giovedì 7 marzo 2013

Creare file Jar con Eclipse

Per creare un file jar in Eclipse si deve prima cliccare sulla radice del progetto sulla finestra di sinistra e selezionare Export


Successivamente deve essere selezionato Runnable Jar File



Nell'ultima finestra, dal primo menu a tendina, deve essere selezionata la classe di lancio




Creare file Jar con Netbeans

Per ottenere dei file jar da distribuire di una propria applicazione da NetBeans e' sufficiente effettuare una Build del progetto (F11)

In questo modo viene creata una sottodirectory build nella quale sono contenuti tutti i file (librerie comprese) necessari per la redistribuzione dell'eseguibile


Creazione automatica QrCode in Java/Netbeans

Per generare QrCode in modo automatico in modo semplice si puo' utilizzare il metodo presentato a questo indirizzo

 Si deve scaricare la libreria XZing e si devono aggiungere al progetto le librerie core e javase contenute nelle sottodirectory del file zip


il codice e' stato modificato in modo da accettare in input sulla riga di comando (nella variabile args) il contenuto del QrCode. Questa motiva permette mediante una procedura batch di creare in automatico quanti QrCode si desiderino

-----------------------------------------
package qrcode;


import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Hashtable;

import com.google.zxing.client.j2se.MatrixToImageWriter;


/**
 *
 * @author l.innocenti
 */
public class QrCode {

    public static void main(String[] args) {
        Charset charset = Charset.forName("UTF-8");
        CharsetEncoder encoder = charset.newEncoder();
        byte[] b = null;
            try {
                // Convert a string to UTF-8 bytes in a ByteBuffer
                ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(args[0]));
                b = bbuf.array();
            } catch (CharacterCodingException e) {
                System.out.println(e.getMessage());
            }

            String data;
            try {
                data = new String(b, "UTF-8");
                // get a byte matrix for the data
                BitMatrix matrix = null;
                int h = 100;
                int w = 100;
                com.google.zxing.Writer writer = new MultiFormatWriter();
                try {
                    Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2);
                    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
                    matrix = writer.encode(data,
                    com.google.zxing.BarcodeFormat.QR_CODE, w, h, hints);
                } catch (com.google.zxing.WriterException e) {
                    System.out.println(e.getMessage());
                }

                // change this path to match yours (this is my mac home folder, you can use: c:\\qr_png.png if you are on windows)
                        String filePath = args[0]+".png";
                File file = new File(filePath);
                try {
                    MatrixToImageWriter.writeToFile(matrix, "PNG", file);
                    System.out.println("printing to " + file.getAbsolutePath());
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            } catch (UnsupportedEncodingException e) {
                System.out.println(e.getMessage());
            }
            }
}
-----------------------------------------
Il risultato e' una immagine Png con nome uguale al contenuto del QrCode 
Per creare in automatico 1000 numeri QrCode di numeri progressivi si puo' creare un file batch su Windows con la seguente linea
-------------------------------------------------------------

FOR /L %%A IN (1,1,1000) DO java -jar Qrcode.jar %%A
-------------------------------------------------------------

mentre in Linux
-------------------------------------------------------------

#!/bin/bash
for i in {1..1000}
do
   java -jar Qrcode.jar $i
done
--------------------------------------------------------------


mercoledì 6 marzo 2013

Prima applicazione in GDX

So bene che e' un giochino di una stupidita' allarmante ma considerando il fatto che e' stato fatto partendo da zero in meno di 3 ore e che puo' essere visualizzato su Android, Ios, Java (ovvero un indefinito universo di computer desktop e portatili) ed HTML5 la cosa diventa qualcosa di piu' di un giochino

Versione Desktop (Java)



Versione Android
la libreria riscala le dimensioni previste per la finestra alle reali dimensioni dello schermo del telefono, per questo motivo l'immagine risulta distorta (in origine la visualizzazione e' in landscape)
----------------------------------------------------

package com.me.mygdxgame;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;

public class MyGdxGame implements ApplicationListener {
private OrthographicCamera camera;
private SpriteBatch batch;
private Rectangle droid_s;
private Texture droidImage;
private Texture palloneImage;
private Rectangle pallone_s;
private int speed_x;
private int speed_y;
private Sound ballSound;
private int Screen_width;
private int Screen_height;
private int rimbalzi;
private SpriteBatch spriteBatch;
private BitmapFont font;

@Override
public void create() {
//carica il file degli sprite che sono nella directory assets
//gli sprite devono avere come dimensioni potenze di 2 (in questo caso sono 32x32 pixel)
        droidImage = new Texture(Gdx.files.internal("data/droid.png"));
        palloneImage = new Texture(Gdx.files.internal("data/pallone.png"));
        
        //carica il font contenuto sempre dentro assets
        font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
        spriteBatch = new SpriteBatch(); //per la scritta
        batch = new SpriteBatch(); // per gli sprite 
        
        //carica il suono
        ballSound = Gdx.audio.newSound(Gdx.files.internal("data/palla.wav"));

        //inizializza le variabili
        Screen_width = 800;
        Screen_height = 480;
        rimbalzi = 0;
speed_x = 4 ; //velocita' della palla in pixel
speed_y = -4;

        camera = new OrthographicCamera();
        camera.setToOrtho(false, Screen_width, Screen_height);
        
        //rettangolo del robottino
droid_s = new Rectangle();
droid_s.x = Screen_width/2 - 32 / 2;
droid_s.y = 10;
droid_s.width = 32;
droid_s.height = 32;

//rettangolo della palla
pallone_s = new Rectangle();
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;;
pallone_s.width = 32;
pallone_s.height = 32;
}

@Override
//cancella tutto in uscita dal programma
public void dispose() {
droidImage.dispose();
palloneImage.dispose();
batch.dispose();
spriteBatch.dispose();
font.dispose();
ballSound.dispose();
}

@Override
public void render() {
   Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        camera.update();
batch.setProjectionMatrix(camera.combined);
//controlla i rimbalzi
if (pallone_s.x < 0) speed_x = -speed_x;
if (pallone_s.x > 768) speed_x = -speed_x;
if (pallone_s.y == 64)   
{
if ((pallone_s.x >= droid_s.x-32) && (pallone_s.x < droid_s.x+32)) 
{
//se rimbalza sul robottino inverte marcia e fa il suono
speed_y = -speed_y;
ballSound.play();
// aggiorna il numero di rimbalzi
rimbalzi++;


}
}
if (pallone_s.y < 0) //se il pallone esce dal basso reinizia da capo
{
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;
speed_x = 4 ;
speed_y = -4;
rimbalzi = 0;
}
if (pallone_s.y > 448) speed_y = -speed_y;
 
//muove la palla
pallone_s.x = pallone_s.x-speed_x;
pallone_s.y = pallone_s.y-speed_y;

//aggiorna lo schermo
batch.begin();
batch.draw(droidImage,droid_s.x,droid_s.y);
batch.draw(palloneImage,pallone_s.x,pallone_s.y);
batch.end();

spriteBatch.begin();
        font.draw(spriteBatch, Integer.toString(rimbalzi), 10, 320);
        spriteBatch.end();

        //gestisce l'input dell'utente e sposta il robottino
        //se non si l'interfaccia touch il robottino si sposta tenendo premendo il tasto
        //e muovendo il mouse
if(Gdx.input.isTouched()) {
        Vector3 touchPos = new Vector3();
        touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
        camera.unproject(touchPos);
        droid_s.x = touchPos.x;
     }
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}
}

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

Impostare i font per GDX con Hiero

La libreria grafica GDX necessita' che il formato grafico dei font sia di tipo particolare (con estensione fnt) e non il classico truetype od altri

per effettuare la conversione dai font gia' installati sulla macchina al formato GDX si puo' utilizzare il programma Hiero che si lancia

java -jar hiero.jar

Si apre la schermata sopra riportata dove si puo' scegliere il font e l'esportazione in fnt
Verranno creati due file che devono essere inseriti nella sottodirectory assets
Per utilizzare il font e creare una scritta su una finestra GDX il codice da inserire e'

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

font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
spriteBatch = new SpriteBatch();
        

spriteBatch.begin();
font.draw(spriteBatch, "Luca", 10, 320);
spriteBatch.end();


FigSpec FS-60CL

A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...