lunes, 28 de mayo de 2012

Aplicaciones Android "The Pichulabs" "PicShake!"

Buenos días.

Hoy voy a publicitar nuestra nueva cuenta de android developer llamado "The PichuLabs" y las aplicaciones que hemos lanzado:

PicShake! Fail Edition

Es un visor de comics de FailBlog y otros blogs de viñetas de comics sobre fails y wins. Está en inglés y tiene la peculiaridad de que agitando el móvil te carga una viñeta random desde su extensa base de datos.

PicShake! Desmotivaciones

Tiene la misma funcionalidad y el mismo diseño que PicShake! Fail Edition solo que éste está en castellano y las viñetas tratan, como el nombre bien lo indica, sobre desmotivaciones.

Podéis descargaros las dos aplicaciones y futuras aplicaciones que lancemos en Google Play

No dudéis en comentar las aplicaciones y enviar un mensaje indicando sugerencias, mejoras o errores que hayáis podido apreciar.

Muchas gracias


miércoles, 28 de marzo de 2012

Añadir la fecha en ficheros de trazas log4j

Si queremos añadir la fecha a nuestros ficheros de trazas en log4j tenemos dos opciones.

Si nuestros programa va a estar constantemente en ejecución, queremos que cada día, hora o minuto se genere otro fichero log, para ello podemos usar el DailyRollingFileAppender. El properties que tendríamos que escribir sería el siguiente:

log4j.appender.diario = org.apache.log4j.DailyRollingFileAppender
log4j.appender.diario.File = diario.log
log4j.appender.diario.Append = true
log4j.appender.diario.DatePattern = '.'yyy-MM-dd
log4j.appender.diario.layout = org.apache.log4j.PatternLayout
log4j.appender.diario.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS}%m%n 
De esta forma generaremos ficheros cada día. El problema de esto es que el fichero de hoy no tendría fecha, puesto que los ficheros se renombran al pasar cada día, almacenando las trazas de el mismo día en diario.log. Si queremos ponerle fecha a nuestro fichero de trazas de hoy esclusivamente, usando un RollingFileAppender u otro appender por ejemplo, podemos crearnos una variable de sistema de esta forma:
 static{
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
     System.setProperty("current.date", dateFormat.format(new Date()));
    }
escribimos esas líneas de código en nuestro fichero java, nada más ejecutar el programa. Después, nuestro properties de log4j tendría esta forma:
log4j.appender.Pesado=org.apache.log4j.RollingFileAppender
log4j.appender.Pesado.file=registroHerramientaQJMT.${current.date}.log
log4j.appender.Pesado.layout=org.apache.log4j.PatternLayout
log4j.appender.Pesado.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}%m%n
Ahora ya tenemos la fecha de hoy en nuestro fichero de trazas.

miércoles, 14 de marzo de 2012

Convertir jar en exe

Se puede generar un exe a partir de un jar con un montón de programas. Yo os comentaré como hacerlo usando el programa Autoit.

Primero generamos el script que ejecutará el programa para crear el exe. Podemos usar el programa Scite que viene con el Autoit, o podemos crear el script a mano. Basta con abrir un documento de texto y cambiar la extensión a .au3

En mi caso, he generado un jar ejecutable que se llama  MiAplicacion.jar. Eso lo podemos generar con el eclipse, por ejemplo, exportando el proyecto. Es tan sencillo como:


Run ("java -jar MiAplicacion.jar")

Si tenemos que pasarle a nuestra aplicación parámetros, bastan con añadir los parámetros al final:

Run ("java -jar MiAplicacion.jar parametro1")

Y si deseamos que la consola de java no aparezca usaremos javaw en vez de java:

Run ("javaw -jar MiAplicacion.jar parametro1")

Podemos leer sobre esto en :

The javaw command is identical to java, except that with javaw there is no associated console window. Use javaw when you don't want a command prompt window to appear. The javaw launcher will, however, display a dialog box with error information if a launch fails for some reason.

