Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

31/12/10

Tarot Virtual [Pinky y Cerebro Responde]

JAN29


Tarot Virtual "Pinky y Cerebro responde" es un juego hecho en java que simula ser un "Adivino", "Brujo", "Yatiri", etc, que es capaz responder cualquier pregunta que le hagas, al estilo del juego online "Pedro responde".

 ¿Como se juega?

Para que Tarot Virtual responde correctamente las preguntas que le hagas, hace uso de un pequeño truco, truco que solo tu debes conocer, sino no habria chiste.

Paso 1.
Ejecuta el programa y podras observar que este cuenta con tres espacios y un boton.

En el espacio que dice "Escribe la petición" , escribe primero un PUNTO ".", esto activara el truco, en su lugar aparecera una "P", despues escribe la respuesta secreta y para terminar escribe otro PUNTO "." si aun no se completo la frase "Pinky por favor responde", completa la oracion, osea:
Paso 2.
En el espacio que dice "Escribe tu pregunta", debes escribir una pregunta relacionada con la respuesta secreta que escribiste arriba.

Despues presiona el boton "Responde" y te mostrara la respuesta que esta oculta y que escribiste en la petición.

Tambien puedes jugar con Cerebro, pero en lugar de utilizar un PUNTO, debes utilizar un GUION, por ejemplo:


-RESPUESTA SECRETA-resto del texto

¿Que necesitas para jugar?

Como el juego esta hecho en java, necesitas tener instalado en tu PC la Maquina Virtual Java que puedes descargar desde su pagina "www.java.com", es gratuito.

DEMO Y TRUCO DEL JUEGO

Enlace actualizado 5 de mayo 


continue reading

30/12/10

Método de Selección [Algoritmo de Ordenación]

JAN29

Este método de ordenación ubica el elemento con el mayor valor de la lista y una vez ubicado se intercambian los valores de este elemento con el ultimo elemento de la lista, de esta manera (al igual que sucedia con e metodo de Burbuja), el ultimo elemento queda con el valor correcto (el mayor).

El procedimiento descrito en el anterior parrafo constituye en sí el metodo de Selección. Ahora para los restantes elementos de la lista se repite el procedimiento pero sin tomar en cuenta el ultimo elemento, luego se vuelve a repetir sin tomar en cuenta los dos ultimos elementos y se continua así hasta que en la lista sólo queda un elemento.

Debido a que sólo se efectua un intercambio cada vez que se repite el método y tomando en cuenta que el intercambio de valores es la operacion que mas tiempo consume en los metodos de ordenación este método suele ser un tanto mas rapido que el metodo de la Burbuja. Sin embargo, en este metodo no existe ningun indicador que nos permita saber si la lista queda ordenada en algun momento durante el proceso, de manera que el método continua hasta que solo queda un elemento, incluso cuando la lista ya esta ordenada.

Ejemplo: Teniendo el siguiente vector: x1, x2, x3, x4, x5 con valores:

| 8 | 6 | 9 | 5 | 2 | 

Analizamos la lista y vemos que el mayor valor (9) se encuentra en la posicion 3, por lo tanto intercambiamos valores de los elementos x3 y x5


| 8 | 6 | 2 | 5 | 9 | 

Ahora repetimos el procedimiento sin tomar en cuenta el ultimo elemento (pues ya tiene el valor correcto). Ahora vemos que el mayor valor (8) se encuentra en la posicion 1, por tanto intercambiamos los valores de los elementos x1 y x4


| 5 | 6 | 2 | 8 | 9 | 

con lo que el penultimo elemento (x4) queda con el valor correcto. Repetimos nuevamente el procedimiento pero sin tomar en cuenta los dos ultimos elementos. Vemos ahora que el mayor valor (6) esta en la posicion 2, por tanto intercambiamos los valores de los elementos x2 y x3


| 5 | 2 | 6 | 8 | 9 | 

Con lo que x3 queda con el valor correcto. Repetimos una vez mas el procedimiento pero sin tomar en cuenta los elementos x3,x4,x5. Vemos ahora que el mayor valor (5) se encuentra en la posicion 1, por tanto intercambiamos los valores x1 y x2.


| 2 | 5 | 6 | 8 | 9 | 

Entonces x2 tambien queda con el valor correcto, como ahora solo queda un elemento (x1) el proceso concluye y la lista ya esta ordena.

Codigo Java: La clase escrita en Java se llama "Seleccion.java"


