martes, 24 de mayo de 2016

Algunos TIPS al programar en JAVA


Entiendo que como programadores o desarrolladores, tenemos ya nuestra pila de "Trucos y Tips" a la hora de programar, así como también solucionar o encontrar los "Errores", los catch, que no contemplamos o que simplemente no sabíamos que ocurrián.

Como ya mencioné, cada quien crea sus propios trucos con base a sus experiencias, pero no está de más saber trucos de alguien más:

Les presentaré una serie de trucos y métodos que son los más usuales que siempre se requieren a la hora de programar en JAVA.

1.- Siempre crear el paquete main o principal el cual inicie todo el programa



Desde mi punto de vista, éste es el tip más importante, además, de que es esencial en caso de querer crear el Jar al final. Como sabran, para poder crear un Jar, es necesario que solo exista un main en todo el software, por lo tanto al programar, crear una estructura parecida a la imagen de arriba.

La clase principal donde está el único main de todo el software, yo siempre la coloco en un paquete separado a todas las demás, también separo las clases de las interfaces gráficas, de los recursos, y de las imágenes.

De este modo es mucho más fácil el desarrollo, desde mi punto de vista claro.

Entonces, mi clase  principal donde está el único main, lo único que hará es crear y visualizar la primera interfaz Gráfica (JFrame), de todo el software, y de ahí parte todo lo demás.

Ejemplo de mi código en la clase principal donde contiene el main:

[...]
/*
 * Nombre de la clase: Principal
 * Descripción: esta clases es la principal, desde aquí se invocan a las demás
 *  interfaces para que inicie el programa completo.
 */
package gestionbasedatos;

import gestionbasedatos.interfaces.LoginBD;
import gestionbasedatos.interfaces.SplashScreen;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author m2 <linuxitos@gmail.com>
 */
public class Principal {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e){
            System.err.println("Error Look GUI: "+e.getMessage());
        }
        SplashScreen s=new SplashScreen();
        s.setVisible(true);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        s.dispose();
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                /*Aquí crean el objeto hacía su aplicación, para hacer visible*/
                LoginBD nuevaSesion = new LoginBD();
                nuevaSesion.setVisible(true);
            }
        });        
    }
    
}
[...]

2.-  Agregar javadoc a todos los métodos y clases

Esto no creo que sea solo un tip, sino una oligación de todo desarrollador;
En Java es sencillo, solo basta posicionarse sobre el método, presionar la tecla Alt+Enter y lo agrega automáticamente:

Ejemplo:

[...]
/**
     * Método que devuelve el valor de un campo espéficico que se le indique lo retorna como string
     * si la consulta cuenta con muchas filas, se quedará con el último valor
     * @param rel
     * @param campo
     * @return String
     * @throw SQLException.
    */
    public String obtenerCampo(ResultSet rel, String campo){
       String valCampo =new String();
       try{
            while(rel.next()){ 
                valCampo=rel.getString(campo);
            }
        } catch (SQLException ex) {
            System.out.println("Error: "+ex.getMessage());
        }
        return valCampo;
    }
[...]

Si no quieren, escribir toda la documentación o comentarios en un momento dado, entonces, solo agreguen lo más importante y después la terminan.

Documentar su código no solo los ayudará a ustedes cuando no se acuerden qué hace cada uno de los mil método que tienen en su código, sino que también ayudará a otros en caso de que desarronen en grupos.

También debo decir, que su código se verá más profesional, esto es de cada quien, pero es una excelente prática hacerlo.

3.- Evitar cerrar todo el  PROGRAMA al dar CLIC en la opción Cerrar de la Vetana:

Quizas no en todos los programas se requiera inahabilitar esta opción, pero algunos casos es importante preguntar al usuario si realmente desea cerrar o si simplemente no cerrar el programa sino que te regrese a otra ventana.

Para esto, yo utilizo el siguiente código:

//Se inhabilita que al presionar el botón cerar de la ventana salga del programa
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
//Se agrega de Listener para que éste detecte cuando se presione el botón 
//cerrar y ejecute otra accion, por ejemplo hacer visible una ventana anterior.
addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt) {
        //Acción a realizar contrario a salirse del programa
    }
});