Ahora arrancamos el programa Aut2exe.exe y nos pedirá el archivo au3 y la ruta donde generar el exe.

miércoles, 22 de febrero de 2012

Luchando por una educación pública

Esta entrada no tiene nada que ver con la programación pero aprovecha este blog para poneros un corto que trata sobre la educación pública. Un tema que está en boca de todos estos días y que peligra a no ser que reaccionemos.
 


Me gustaría también pediros, si fuerais tan amables, de votar positivamente el video. Muchas gracias.

Internalización en Java

Podemos hacer que nuestros textos en nuestro programa sean traducidos de una manera muy fácil. De esta forma, si el sistema operativo está en español, los textos aparecerán en español y aparecerán en ingles si tenemos el sistema operativo en ingles.

Para conseguir esto debemos seguir varios pasos.

Primero creamos un archivo properties. Lo llamaremos recursos.properties Este archivo contendrá las traducciones.

MENU_INICIO=Inicio
MENU_PAGINA_INICIO=Página de inicio
MENU_SALIR=Salir

Ahora crearemos ficheros properties iguales pero que contienen las traducciones. Los archivos se llamarán llamarse igual que este, pero añadiendo _xx o bien _xx_YY donde xx son dos letras que hacen referencia al idioma e YY dos letras que hace referencia al país donde se habla idioma.

miércoles, 8 de febrero de 2012

Crear directorios en Java

Si queremos crear un directorio con Java, podemos usar la clase File. Después llamaremos a los metodos mkdir() o mkdirs().

File directorio = new File("c:\\Programas\\directorio");
directorio.mkdir();

Si únicamente ponemos el nombre de la carpeta a crear, deberemos de hacerlo sin barras. Son barras dobles porque sino java interpreta como un signo de escape.

mkdir() asume que la ruta de directorios existe y creará el último directorio.
mkdirs(), todos los directorios anteriores a la carpeta se crearán, existan o no. De este modo no saltará ninguna excepción si es que los directorios no existen.

Estos metodos lanzan SecurityException si es que existe un administrador de seguridad y no permite los nombres de los directorios.

martes, 17 de enero de 2012

Criptografía simétrica y asimétrica

La criptografía se usa para ntercambiar mensajes que sólo puedan ser leídos por usuarios a las que van dirigidos y que poseen los medios para descifrarlos.

Mediante una clave secreta, ciframos un mensaje y después podemos descrifrar el mensaje con la misma clave u otra distinta. De esta forma hay dos tipos de algoritmos, según cantidad de claves:
  • Critografía simétrica
  • Criptografía asimétrica
Ahora os voy a explicar brevemente cada uno y al final tenéis una comparativa entra las dos.

lunes, 16 de enero de 2012

Exclusión mutua en Java con Lock

java.util.concurrent.locks.ReentrantLock es una clase en Java para la exclusión mutua, con el mismo comportamiento que los monitores Synchronized pero con más funciones. Entre ellas podemos encontrar:

  • 1. tryLock(): coger el cerrojo si es posible, sino devuelve false.
  • 2. tryLock(long timeout, TimeUnit unit): coger el cerrojo antes del timeout y devuelve false después del timeout.
  • 3. lockInterruptibly():intenta coger el cerrojo y entrar en el estado wait, pero puede ser interrumpido por otro hilos.

Para iniciarlo:
private Lock cerrojo = new ReentrantLock();


Un ejemplo de como asegurar una variable:
dialog.addWindowListener(new WindowAdapter(){
    publicvoid windowClosing(WindowEvent we){
        cerrojo.lock();
        desconectando = true;
        cerrojo.unlock();
    }

});
 
Aquí tenéis la documentación: Enlace. 

miércoles, 11 de enero de 2012

Ejemplo MD5 en Java

MD5 es uno algoritmo de reducción criptográfico.