01 /**
02  * @web http://jc-mouse.blogspot.com/
03  * @author Mouse
04  */
05 public class seleccion {
06     private int[] vector;
07     private int elementos;
08     
09     public seleccion (){}   
10     
11     public int[] ordenar(int[] v){
12         this.vector=v;        
13         elementos = vector.length;
14         //se toma como valor mayor el ultimo elemento del vector "n-1"
15         int mayor = vector[elementos-1];//ojo: en java el array empieza en "0" 
16         int pos = elementos-1;
17         int aux;
18         //se repite el ciclo hasta que quede un solo elemento
19         while(elementos > 1) {
20             //se recorre todos los elementos del vector
21             for(int i=0; i<elementos;i++){
22                 //se busca el elemento mayor
23                 if(vector[i]>mayor){                                   
24                     mayor = vector[i];
25                     pos = i;
26                 }               
27             }
28             // se intercambian valores, el valor mayor encontrado se hubica en
29             // la ultima posicion del vector
30             aux = vector[elementos-1];
31             vector[elementos-1] = mayor;
32             vector[pos] = aux;
33             System.out.println("orden de ciclo : "+ Mostrar(vector));                                    
34             //se resta en uno la cantidad de elementos
35             elementos--;
36             //se toma como valor mayor el ultimo elemento del vector
37             mayor = vector[elementos-1];
38             pos = elementos-1;
39         }        
40         return vector;
41     }
42     
43    //para imprimir el array de la forma | 0 | 1 | 2 | 3 | 4 | 
44     public String Mostrar(int[] v){
45         String s=" | ";
46         for (int i=0; i < v.length; i++){
47             s += v[i] + " | ";
48         }
49         return s;
50     }   
51 }
Nota: la linea de codigo (33) solo nos sirve para mostrar el ciclo en pantalla, no es necesario.
Nota2: el metodo Mostrar(int[] v)  prepara el vector en un String de la forma |0|1|2|3|4|5| para su impresion en pantalla,

Implementacion:

01 import java.util.Random;
02 /**
03  * @web http://jc-mouse.blogspot.com/
04  * @author Mouse
05  */
06 public class Main {     
07 
08     public static void main(String[] args) {         
09         //creamos un array y llenamos este con numeros al azar
10         int[] c = null ;        
11         c = generarlista(5);        
12         seleccion s = new seleccion();
13         System.out.println("ORIGINAL : "+ s.Mostrar(c));        
14         System.out.println("ORDENADO : "+ s.Mostrar(s.ordenar(c)));
15     }
16 
17     //genera un array de n elementos enteros
18     public static int[] generarlista(int n){        
19         int[] v = new int[n];
20         Random rand = new Random();
21         for (int i=0; i<v.length; i++){
22             v[i]=rand.nextInt(10);
23         }   
24         return v;
25     }    
26 }

El metodo generarlista(n) , genera una lista de enteros dado un rango.

Resultado:

 FIN

continue reading

26/12/10

Puzzle Neon Genesis Evangelión

JAN29

Información sobre la serie:
Neon Genesis Evangelion (新世紀エヴァンゲリオン, también conocido como «Evangelion») es una serie de anime y manga japonesa. La serie trata de un mundo futuro en el que una organización militar llamada NERV protege a la humanidad de los ataques de unos seres de origen desconocido llamados «ángeles», usando para ello robots biomecánicos llamados «EVA». A medida que la serie avanza se torna cada vez más confusa y psicológica, en donde el desarrollo de los personajes y sus personalidades (miedos, deseos) es fundamental.

El Juego
  • El juego esta desarrollado en lenguaje Java con ayuda del IDE Netbeans 6.0
  • EL juego consiste en armar los rompecabezas en el menor tiempo posible.
  • El juego cuenta con 10 puzzles.
  • Los resultados son guardados en un archivo XML
  • El juego puede ser ampliado con nuevos rompecabezas (manual disponible proximamente)
Requerimientos minimos
  • Maquina Virtual Java (Descargar)
  • 12Mb de espacio en disco

Instalación
  • No necesita de instalacion, el juego esta comprimido en un archivo RAR, solo necesita ser extraido para comenzar a jugar.
