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
giovedì 7 marzo 2013
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());
}
}
}
-----------------------------------------
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
--------------------------------------------------------------
-------------------------------------------------------------
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() {
}
}
----------------------------------------------------
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();
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();
martedì 5 marzo 2013
Primi passi con GDX
La libreria GDX e' indirizzata allo sviluppo di giochi che permette di scrivere il codice una sola volta ed avere la propria applicazione funzionante in Java, Android, HTML5 e IOS (ovviamente per poter effettuare la compilazione e' necessario aver installato e funzionante l'SDK di ciascun ambiente che per HTML5 risulta essere Google WebToolkit)
Per iniziare ad usa la libreria si deve scaricare la libreria ed il file gdx-setup-gui.jar e poi digitare
java -jar gdx-setup-gui.jar
tale programma crea lo scheletro dell'applicazioni nei vari linguaggi di programmazione
Una volta lanciato il programma si apre la schermata sottostante nel quale si possono impostare i vari settaggi (nel caso si puo' scaricare la libreria GDX o si puo' indicare dove e' posto il file .zip)
Terminato si effettua il Launch
La directory selezionata sara' popolata dai nuovi file. A questo punto si puo' aprire Eclipse e si seleziona Importa progetto esistente (attenzione da non confondere con Importa progetto Android esistente!!)
Si seleziona la directory in cui e' stato creato lo scheletro del programma e ci si trova di fronte ad una schermata di questo tipo
Puo' accadere che vi sia un errore nel progetto HTML5 e puo' essere risolto come indicato nella seconda schermata del comando java -jar gdx-setup-gui.jar
Di fatto si lavorera' solo nel primo ramo del progetto (non in android.desktop,html) in quanto gli altri rami saranno solo dei wrapper
Per iniziare ad usa la libreria si deve scaricare la libreria ed il file gdx-setup-gui.jar e poi digitare
java -jar gdx-setup-gui.jar
tale programma crea lo scheletro dell'applicazioni nei vari linguaggi di programmazione
Una volta lanciato il programma si apre la schermata sottostante nel quale si possono impostare i vari settaggi (nel caso si puo' scaricare la libreria GDX o si puo' indicare dove e' posto il file .zip)
Terminato si effettua il Launch
La directory selezionata sara' popolata dai nuovi file. A questo punto si puo' aprire Eclipse e si seleziona Importa progetto esistente (attenzione da non confondere con Importa progetto Android esistente!!)
Si seleziona la directory in cui e' stato creato lo scheletro del programma e ci si trova di fronte ad una schermata di questo tipo
Ancora avanti ed al termine si avra' il Package Explorer di Eclipse popolato come segue
Soft Lockup su Debian Testing
Qualche giorno fa avevo spento un vecchio portatile in modo normale senza nessun sintomo di errore (o meglio lo avevo spento un po' frettosolosamente perche' la spina a cui lo avevo attaccato a ricaricare aveva un po' di dispersione di corrente...lo shutdown era stato comunque corretto)
oggi al momento di riaccenderlo mi sono trovato davanti la seguente schermata
In pratica la CPU0 (l'unica!!) e' rimasta disattiva per 23 secondi ed il kernel ha mollato il colpo
Facendo partire il sistema con la visualizzazione dei comandi di boot l'ultimo comando ad essere tentato e'
rtc_cmos rtc can wake from s4
al momento non ho soluzioni
HP33s
Comprata su un mercatino a 15 euro questa e' la sorella minore (e piu' giovane) della HP48GX
Non ha capacita' grafiche ed e' solo blandamente programmabile..in compenso ha la notazione polacca inversa e la sua custodia originale
In sintesi una buona e solida calcolatrice scientifica
Non ha capacita' grafiche ed e' solo blandamente programmabile..in compenso ha la notazione polacca inversa e la sua custodia originale
In sintesi una buona e solida calcolatrice scientifica
Iscriviti a:
Commenti (Atom)
Olivetti Da VInci DV3 PDA funzionante
Aspettavo da tempo l'acquisizione nel mio piccolo museo. Per alcune caratteristiche seguire il link
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...