4.- Crear métodos para reutilización


La idea es la siguiente: Supongamos que en el ejemplo anterior, se requiere regresar a una ventana anterior al presionar el botón cerrar de la ventana, pero también, hay que actualizar la información que se haya capturado en la ventana actual antes de cerrar. Además, tenemos un botón de "Cerrar", entonces, el código que se ejecutará en botón cerrar de la ventana, también se utilizará en el botón cerrar que agregamos nosotros, por ente, para no duplicar el mismo código, crear un método, y solo se invocaría el método en ambas opciones:

Ejemplo:

[...]
//Método creado
private void close(){
    consultas.cargarPacientesTablas(jtableInfoActFisica);
    consultas.actualizarDatosGenerales();
    regAModiExp.setVisible(true);
    this.dispose()
}
[...]
[...]
//Cuando se detecte clic en el botón de cerar ventana quedaría así
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt) {
       close();
    }
});
[...]

Y cuando se de clic en el botón cerrar que se agregó en la ventana quedaría aśi:
[...]
private void jbCerarActionPerformed(java.awt.event.ActionEvent evt) {
   close();
}
[...]

Y con eso se dismiyen las líneas de código, y se hace uso de la Reutilización.

5.- Centrar todas las ventanas al iniciar el programa:



Para lograr que las ventanas de todo nuestro Software a desarrollar se centre automáticamente, es necesario agregar lo siguiente:

[...]
initComponents();
setLocationRelativeTo(null); //esto hace que se centre de manera utomática
[...]
Es necesario agregarlo a cada JFrame que se cree. El orden también es necesario, ya que si no lo hacen en ese orden, les lanzará una excepción.

6.- Agregar ícono a nuestro Software


Muchos podrán decir que no es necesario, pero la personalización de un Software es lo que lo hace ser más llamativo, así que, para agregar el ícono yo utilizo el siguiente código:


[...]
initComponents();
/*Tiene que ser después de initiComponents*/
Image icon = Toolkit.getDefaultToolkit().getImage(getClass().getResource("../images/favicon.png"));
setIconImage(icon);
[...]

Obviamente es necesario crear el ícono previamente, guardarlo dentro del proyecto, y agregarlo a cada JFrame que se cree.

7.- Agregar ícono a nuestro Software

Izquierda utilizando el tema default de Java, Derecha adaptado al tema del SO.
Hacer que la interfaz se adapte al estilo de ventanas y botones del sistema en el que se ejectue el software y que no utilice el default de Java.

Para esto, yo agrego el siguiente código al inicio de donde inicia la ejecución del primer JFrame:


[...]
try{
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e){
    System.err.println("Error Look GUI: "+e.getMessage());
}
[...]

8.- En las excepciones agregar más información

Esto también lo recomiendo, pero es de cada quien de cómo encuentra sus errores en el código, sobre todo por las excepciones:

Lo que yo hago en cada error de una posible Excepción, es mostrar el con System.out.println("");, pero agregando el nombre del método en el que ocurra el error:

Ejemplo:


[...]
     /**
     * Método que realiza la desconexión con la BD.
     * @return boolean
     */
    public boolean desconectar(){
        boolean desconecta=false;
        try {
           conexion.close();
           desconecta=true;
           System.out.println("Clase conexión: desconexión exitosa");
        } catch (SQLException e) {
           System.out.println("Error en método desconectar: " + e.getMessage());
        }
        return desconecta;
    }
[...]

De esta manera me doy cuenta de dónde más o menos está el error.


Bueno, por ahora solo les dejo esos tips, espero y les sean de utilidad. Gracias por visitar.

jueves, 19 de mayo de 2016

Backdoor para descifrar contraseñas de BIOS de Laptops


A veces es necesario establecer una contraseña a la BIOS, ya sea por seguridad, para propar qué pasa etc., y es hasta cierto punto factible como seguridad, evitas que usuarios no autorizados puedan formatear el equipo enc aso de que te lo roben, pero qué ¿Pasa si olvidas dicha contraseña?