¿Como jugar?
Para comenzar a jugar el rompezabezas, ejecutar el archivo jcPuzzleRei.exe, primeramente aparecera una ventana preguntando su nombre, escriba y presione "Jugar", entonces se desplagara la pantalla principal de juego, en la parte superior derecha, se encuentra los botones "Anterior" y "Siguiente", con estos puede elegir el puzzle que desea jugar, una vez que eliga el puzzle, presione el boton START hubicado en la parte inferior derecha, este cambiar su estado a "Stop" para que puede detener el juego en cualquier momento, cuando comienza el juego, el puzzle aparecera desordenado y el cronometro comenzara a correr, para mover una pieza del puzzle debe hacer un clic sobre esta, si la pieza tiene un espacio libre donde moverse, se movera.
Si desea ver estadisticas del juego, solo se muestran los 10 primeros puestos, haga clic en la vista previa del puzzle.

Captura de Pantalla
Demo

Enlace de descarga
Click para descargar

Nota1: esta versión es apta para cualquier edad, muy pronto la version Hentai (solo adultos)  estara disponible.
Nota 2: Si el juego tuviera algún BUG, se ruega avisar por favor :)
Nota 3: El juego esta diseñado para que pueda ser expandido con nuevos puzzles, el manual estara disponible proximamente

continue reading

18/12/10

JTable con Formato

JAN29


Como pasar de esto
 a esto
Eso es lo que veremos en este tutorial ;D

Paso 1: Crea un nuevo proyecto en Netbeans (ej: jcTable), añade un JFrame (nombre: interfaz) y a este añade un objeto JTable.

Paso 2: Crea una nueva clase que llamaremos "FormatoTabla.java", añade el siguiente codigo:

package jctable;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class FormatoTabla extends DefaultTableCellRenderer{    
    Font normal = new Font( "Arial",Font.PLAIN,12 );
    Font negrilla = new Font( "Helvetica",Font.BOLD,18 );
    Font cursiva = new Font( "Times new roman",Font.ITALIC,12 );

    @Override 
    public Component getTableCellRendererComponent ( JTable table, Object value, boolean selected, boolean focused, int row, int column ) 
    {
        setEnabled(table == null || table.isEnabled()); 
        
        setBackground(Color.cyan);//color de fondo
        table.setFont(normal);//tipo de fuente
        table.setForeground(Color.black);//color de texto
        setHorizontalAlignment(2);//derecha
                
        //si la celda esta vacia se reemplaza por el texto "<vacio>" y se rellena la celda de color negro y fuente color blanco
        if(String.valueOf(table.getValueAt(row,column)).equals("")||String.valueOf(table.getValueAt(row,column)).equals("<vacio>")){            
            table.setValueAt("<vacio>", row, column);
            setBackground(Color.black);                         
            table.setForeground(Color.white);
            table.setFont(cursiva);
        }
        /*--------*/
        if(String.valueOf(table.getValueAt(row,column)).equals("jc Mouse")){
            setBackground(Color.red); 
            table.setFont(negrilla);                
            setHorizontalAlignment(0);//centro
        }                        
        /*--------*/
        if(String.valueOf(table.getValueAt(row,column)).equals("de")){
            setBackground(Color.yellow);         
            table.setFont(negrilla);                
            setHorizontalAlignment(0);//centro
        }
         /*--------*/   
        if(String.valueOf(table.getValueAt(row,column)).equals("Bolivia")){
            setBackground(Color.GREEN); 
            table.setFont(negrilla);                
            setHorizontalAlignment(0);//centro
        }        
        /*--------*/
        //si la celda contiene números
        if(isNumber(String.valueOf(table.getValueAt(row,column)))){
            setBackground(Color.BLUE); 
            setHorizontalAlignment(4);//izquierda
        }      
        
        super.getTableCellRendererComponent(table, value, selected, focused, row, column);         
        return this;
 }
    
 //
 private boolean isNumber(String cadena){
         try {
             Double.parseDouble(cadena.replace(",", ""));
         } catch (NumberFormatException nfe){
             String newCadena = cadena.replace(".", "").replace(',', '.');
             try{
                 Double.parseDouble(newCadena);
             } catch (NumberFormatException nfe2){
                 return false;
             }
        }
         return true;
    }

}

Esta clase lo que hace es utilizar el "DefaultTableCellRenderer" para dar el formato a las tablas, segun las reglas que nosotros quisieramos definir, palabras reservadas, string, numeros, celdas vacias, etc.


Paso 3: en el JFrame, debemos llamar a esta clase "FormatoTabla.java" de la siguiente manera:


public interfaz() {
   initComponents(); 
   //se asigna el formato a la tabla
   jTable1.setDefaultRenderer (Object.class, new FormatoTabla());
}
y eso es todo ;), todo cambio que realizamos en tiempo de ejecucion en el JTable, aplicara el formato que nosotros le dimos.

enlace de descarga del proyecto en Netbeans 6.0
Click para descargar

continue reading

2/12/10

Tragamonedas [comparar imagenes en java]

JAN29

Lei en los comentarios una consulta de una persona que dice estar programando un juego de tragamonedas o tragaperras (que feo se escucha eso) y que tiene un problema, "comparar las imagenes" del juego que coloca en un objeto JLabel para saber si la combinacion es la correcta, pues bien formas de hacer eso hay muchas, pero para no complicarnos mucho la existencia, no comparemos las imagenes (archivos jpg, png, gif, etc), sino los objetos jLabel, y asi nos ahorramos mucho trabajo XD.

¿Como hacemos eso? pues bien, cuando cargamos las imagenes en un jlabel, este guarda muchas cosas, entre otras el nombre del archivo o sea :

si JLabel1 tiene el archivo Imagen1.jpg cargado y JLabel2 tiene el mismo archivo imagen Imagen1.jpg, lo unico que tenemos que hacer es comparar si ambas rutas son las mismas, si es asi, entonces ambos JLabels tienen la misma imagen sino, no son iguales, osea:


if(jLabel1.getIcon().toString().equals(jLabel2.getIcon().toString()){
 //son iguales
}else{
 //no son iguales
}


Como para explicar las cosas yo soy para un gusto fino, mejor dejo un ejemplo completo en netbeans 6.0 del proyecto para que cheken el codigo XD

un demo de como son las cosas

el codigo
Click para descargar


Todos los caminos conducen a roma

continue reading

30/11/10

Procesos del Software

JAN29


¿Qué es un modelo de procesos del software?
 3094x2457
Clic para ampliar

Modelos del proceso del software
  • El modelo en cascada
  • Desarrollo evolutivo
  • Ingeniería del software basada en componentes

Iteración de procesos

  • Entrega incremental
  • Desarrollo en espiral

El Proceso Unificado de Rational

continue reading

22/11/10

Playlist con XML y Java (reproductor mp3)

JAN29


En este proyecto se utiliza la librería JDOM para leer los datos de un archivo XML desde java y
mostrarlos en pantalla, la librería JDOM nos permite manipular los datos XML fácilmente y cuenta con varios métodos que hacen nuestro trabajo mas agradable.

Que utilizamos:
  • JDOM: JDOM es una biblioteca de código abierto para manipulaciones de datos XML optimizados para Java.
  • JMF: Java Media Framework o JMF (en español entorno de trabajo multimedia de Java) es una extensión de Java que permite la programación de tareas multimedia en este lenguaje de programación.
  • Netbeans 6.0
  • XML: Extensible Markup Lenguage o Lenguaje de marcado extendible
  • Un editor de texto para crear el archivo XML (Notepad por ejemplo)
Proyecto:

El proyecto  PlayListXML esta formado por un clase XMLpanel.java la cual se extiende de un JPanel, es aqui donde utilizamos la libreria JDOM para manipular el archivo XML, esta clase hace uso de la clase Song.java la cual es un JPanel donde se colocaran los datos leidos del playlist XML. ademas este proyecto tambien utiliza la libreia de JMF para reproducir los archivos MP3

El archivo XML que forma el playlist, tiene la siguiente estructura:

<?xml version="1.0" encoding="UTF-8"?>  
<playlist>
 <song id="1">
  <titulo>TITULO</titulo>
  <artista>ARTISTA</artista>
  <album>ALBUM</album>
  <location>DIRECION DEL ARCHIVO MP3</location>
  <artLocation></artLocation>  
 </song>
</playlist>

Es un XML simple la cual esta formada por los elementos necesarios que puede tener un playlits, Titulo de la cancion, artista, album, direccion del archivo MP3 y un campo adicional donde se almacena la ruta de los Preview de los album, en este caso todos se encuentran dentro del JAR

El archivo XML con los datos de las canciones puede verse aqui abajo:
<?xml version="1.0" encoding="UTF-8"?>  
<playlist>
 <song id="1">
  <titulo>Mi Cordura</titulo>
  <artista>La logia</artista>
  <album>Nacer para morir</album>
  <location>E:/mp3/Mi Cordura.mp3</location>
  <artLocation>/album/album3.jpg</artLocation>  
 </song>
 <song id="2">
  <titulo>Jamas la vi</titulo>
  <artista>La Logia</artista>
  <album>Morir para nacer</album>
  <location>e:/mp3/Jamas La Vi.mp3</location>
  <artLocation></artLocation>  
 </song>
 <song id="3">
  <titulo>Patria</titulo>
  <artista>La Logia</artista>
  <album>Escalofriante</album>
  <location>e:\mp3\00000000000Patria.mp3</location>
  <artLocation>/album/album5.jpg</artLocation>  
 </song>
 <song id="4">
  <titulo>La Vieja</titulo>
  <artista>Cordura</artista>
  <album>No tengo idea</album>
  <location>e:\mp3\08 - La Vieja.mp3</location>
  <artLocation>/album/album5.jpg</artLocation>  
 </song>
 <song id="5">
  <titulo>Knockin On heavens door</titulo>
  <artista>GUns and roses</artista>
  <album></album>
  <location>e:\mp3\007.-KNOCKIN ON HEAVEN.mp3</location>
  <artLocation>/album/album5.jpg</artLocation>  
 </song>
</playlist>

La clase encargada de manipular los archivos XML es  XMLpanel.java:

package playlistxml;
import java.awt.Dimension;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class XMLpanel extends javax.swing.JPanel {
    
    Dimension d = new Dimension(470,500);
    
    //constructor al cual se le pasa la direccion del archivo XML
    public XMLpanel(String pl){    
        int i=0;
        //añadimos un layout
        this.setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));               
        try {
         // Creamos el builder SAX
         SAXBuilder builder = new SAXBuilder();         
         Document doc = builder.build(new FileInputStream(pl));
          // Obtenemos la etiqueta raíz
         Element raiz = doc.getRootElement();                  
         List &lt;Element&gt; hijosRaiz = raiz.getChildren();                
         //recorremos todos los hijos de la raiz
         for(Element hijo: hijosRaiz){ 
             //creamos un nuevo objeto SONG
             this.add(new song());         
             //añadimos propiedades
             ((song)this.getComponent(i)).setTitulo(hijo.getChild("titulo").getValue());
             ((song)this.getComponent(i)).setArtista(hijo.getChild("artista").getValue());
             ((song)this.getComponent(i)).setAlbum(hijo.getChild("album").getValue());
             ((song)this.getComponent(i)).setLocation(hijo.getChild("location").getValue());             
             ((song)this.getComponent(i)).setPreview(hijo.getChild("artLocation").getValue());                                          
             i++;             
         }//fin hijos               
        }catch (JDOMException ex) {
            Logger.getLogger(XMLpanel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(XMLpanel.class.getName()).log(Level.SEVERE, null, ex);
        }         
        //asignamos tamaño al panel deacuerdo 
        d = new Dimension(410,(100*(i)));          
        this.setSize(d);        
        this.repaint();      
    }
    
  //sirve para obtener cual es el archivo mo3 seleccionado del playlist  
  public String getSongSelecionado(){
      String File="";
      for(int i=0; i&lt;this.getComponentCount();i++){            
            if(((song)this.getComponent(i)).getSeleccion()){
                File = ((song)this.getComponent(i)).getLoaction();                      
                break;
            }            
        }
    return File;
  }
    
}
Todo el proyecto esta comentado y es (creo) fácilmente entendible para un programador "intermedio", novatos abstenerse. se los dejo para su análisis y estoy mas que seguro que a mas de uno le servirá en su universidad, escuela , instituto o simplemente para conocer un poco mas de lo que puede ofrecer java.

Este es el resultado del proyecto

El proyecto completo hecho en Netbeans 6.0 junto con las librerías necesarias en el siguiente enlace

http://link.jc-mouse.net/?id=P14Y115TXM
Actualizado 21-marzo-2013

continue reading

16/11/10

ProGuard ejemplo básico

JAN29


ProGuard es una libreria hecha en Java que nos permite optimizar y ofuscar (dificultar la vision) del codigo java una ves que este esté compilado. Optimiza el ByteCode al eliminar lineas de codigo que no se utilizan, cambia de nombre las clases, campos y metodos con nombres cortos haciendo el codigo casi indescifrable.

Mas informacion en la pagina del proyecto en ingles : http://proguard.sourceforge.net/

Basta de teoria y vamos a la practica, ¿que necesitamos?