MD5 se utiliza para comprobar que lo que descargamos de internet es el archivo original y no un troyano. También se utiliza para comprobar claves guardando el valor hash en disco y comparando con éste. Aplicando MD5 obtenemos un valor hash de 32 dígitos hexadecimales. Este valor se envía junto con el archivo. El usuario compara el valor hash del archivo obtenido con el valor hash que le han proporcionado y si no son iguales estamos seguros que el archivo ha sufrido un cambio y no es el original.
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class MD5 {
    public static String getMD5(String entrada) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(entrada.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            String hashtext = number.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
 
    public static void main(String[] args) throws NoSuchAlgorithmException {
        System.out.println(getMD5("Nuestra Clave"));
    }
}

Podemos cambiar el algoritmo MD5 por MD2, MD4, SHA...

Añadir un evento a un botón Swing

Éste es el código para añadir un evento a un botón Swing en Java.
   private JButton boton = new JButton("Botón");

   boton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
         System.out.println("Click!");
      }
   }); 
 
Aquí tenéis la documentación: Enlace

No dejar redimensionar una ventana SWT

shell = new Shell(SWT.DIALOG_TRIM | SWT.MIN); 

De esta forma bloqueamos el redimensionamiento de una ventana(shell) en SWT. Sería el equivalente en swing de

frame.setResizable(false);


Escribimos en el constructor del shell las propiedades y listo.
Si queremos añadir más restricciones a la ventana podemos concatenar cualesquiera de esta lista:
SWT.BORDER 
SWT.CLOSE 
SWT.MIN 
SWT.MAX 
SWT.RESIZE 
SWT.TITLE 
SWT.NO_TRIM 
SWT.SHELL_TRIM 
SWT.DIALOG_TRIM 
SWT.MODELESS 
SWT.PRIMARY_MODAL 
SWT.APPLICATION_MODAL 
SWT.SYSTEM_MODAL 

Añadir una barra de progreso a un navegador embebido

Aquí os dejo el código para poder añadir una barra de de progreso a un navegador embebido que está incrustado en un composite de SWT.

public class NavegadorEmbebidoSWT extends Composite {
  private Browser browser;
  ProgressBar progressBar;
  boolean busy;
  int index;

  public NavegadorEmbebidoSWT(Composite parent, String urlEntorno) {
    super(parent, SWT.NONE);

    GridLayout layout = new GridLayout(2, true);
    setLayout(layout);

    browser = new Browser(this, SWT.NONE);
    GridData layoutData = new GridData(GridData.FILL_BOTH);
    layoutData.horizontalSpan = 2;
    layoutData.verticalSpan = 2;
    browser.setLayoutData(layoutData);
    
    //Barra de progreso
    progressBar = new ProgressBar(this, SWT.NONE);
 progressBar.setLocation(600, 5);
 progressBar.setSize(108, 23);
 
 browser.addProgressListener(new ProgressListener() {
      public void changed(ProgressEvent event) {
          if (event.total == 0)
            return;
          int ratio = event.current * 100 / event.total;
          if (progressBar != null)
            progressBar.setSelection(ratio);
          busy = event.current != event.total;
          if (!busy) {
            index = 0;
          }
        }

        public void completed(ProgressEvent event) {
          if (progressBar != null)
            progressBar.setSelection(0);
          busy = false;
          index = 0;
        }
      });
    
    browser.setUrl(urlEntorno);
 
  }
  
}

Simplemente instanciáis un composite de este tipo y ya tenéis un navegador con su barra de progreso embebido. Con el método browser.setUrl podéis poner la url que queráis cargar.

martes, 10 de enero de 2012

Referenciar librerías jar en un ejecutable .bat

Esta mañana he estado intentando crear un ejecutable .bat en windows donde ejecutaba un fichero jar. He tenido problemas a la hora de referenciar las librerías. El error que me daba era:

exception in thread main java.lang.noclassdeffounderror

Ahora os voy a explicar como lo he solucionado.