Pues bien, resulta que los fabricantes de los equipos más utilizados tienen un backdor "Puerta trasera" o más bien, como un algoritmo que permite obtener la contraseña olvidada.

El proceso es relativamente simple, no hay mucha complejidad en ello.

Lo explico a continuación:

Primero entrar al equipo desde el Bios, presionando F12, F2, ESC, o cualquiera que sea la combinación para su equipo, ahora con eso de que cada marca le ha puesto su propia tecla es complicado saberlos todo, y más aún, viene Microsoft con su famoso UEFI para acabarla, pero bueno.

Entramos al BIOS, y cuando solicite la contraseña, tecleamos tres veces erroneamente la misma, es decir, ecribimos  cualquier cosa, el punto es fallar tres veces.

Al haber escrito erróneamente las contraseñas, el sistema arrojará un número similar a esto:



Este número lo suben a esta página:




Una vez ahí, les lanzará unas frases posibles de las que haya descifrado:

Hora lo que harán es seleccionar una de ellas de acuerdo a la marca de su laptop e ingresarla como contraseña en la BIOS, para esto es necesario reiniciar el equipo de nuevo.

Si una de las frases arrojadas coincide, con eso han entrado a al BIOS, ahora que ya saben la contraseña, deciden si la cambian o la quitan.

Bueno, aquí les dejo una tabla con los secript y ejecutables de algunas marcas de laptops:



VendorHash EncodingExample of Hash Code/SerialScripts
Compaq5 decimal digits12345pwgen-5dec.py
Windows binary
Dellserial number1234567-595B
1234567-D35B
1234567-2A7B

Windows binary&source
Fujitsu-Siemens5 decimal digits12345pwgen-5dec.py
Windows binary
Fujitsu-Siemens8 hexadecimal digitsDEADBEEFpwgen-fsi-hex.py
Windows binary
Fujitsu-Siemens5x4 hexadecimal digitsAAAA-BBBB-CCCC-DEAD-BEEFpwgen-fsi-hex.py
Windows binary
Fujitsu-Siemens5x4 decimal digits1234-4321-1234-4321-1234pwgen-fsi-5x4dec.py
Windows binary
Hewlett-Packard5 decimal digits12345pwgen-5dec.py
Windows binary
Hewlett-Packard/Compaq Netbooks10 charactersCNU1234ABCpwgen-hpmini.py
Windows binary
Insyde H20 (generic)8 decimal digits03133610pwgen-insyde.py
Windows binary
Phoenix (generic)5 decimal digits12345pwgen-5dec.py
Windows binary
Sony7 digit serial number1234567pwgen-sony-serial.py
Windows binary
Samsung12 hexadecimal digits07088120410C0000pwgen-samsung.py
Windows binary
Obtenido de: http://dogber1.blogspot.mx/2009/05/table-of-reverse-engineered-bios.html

Nota: Esto puede que sea repetitivo, o que ya sea todo un cliché, sin embargo, yo no lo había necesitado, por eso hasta ahora me puse a investigar sobre ello, y encontré información en inglés, así que quise medio traducirla para los que aún no lo conocen.

Aclaro que hay otras opciones quizá, por ejemplo: desarmar la laptop desmontar la memoria rom, etc., pero no es necesario si funciona con esto. A mi ha servido en una HP, Samsung y Dell.

Debo aclarar algo, este método es exclusivo para la contraseña del BIOS, COSA QUE NO ES LO MISMO, QUE LA CONTRASEÑA DE UNLOCK SETUP, CONTRASEÑA DEL DISCO DURO, CONTRASEÑA DE CIFRADO, etc.

En las laptops actuales, sus respectivos fabricantes, ahora añaden más opciones de contraseñas, casi una contraseña para cada dispositivo, por ejemplo, DELL, te la opción del Unlock Setup, que es diferente a la contraseña del disco duro, y de la BIOS, entonces, éste MÉTODO ES EXCLUSIVO PARA DESCIFRAR LA CONTRASEÑA DE LA BIOS, ÚNICAMENTE DE LA BIOS, incluso habrá contraseñas que no se descifrarán.

CON MUCHA PENA TENDRÁN QUE DESARMARLA Y QUITARLE LA PILA INTERNA Y EXTERNA, PARA REINICIAR LA MEMORIA ROM.