1. La libreria ProGuard, la ultima version estable es la 4.5.1, la puedes descargar desde aqui.

2. Un JAR que optimizaremos y ofuscaremos, para este ejemplo utilizaremos un proyecto en netbeans llamado "ProgdPrueba" desde ahora me referire a el como JAR. Esta JAR es trivial (encripta/desencripa con el método Cesar), utiliza las librerias basicas de java, tiene una interfaz grafica  y esta compuesta por una clase MAIN.java,  interfaz.java y cesar.java. El proyecto completo más extras se encuentra al final del tutorial.

Comencemos.

1. Una vez que te bajaste la libreria ProGuard, en la carpeta LIB encontraras los archivos:
  1. proguard.jar : esta es la libreria que hace el trabajo de optimizacion y ofuscacion ademas de otras cosillas.
  2. proguardgui.jar : esta aplicación nos sirve para utilizar la libreria de una manera grafica (GUI)
  3. retrace.jar : esta libreria hace lo opuesto a proguard.jar
En el resto de las carpetas puedes encontrar un manual (ingles) asi como algunos ejemplos.

2. Una vez que compilamos nuestra aplicacion desde netbeans u otro IDE, copiamos el JAR a una carpeta del disco duro para poder trabajar mejor.

Para poder apreciar mejor como funciona el ProGuard, nuestro proyecto de prueba, contiene adrede "lineas de codigo innecesarias" entre variables y metodos, podras verlas cuando abras el proyecto desde netbeans y analices el codigo.

3. Ejecutamos el archivo ProGuardgui.jar, este nos muestra una interfaz sencilla y bastante intuitiva

4. Presionamos el boton Input Output, esta opcion nos permite hacer dos cosas, elegir los archivos a optimizar/ofuscar y especificar sus salidas (parte superior), y dos nos permite especificar las libreiras que utilizamos en nuestro proyecto (parte inferior)
Cargamos nuestro JAR con el boton AddInput y escogemos el lugar  y el nombre donde lo guardaremos con AddOutput.... Como no utilizamos otras librerias ademas de las basicas de java, no tocamos las opciones de la parte inferior.

5. La opción que ahora nos toca es Shrinking (encoger) como se ve en la imagen aqui tenemos mas opciones cada quien experimenta para que sirve cada una.
Para este ejemplo, solamente habilitamos la opcion Print Usage que nos permite guardar en un archivo las lineas de codigo que seran eliminadas porque no las utilizamos en el proyecto, entonces escogemos el lugar donde guardar el archivo, para este ejemplo, llamado "eliminados.txt"

6. Ahora la opcion que nos toca es Obfuscation (Ofuscacion), lo mismo que lo anterior, tenemos varias opciones que nos permite "ofuscar" el proyecto de varias maneras
Para este ejemplo solo habilitamos la opcion Print Mapping, esto nos guardara un archivo con todos los detalles de como se "ofusco" el codigo java

7. En la opcion de Optimizacion, no realizaremos ningun cambio esta vez.

8. En la opcion de Information, se elige si se trata de una aplicacion para celular o no, tambien se especifica el tratamiento que tendran las lineas de codigo y los errores que se encuentren.
 
Para este ejemplo, dejamos todo como esta.

9. Finalmente nos toca la opcion Process, en esta opcion, tenemos tres alternativas
- View Configuration, presionando este boton podemos ver en codigo java la configuracion con la cual sera optimizado/ofuscado nuestro JAR
- Save Configuration, como su nombre lo dice nos permite Guardar una configuracion para poder utilizar en otro proyecto en cualquier momento y no realizar todos los pasos de nuevo
- Process, comienza el procesado del codigo...
 

Presionamos Process para terminar.

Dependiendo del tamaño de nuestra aplicación y de la PC que tengamos, se tardara un tiempo (no mucho) en procesar las lineas de codigo.
Como se ve en la captura, nuestro JAR llamado ProgdPrueba.jar, tenia un tamaño original de 15 kb, despues de optimizar/ofuscar con ProGuard, se redujo a un tamaño de 6 kb, ¡menos de la mitad! nada mal. Tambien podemos ver los archivos de texto que creamos para ver como se hizo todo el proceso.

Veremos ahora como estan las classes en el JAR, antes y despues de utilizar ProGuard

Abriendo los JAR con cualquier descompresor, podemos ver claramente las diferencias que existen entre uno y otro JAR

Podemos ver como ProGuard ofusco el codigo java dividiendolo en varias clases ademas de cambiando el nombre de los metodos y de las variables:
Por ejemplo nuestra clase Cesar.java tenias el siguiente aspecto:

01 package ProgdPrueba;
02 /**
03  * @web http://jc-mouse.blogspot.com/
04  * @author Mouse
05  */
06 public class cesar {
07     
08 private String tabla = "abcdefghijklmnopqrstuvwxy1234567890@.,;:-+*/=()[]{}";
09 private String cadena = "soy una cadena que no sirve para nada";
10 
11     public cesar(){         
12     }
13         
14     public String Encriptar(String t, int key){       
15         String texto = LimpiarCadena(t);
16         //aqui se almacena el resultado
17         String res = "";        
18         for(int i = 0; i < texto.length();i++)
19         {
20             //busca la posicion del caracter en la variable tabla
21             int pos = tabla.indexOf(texto.charAt(i));
22             //realiza el reemplazo
23             if ((pos + key) < tabla.length()){
24                 res = res + tabla.charAt(pos+key);
25             }
26             else
27             {
28                 res = res + tabla.charAt((pos+key) - tabla.length());
29             }         
30         }        
31         return res;
32     }
33     
34     public String Desencriptar(String t, int key){        
35         String texto = LimpiarCadena(t);
36         String res = "";        
37         for(int i = 0; i < texto.length();i++)
38         {            
39             int pos = tabla.indexOf(texto.charAt(i));            
40             if ((pos - key) < 0){
41                 res = res + tabla.charAt((pos-key) + tabla.length());
42             }
43             else
44             {
45                 res = res + tabla.charAt(pos-key);
46             }         
47         }        
48         return res;
49     }
50     
51     private String LimpiarCadena(String t){
52         //transforma el texto a minusculas        
53         t = t.toLowerCase();
54         //eliminamos todos los retornos de carro
55         t = t.replaceAll("\n", "");  
56         //eliminamos caracteres prohibidos
57         for(int i = 0; i < t.length();i++)
58         {
59             int pos = tabla.indexOf(t.charAt(i));
60             if (pos == -1){
61                 t = t.replace(t.charAt(i), ' ');
62             }
63         }        
64         return t;
65     }           
66     
67     private void SoyUnMetodoInutil(){
68         int i=0;
69         for(int j=0;j<=cadena.length();j++){
70             i = i + j;
71         }
72     }
73     
74 }


Despues de utilizar el ProGuard, decompilamos una de las clases (a.java) y podemos ver como quedo nuestro codigo, irreconocible. fue horrible fue horrible....


01 package ProgdPrueba;
02 
03 public final class a
04 {
05 
06     public a()
07     {
08         a = "abcdefghijklmnopqrstuvwxyz\341\351\355\363\372 1234567890@.,;:-+*/$#\277?!\241=()[]{}";
09     }
10 
11     public final String a(String s, int i)
12     {
13         s = a(s);
14         String s1 = "";
15         for(int j = 0; j < s.length(); j++)
16         {
17             int k;
18             if((k = a.indexOf(s.charAt(j))) + i < a.length())
19                 s1 = (new StringBuilder()).append(s1).append(a.charAt(k + i)).toString();
20             else
21                 s1 = (new StringBuilder()).append(s1).append(a.charAt((k + i) - a.length())).toString();
22         }
23 
24         return s1;
25     }
26 
27     public final String b(String s, int i)
28     {
29         s = a(s);
30         String s1 = "";
31         for(int j = 0; j < s.length(); j++)
32         {
33             int k;
34             if((k = a.indexOf(s.charAt(j))) - i < 0)
35                 s1 = (new StringBuilder()).append(s1).append(a.charAt((k - i) + a.length())).toString();
36             else
37                 s1 = (new StringBuilder()).append(s1).append(a.charAt(k - i)).toString();
38         }
39 
40         return s1;
41     }
42 
43     private String a(String s)
44     {
45         s = (s = s.toLowerCase()).replaceAll("\n", "");
46         for(int i = 0; i < s.length(); i++)
47         {
48             int j;
49             if((j = a.indexOf(s.charAt(i))) == -1)
50                 s = s.replace(s.charAt(i), ' ');
51         }
52 
53         return s;
54     }
55 
56     private String a;
57 }


Eso es todo, todos los archivos que utilizamos en este tutorial, esta en el siguiente enlace:
Click para descargar

continue reading

Post recomendado