miércoles, 18 de mayo de 2016

ClipGrap una alternatica a AtubeCactcher


ClipGrab es un software multiplataforma para descargar videos de sitios web populares como YouTube, Vimeo, Dailymotion o Metacafe. También ofrece la posibilidad de convertir los archivos descargados a otros formatos de archivo como MP3, MPEG4, OGG Theora o WMV. Es publicado como software libre bajo los términos de la versión 3 de la Licencia Pública General de GNU.

ClipGrab soporta oficialmente la descarga de un puñado de sitios web de video, entre los que se incluyen YouTube, Collegehumor, Dailymotion, Vimeo. Además el software provee una heuristica mediante la cual también puede descargar videos de sitios no soportados oficialmente. Cuando es posible, ClipGrab ofrece diferentes opciones de caliddad para un video. Así el usuario puede escoger entre descargar una versión en alta, estándar o baja definición del video. ClipGrab puede detectar automáticamente URIs compatibles cuando ellas son copiadas al portapapeles. El programa también ofrece una función de búsqueda integrada para YouTube. Ha sido elogiada especialmente por su interfaz limpia y fácil de utilizar. El sitio de software softoxi.com dice que "[ClipGrab] tiene una interfaz gráfica bellamente diseñada" y que "sobresale inmediatamente por su apariencia, diseño y rendimiento"

Este software lo pueden descargar desde:

En algunas distros GNU/Linux ya viene incluido en los repositorios, por lo tanto solo hay que instalarlo con los comandos oficiales de cada distro, en fedora es necesario instalar los repositorios de rpm fussion:

Fedora:
su -c 'dnf install http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'
sudo dnf -y install clipgrab

En el software incluso pueden buscar los vídeos desde ahí, descargarlos y convertilos directamente:

En  las opciones de descarga, podemos configurar la extensión del archivo, se puede configurar que detecte automáticamente el portapapeles.


--Eso es todo--

lunes, 16 de mayo de 2016

Desinstalar VMWare de Fedora 23-24

Imagen obtenidad: url
La desinstalación de VMWarea de Workstation es un poco diferente, uno pensaría que solo basta con ir a la directorio de instalación y ejecutar el script unistall como lo sería para otros instaladores no oficiales de Fedora, pero resulta que no es así.

El proceso es el siguiente:

Listar los productos instalados de VMWare
vmware-installer --list-products
Y mostrará algo parecido:

Product Name         Product Version     
==================== ====================
vmware-workstation   12.1.1.3770994 
Y ahora ejecutamos el comando con el producto seleccionado:
sudo vmware-installer  --uninstall-product vmware-workstation
 Seguir los pasos del  asistente de desintalador para finalizar.


Y eso sería todo.

VMWare y XAMPP/LAMPP utilizan el mismo puerto 443


Hace poco reinstalé VMWare en Fedora 23, casi no lo utilizo, a menos que requiera realizar alguna configuración de red bastante sofisticada, bueno, el punto es que lo acaba de reinstalar e iniciar 3 máquinas virtuales, para probar un sitio web que estaba desarrollando, pero resulta que al iniciar XAMPP éste no arrancó, entonces recordé que ya me había pasado, resulta que tanto XAMPP como VMWare, utilizan el puerto 443.

Lo que hice entonces es reconfigurar el puerto de escucha de VMWare, ya que es más fácil:
Primero iniciar la terminal y entrar en modo root:
su -
Una vez ahí iniciar vmware
# vmware
Y se inicia el VMWare:

Ir al menú Edit, Clic en Preferencias:

Se abrirá una ventana como la siguiente, y cambiar el puerto a otro, por ejemplo a 444.


Cerrar la ventana y reiniciar el servicio de vmware:
# service vmware restart
Si eso no funciona entonces reiniciar el equipo:
# reboot
Si deseas ver más información de los puertos activos usar los comandos:
$ sudo netstat -tulpn
$ sudo netstat -lptu 
$ sudo lsof -i

Y eso sería todo. Gracias por visitar y si tienen alguna otra opción, es bienvenida.