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; [...]

17/12/12

Herramientas on-line que no te deben faltar - parte 1

JAN29

SVG to HTML5 Canvas Converter
Esta herramienta te permite convertir imágenes vectoriales a su equivalente en canvas HTML5.
Solo debes pegar el código XML de los archivos SVG y al instante tendrás el código javascript para canvas, muy útil si trabajas con la nueva tecnologia de HTML5 y sus gráficos canvas.

Convertir imagen a SVG
Para complementar la herramienta anterior, tenemos un servicio también online y gratuito que te permite convertir imágenes JPG, PNG, etc  a imágenes vectoriales.
El equivalente en SVG a la imagen superior es:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="227.000000pt" height="222.000000pt" viewBox="0 0 227.000000 222.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.10, written by Peter Selinger 2001-2011
</metadata>
<g transform="translate(0.000000,222.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1095 2114 c-119 -18 -172 -32 -220 -59 -22 -13 -74 -31 -115 -41
-66 -15 -81 -23 -126 -68 -28 -28 -64 -70 -79 -93 -15 -23 -51 -60 -80 -82
-57 -43 -151 -164 -140 -180 3 -6 -4 -15 -15 -21 -11 -6 -21 -7 -21 -3 -1 4
-2 15 -3 23 0 8 -7 15 -15 15 -9 0 -19 -28 -31 -87 -10 -48 -21 -92 -26 -99
-4 -7 -11 -26 -15 -43 -5 -23 -7 -25 -8 -9 -2 34 -20 37 -32 6 -16 -41 -5
-583 14 -689 14 -75 65 -204 105 -264 9 -14 17 -32 18 -40 1 -8 5 -37 8 -65 3
-27 18 -83 32 -122 21 -57 31 -73 47 -73 23 0 21 16 -16 105 -44 104 -36 172
10 86 12 -24 32 -51 44 -58 36 -26 201 -105 206 -99 15 15 -15 39 -102 82 -82
41 -99 54 -111 84 -8 19 -30 51 -48 70 -24 24 -36 49 -41 80 -8 45 -48 197
-87 324 -20 65 -20 85 -15 295 7 242 20 333 59 404 24 44 65 60 92 37 20 -15
28 13 12 36 -12 16 -9 23 28 60 23 23 63 72 89 110 76 113 140 187 182 211 52
29 68 29 24 0 -25 -17 -47 -49 -85 -126 -53 -108 -87 -148 -135 -158 -16 -3
-29 -11 -29 -18 0 -14 42 -55 56 -55 5 0 27 22 47 49 20 26 66 74 102 106 44
39 74 76 93 114 30 62 59 76 92 46 10 -9 37 -61 60 -116 23 -54 48 -99 55 -99
26 0 24 46 -7 137 -27 81 -36 96 -69 118 -21 14 -49 25 -61 25 -22 1 -22 1 -4
12 27 15 283 -5 302 -24 2 -3 -5 -26 -16 -52 -44 -103 -34 -168 13 -88 l22 37
3 -42 c4 -56 21 -55 52 4 35 66 48 71 96 39 22 -14 55 -27 74 -29 30 -4 39
-12 75 -69 68 -111 103 -144 158 -151 48 -7 59 1 32 23 -22 18 -118 157 -143
205 -11 22 -25 60 -32 85 -21 78 -53 101 -172 121 l-77 13 -28 -31 c-27 -29
-30 -30 -83 -22 -30 4 -81 11 -113 15 -32 4 -60 10 -62 14 -8 12 188 52 285
57 l95 5 78 -51 c98 -65 180 -140 172 -159 -3 -8 8 -29 24 -47 18 -21 31 -49
35 -79 7 -46 21 -60 32 -31 8 19 74 -58 74 -86 0 -28 -8 -23 -23 14 -8 17 -21
38 -30 46 -14 11 -18 11 -23 -3 -4 -10 5 -33 22 -57 16 -23 37 -55 46 -71 28
-50 34 -52 56 -14 16 27 28 36 47 36 42 0 64 -64 71 -202 3 -62 12 -133 20
-157 16 -50 18 -91 2 -48 -12 34 -43 38 -34 5 31 -115 56 -358 56 -543 0 -135
-1 -145 -26 -189 -37 -65 -116 -318 -104 -330 7 -7 14 -6 21 1 9 9 96 212 134
313 50 134 58 202 28 219 -16 8 -18 31 -20 203 -5 416 -10 495 -41 598 -24 83
-65 180 -76 180 -2 0 -17 -7 -32 -15 -40 -21 -54 -19 -54 8 -1 73 -156 290
-279 389 -138 111 -192 123 -396 92z"/>
<path d="M1313 1664 c-56 -21 -129 -86 -157 -143 -27 -53 -52 -129 -44 -136 3
-3 27 7 54 22 45 26 57 28 159 28 119 0 217 -24 276 -67 16 -12 32 -19 35 -15
10 10 -56 199 -85 241 -47 71 -152 102 -238 70z m87 -51 c0 -42 69 -80 97 -52
7 7 16 2 30 -18 21 -32 55 -103 48 -103 -2 0 -37 7 -77 16 -85 18 -212 23
-281 11 -48 -8 -49 -8 -41 15 16 50 57 98 107 123 60 30 117 34 117 8z"/>
<path d="M644 1620 c-52 -12 -101 -48 -133 -97 -47 -71 -96 -213 -74 -213 6 0
30 18 54 40 24 22 60 45 79 50 58 16 169 11 230 -10 30 -11 58 -19 63 -20 12
0 8 21 -19 108 -34 107 -73 152 -130 151 -22 -1 -53 -4 -70 -9z m71 -61 c9
-17 31 -37 50 -44 21 -10 36 -25 43 -45 12 -34 15 -33 -61 -20 -68 13 -164 -1
-216 -31 -18 -11 -36 -17 -39 -15 -11 12 32 86 72 124 68 66 127 78 151 31z"/>
<path d="M1826 1428 c5 -91 4 -110 -16 -161 -51 -135 -180 -240 -371 -300
-349 -111 -806 -114 -994 -7 -61 35 -85 60 -119 125 -33 64 -34 130 -4 247 18
71 20 90 10 100 -18 18 -29 -2 -43 -86 -18 -110 -8 -232 24 -298 15 -31 26
-62 25 -69 -2 -7 11 -15 30 -20 51 -11 59 -25 24 -43 -33 -17 -48 -44 -29 -52
7 -2 27 2 43 11 16 8 44 15 62 15 28 0 32 -3 32 -26 0 -25 41 -76 70 -86 13
-4 12 -8 -3 -25 -9 -11 -17 -25 -17 -31 0 -22 18 -12 41 21 55 79 139 127 139
79 0 -10 6 -27 14 -38 13 -17 12 -23 -8 -59 -29 -50 -44 -109 -26 -103 7 2 20
23 29 46 9 23 26 51 37 63 20 19 22 20 38 3 16 -16 19 -15 51 2 31 16 37 17
49 4 13 -13 12 -22 -4 -70 -19 -55 -28 -210 -12 -210 4 0 13 42 20 93 15 107
42 171 82 192 27 14 29 13 35 -6 10 -31 29 -17 36 26 15 93 148 127 229 58 54
-45 135 -20 188 58 13 19 28 36 33 38 6 1 27 -16 49 -39 21 -22 40 -37 43 -33
9 14 -24 73 -51 91 l-24 15 24 13 c42 23 92 26 137 8 54 -21 65 -10 24 25 -18
15 -33 32 -33 37 0 6 14 23 31 40 76 71 142 203 143 284 1 52 -24 170 -36 170
-4 0 -5 -46 -2 -102z"/>
<path d="M799 1284 c-7 -8 -24 -21 -38 -28 -34 -17 -201 -20 -268 -5 -29 7
-56 9 -61 5 -13 -14 60 -64 110 -76 110 -27 288 36 288 102 0 22 -13 23 -31 2z"/>
<path d="M1142 1263 c2 -11 21 -24 49 -33 25 -9 54 -23 63 -33 43 -43 308 1
337 56 10 18 9 19 -12 13 -48 -15 -79 -18 -79 -8 0 7 -14 5 -37 -4 -29 -13
-57 -14 -142 -8 -58 4 -110 7 -114 6 -4 -1 -18 4 -30 13 -28 20 -39 19 -35 -2z"/>
</g>
</svg>

Esta página también tiene soporte para muchos otras opciones de conversión, no solo en imágenes, sino en audio (mp3, mp4, ogg, wav, etc) , documentos (Doc, Docx, Flash, Html, Pdf, etc) , video (Flv, Avi, wma, Ipad, Wii, xbox, mpg, ogg, etc) entre otras interesantes opciones como la encriptación Hash,

Eso es todo por hoy :)

continue reading

22/11/12

Test de penetración con BackTrack 5

JAN29



BackTrack 5 Wireless Penetration Testing

INDICE


  • Capitulo 1.- Wireless Lab Setup
  • Capitulo 2.- WLAN and Its Inherent Insecurities
  • Capitulo 3.- Bypassing WLAN Authentication
  • Capitulo 4.- WLAN Encryption Flaws
  • Capitulo 5.- Attacks on the WLAN Infrastructure
  • Capitulo 6.- Attacking the Client
  • Capitulo 7.- Advanced WLAN Attacks
  • Capitulo 8.- Attacking WPA-Enterprise and RADIUS
  • Capitulo 9.- WLAN Penetration Testing Methodology




Tamaño: 12 MB
Archivo: PDF
220 páginas
Idioma: Ingles

continue reading

12/11/12

Reconocimiento facial JS y HTML5

JAN29

JQuery Plugin Face Detection, escrito en javascript :) , permite utilizando el Canvas de HTML5 implementar un sistema de reconocimiento facial o.O muy fácilmente.

La instrucción no puede ser más sencilla :
var coords = $('#myPicture').faceDetection();
En la página del autor, un chino de esos bien frikis, puedes encontrar más información, su website es liuliu.me, así también existe un demo para que puedas jugar un poco con tus propias imágenes.

Para probar el plugin entra AQUI.
Si quieres el código fuente esta Github.
La pagina del chino capisimo liuliu.

o.O

continue reading

31/10/12

Dimask - El rostro perfecto

JAN29


El ser humano siempre a buscado la perfección, la simetría del cuerpo y claro esta del rostro, al parecer investigaciones llegan a la conclusión de que tener rostro simétrico equivaldría a tener un rostro bello y por ende esto otorgaría mayores ventajas a su poseedor en comparación a otras personas en busca del éxito .

A la mente humana le atrae las proporciones en armonía con el ratio de oro, que es 1,618, sus multiplos y submultiplos.  Las distancias entre los distintos elementos de nuestro cuerpo siguen un patrón. Conforme más cerca se encuentran nuestras medidas a ese patrón más bello era ese ser humano.

El doctor Stephen Marquardt, después de años de experiencia en el campo de la cirugía plástica y de una búsqueda formal de la belleza física, creó una máscara que aplicada sobre el rostro humano nos muestra las diferencias que existen entre la cara comparada y el supuesto rostro humano perfecto, esa mascara es "La Mascara de Dimitrios".

Florence Colgate una inglesa catalogada como la mujer mas hermosa de la tierra, no es millonaria, no es actriz ni cantante, pero si tiene algo muy particular, tiene el rostro simétrico.
Sean ciertas o no estas  investigaciones, ahora puedes comprobar si tu tienes un rostro perfecto con esta herramienta gratuita


continue reading

26/10/12

Problema Resuelto: Sumar columna de numeros

JAN29

Problema: El problema dice así, "Quiero sumar los números de una columna, los valores de las celdas se pueden modificar diatónicamente". Es todo o.O

Respuesta:

Para resolver este problema partimos de una interfaz básica, utilizamos el IDE Netbeans 6.9

Solo sumaremos números enteros. Para saber si se realizo o no algún cambio sobre el JTable debemos hacer uso de un listener, más propiamente de un TableModelListener,
Nuestro ejemplo estará compuesto de una columna de productos STRING y otra de cantidades INT
esta segunda columna es la que sumaremos. Cuando se cambie el valor de cualquier celda de la segunda columna, se hará uso de un método privado para recalcular el total, si por error se introduce un valor NO NUMÉRICO,  el valor, cualquiera que fuere sera reemplazado por un cero "0".

El código es:

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
/**
 * @web http://www.jc-mouse.net/
 * @author Mouse
 */
public class interfaz extends javax.swing.JFrame {

    //se inicia la tabla con algunos datos
    DefaultTableModel model = new DefaultTableModel(
           new Object[][] {
                { "Harina", "10" },
                { "Huevos", "21" },
                { "Chorizo", "53" },
                { "Leche", "4" },
                { "Pan", "34" },
                { "Mantequilla", "12" },
                },
      new Object[] { "Producto", "Cantidad" });

    /** Creates new form interfaz */
    public interfaz() {
        initComponents();

    suma();//primera suma del total 
    this.jTable1.setModel( model );
    //se añade a la tabla un Listener
    this.jTable1.getModel().addTableModelListener(new TableModelListener() {
      //cuando se produzca un cambio se ejecuta el codigo que coloquemos aqui dentro
      public void tableChanged(TableModelEvent e) {
          //sabemos que nuestros numeros se encuentra en la segunda columna iniciando de 0
          if( e.getColumn()==1 )//cuando se modifique un valor de la columna
              suma();//se ajusta el resultado
      }
    });
    }

    /** Metodo privado para la suma de cantidades */
    private void suma()
    {
        int total = 0;
        //recorrer todas las filas de la segunda columna y va sumando las cantidades
        for( int i=0 ; i<model.getRowCount() ; i++)
        {
            int numero =0;
            try{
                //capturamos valor de celda
                numero = Integer.valueOf( model.getValueAt(i, 1).toString() );
            }
            catch (NumberFormatException nfe){ //si existe un error se coloca 0 a la celda
                numero = 0;
                model.setValueAt(0, i, 1);
            }
            //se suma al total
            total += numero;
        }
        //muestra en el componente
        this.jTextField1.setText( String.valueOf(total) );
    }

Cuando ejecutemos tendremos como resultado:

Bájate el código AQUI

continue reading

4/9/12

Control de Stock en Java y MVC

JAN29


Un SGA "Sistema de Gestión de Almacenes"  es un programa informático destinado a gestionar las entradas y salidas de productos de un almacén, también es el encargado de gestionar todos los movimientos que se llevan a cabo dentro del almacén, maquinaria, trabajadores, etc . Proviene de la traducción del término inglés "WMS" (Warehouse Management System).

Un "control de stock" o "gestión de stock" como se prefiera llamarlo, es un sistema más simple, más reducido que un SGA, y nos sirve para  organizar, planificar y controlar el conjunto de stocks pertenecientes a una empresa.


En esta serie de 5 tutoriales construiremos un sistema de control de stock siguiendo el patrón de diseño MVC (Modelo, Vista y Controlador)



  1. Introducción y construcción de la base de datos
  2. Preparación del proyecto mvc en Netbeans
  3. Construcción de la VISTA
  4. Construcción del MODELO
  5. Construcción del CONTROLADOR


continue reading

9/8/12

Consultas y Parámetros con ADO.NET

JAN29

En este tutorial veremos la forma de crear una consulta con parámetros de entrada utilizando la tecnología de ADO.NET:

ADO.NET proporciona un puente entre los objetos creados en VB o C#  y la base de datos MySQL asociada a la aplicación, ademas proporciona una vista orientada a objetos de la base de datos a través de TablaAdapter para mediar entre los objetos y los componentes de la base de datos, que pueden ser tablas, consultas, procedimientos almacenados, vistas, funciones, etc.

Necesitamos:

Nuestra base de datos de prueba, se llama "dbtest" y esta conformado por una sola tabla "animales" la cual es:
-- 
-- Estructura de tabla para la tabla 'animal'
-- 

CREATE TABLE animal (
  id bigint(20) NOT NULL auto_increment,
  nombre varchar(64) NOT NULL,
  clase varchar(16) NOT NULL,
  PRIMARY KEY  (id)
);

-- 
-- Volcar la base de datos para la tabla 'animal'
-- 

INSERT INTO animal VALUES (1, 'Cocodrilo', 'reptil');
INSERT INTO animal VALUES (2, 'Tortuga', 'reptil');
INSERT INTO animal VALUES (3, 'León', 'mamifero');
INSERT INTO animal VALUES (4, 'Pinguino', 'ave');
INSERT INTO animal VALUES (5, 'Tigre', 'mamifero');
INSERT INTO animal VALUES (6, 'Mono', 'mamifero');
INSERT INTO animal VALUES (7, 'Gato', 'mamifero');
INSERT INTO animal VALUES (8, 'Condor', 'ave');
INSERT INTO animal VALUES (9, 'mi perro', 'ET');
INSERT INTO animal VALUES (10, 'El gato del vecino', 'El diablo');

Comencemos.

1. Crea un nuevo proyecto en VS

2. Añade un nuevo origen de datos, importante ESTE ORIGEN DE DATOS DEBE ESTAR VACÍO. (ver tutorial anterior).

3. Con el DataSource abierto, clic derecho y elegir ADD -> TABLEADAPTER
4. Utilizando la conexión creada en el paso 1, presionamos NEXT y elegimos la opción USE SQL STATEMENTS -> NEXT

5. En la siguiente ventana podemos escribir directamente la consulta SQL o hacer uso del Query Builder, en este ejemplo haremos uso de lo segundo. Con el Query Builder abierto formamos la consulta SQL y para indicar que se hará uso de un parámetro de entrada debemos escribir en la condición WHERE la sentencia @parametro donde @ indica a VS que es un parámetro de entrada, para confirmar si la consulta esta bien hecha, puedes probar haciendo clic en "Execute Query", después OK para terminar
6. volvemos a la ventana anterior donde ya estará escrita nuestra consulta SQL y presionamos NEXT.
En la ventana "Choose Methods to Generate", habilita la primera opción "Filla Data Table" y dale un nombre, por ejemplo "Obtener_Animal", entonces NEXT y FINISH

7. En nuestro DataSource se creara un nuevo TableAdapter como en la imagen siguiente:
8. Selecciona la pestaña del Form1, entonces en la ventana de DataSource, en el DataSet elige la opción DataGridView y entonces arrastra hacia el formulario
9. Se añade entonces al formulario los controles necesarios para manejar la consulta, como hacemos uso de un parámetro de entrada, se añade también controles para su utilización.

10. Ejecuta y ya podrás realizar una consulta a la base de datos :-D
enjoy!!!

continue reading

25/7/12

Agenda Personal Portable Gratis

JAN29



Completa agenda para organizar tu vida personal y/o profesional, si te olvidas de acontecimientos familiares, citas de trabajo, salir con el/la novi@ o simplemente quieres ir al cine con los amigos, ahora con esta útil herramienta, podras crear y tener a la vista una actividad pendiente en todo momento, ademas de que esta agenda cuenta con una alarma que te informara cada cierto tiempo de que cita tienes cerca. Khipu tambien cuenta con una pequeña agenda de contactos.

Ademas esta agenda es completamente portable por lo que podras llevarla y ejecutarla desde tu memoria USB en cualquier pc que tenga la Maquina Virtual Java. No te preocupes porque esta agenda es fácil de utilizar con interfaz muy intuitiva y en español. ¿Qué más se puede pedir?
  • Requiere: Maquina Virtual Java
  • Portable: Si
  • Ocupa: 6.4 MB
  • Funciona en Sistema Operativo: WinXP/2000/NT/Vista/7
  • Licencia: Freeware
  • Idioma: Español
Más información en la página del autor jc-Mouse

Enlace de descarga directa Khipu Agenda Personal Free Edition

continue reading

7/7/12

Creación y uso de Javadoc con Netbeans

JAN29

Javadoc es un paquete de desarrollo de java que nos genera documentación sobre nuestro proyecto de cada una de nuestras clases en una jerarquía de árbol.

Su uso es recomendable para todo proyecto, incluido los proyectos pequeños porque nos ayuda a tener siempre un código bien documentado, el único contra que tiene su uso, es que es muy tedioso documentar cada paso que se da al escribir el código (en general por los programadores flojos como yo), por lo demás, es una buena regla de programación.

Javadoc funciona por medio de MARCAS que le ayudan al API reconocer las partes que queremos  documentar y crear los archivos HTML.



@author - El nombre del autor del proyecto por ejemplo pepito :)
@version - La versión del proyecto
@see - Añade una referencia a una clase, método o enlace web
@param - Nombre de parámetro utilizado en un método incluido su significado
@return - El resultado de un método incluido su descripción
@exception - Nombre de la excepción mas una descripción
@throws - Nombre de la excepción mas una descripción
@deprecated - Añade una alerta al usuario de que el método que sigue a continuación ya no debe usarse y que será eliminado en versiones posteriores.


Al escribir los comentarios también podemos hacer uso de algunas etiquetas HTML para decorar un poco más nuestra documentación.


Para indicarle a Javadoc que queremos incluir documentación, debemos comenzar los comentarios de la siguiente manera:

/**
* Esto para Javadoc
*/


Veamos su uso con un ejemplo.


Creamos una clase llamada "Clase_java" y en el encabezado colocamos el autor de la clase, la instrucción @see con un enlace a una página web, también podemos agregar la versión de la clase:

/**
 * @author Mouse
 * @see <a href="http://www.jc-mouse.net">http://www.jc-mouse.net</a>
 * @version 1.2 07 de Mayo de 2013
 */
public class Clase_Java {
...
}
También podemos documentar las variables que hacen parte de nuestro código
/**
 * Variable privada: Nombre del autor
 */
private final String Autor = "jc Mouse";

/**
 * Variable publica: Una frase para reflexionar
 */
public String Frase_del_dia = "Carpe diem";

Cuando se haga uso de estas variables comentadas, en el editor de Netbeans podremos ver algo como esto:
No debemos olvidar tambien comentar e constructor de clase
/**
 * Constructor de clase     
 */
public Clase_Java(){
...
}
Cuando creamos un método es recomendable documentar los parámetros de entrada, si es que los tuviera, y si este método retorna algún resultado, utilizar la marca @return, si por el contrario el método es de la forma VOID, no se usa nada. Así también para las excepciones que puedan ocurrir se usa @exception. En la descripción del método, se puede incluir un ejemplo de uso encerrado en las etiquetas PRE, por ejemplo:
    /**
     * Método que convierte una cadena de la forma "yyyy-MM-dd HH:mm" a Date
     * <PRE> Clase_Java cj = new Clase_Java();
     * Date date = cj.StringToDate("2012-10-01 12:00")</PRE>
     * @param value String que debe tener la forma "yyyy-MM-dd HH:mm"
     * @return Date Un objeto Date con la fecha parseada
     * @exception ParseException Error de parseo, ocurre cuando no se puede convertir un String a Date          
     * @since incluido desde la version 1.0
     */
    public Date StringToDate( String value )
    {
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         try {
            date = (java.util.Date) formatter.parse( value );
        } catch (ParseException ex) {
            System.err.println( ex.getMessage() );
        }
        return date;
    }
Cuando utilicemos este método, podremos ver que Netbeans nos despliega toda la información en cuando se hace referencia al nombre StringToDate.
Cuando tenemos varias versiones de un proyecto y vamos actualizando los metodos, antes de eliminar los métodos que ya no se harán uso, es preferible, primero alertar al usuario que ciertas funciones dejaran de existir en versiones posteriores, para esto, en la descripción se añade la marca @deprecated, y la marca @see, que hace referencia a la función de reemplazo, es decir, supongamos que en una primera versión tenemos un método llamado Suma pero que en una nueva versión se decide crear una nueva versión suma_enteros, entonces lo que debemos hacer es añadir en la documentación de Suma, la alerta de que esta función ya no se utilizara más y que es mejor usar la nueva función suma_enteros, es decir:
/**
     * Metodo que suma dos enteros y retorna el resultado, gran cosa no :)
     * @param a Número Entero
     * @param b Número Entero
     * @return int Un entero que es el resultado de a + b
     * @deprecated No se aconseja su uso
     * @see suma_enteros( int, int )
     */
    public int Suma( int a , int b)
    {
        return a + b;
    }

    /**
     * Metodo que suma dos enteros positivos y retorna el resultado
     * @param a Número Entero
     * @param b Número Entero
     * @return int Un entero que es el resultado de a + b, si los numeros son negativos, retorna cero.
     */
    public int suma_enteros( int a, int b)
    {
        int resultado = 0;
        if( a>0 && b>0)
            resultado = a + b;
        return resultado;
    }
Ahora, cuando se haga uso del método Suma, este nos aparecerá con un subrayado y con la alerta correspondiente:
El código completo de la clase es:
package jcdoc;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author Mouse
 * @see <a href="http://www.jc-mouse.net">http://www.jc-mouse.net</a>
 * @version 1.2 07 de Mayo de 2013
 */
public class Clase_Java {

    /**
     * Variable privada: Nombre del autor
     */
    private final String Autor = "jc Mouse";
    /**
     * Variable publica: Una frase para reflexionar
     */
    public String Frase_del_dia = "Carpe diem";
    
    /**
     * Constructor de clase     
     */
    public Clase_Java(){
        System.out.println( this.Autor + " te aconseja '" + this.Frase_del_dia + "'" );              
    }

    /**
     * Método que convierte una cadena de la forma "yyyy-MM-dd HH:mm" a Date
     * <PRE> Clase_Java cj = new Clase_Java();
     * Date date = cj.StringToDate("2012-10-01 12:00")</PRE>
     * @param value String que debe tener la forma "yyyy-MM-dd HH:mm"
     * @return Date Un objeto Date con la fecha parseada
     * @exception ParseException Error de parseo, ocurre cuando no se puede convertir un String a Date          
     * @since incluido desde la version 1.0
     */
    public Date StringToDate( String value )
    {
        Date date = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         try {
            date = (java.util.Date) formatter.parse( value );
        } catch (ParseException ex) {
            System.err.println( ex.getMessage() );
        }
        return date;
    }

    /**
     * Metodo que suma dos enteros y retorna el resultado, gran cosa no :)
     * @param a Número Entero
     * @param b Número Entero
     * @return int Un entero que es el resultado de a + b
     * @deprecated No se aconseja su uso
     * @see suma_enteros( int, int )
     */
    public int Suma( int a , int b)
    {
        return a + b;
    }

    /**
     * Metodo que suma dos enteros positivos y retorna el resultado
     * @param a Número Entero
     * @param b Número Entero
     * @return int Un entero que es el resultado de a + b, si los numeros son negativos, retorna cero.
     */
    public int suma_enteros( int a, int b)
    {
        int resultado = 0;
        if( a>0 && b>0)
            resultado = a + b;
        return resultado;
    }

}

Para generar los HTML, vamos a Ejecutar -> Generar JavaDoc. y esperamos unos segundos a que nos genere todos los archivos.

Eso es todo :), bajate el proyecto utilizado en este tutorial AQUI

continue reading

14/6/12

Lectura y escritura de imagenes JPG en PostgreSQL

JAN29

En este tutorial veremos una forma para registrar archivos JPG en una base de datos PostgreSQL y recuperarlos para utilizarlos en controles Swing. Como vimos en un tutorial anterior a este donde utilizamos una base de datos MySQL, el procedimiento es prácticamente el mismo, claro con pequeñas diferencias.

Cuando se desea almacenar fisicamente el contenido de una imagen en una base de datos, este debe ser convertido a una cadena de bytes, para esto el campo donde se guardara la imagen debe ser del tipo BOOL en MySQL y para Postgres tenemos el tipo BYTEA, de esta manera podemos almacenar el contenido de un archivo JPG en la base de datos, ahora para recuperar el contenido de esta imagen y utilizarlo en nuestra aplicación, debemos procesar la cadena de bytes y convertirlo nuevamente en una imagen con la cual podamos trabajar.

Ver tutorial

continue reading

28/5/12

Crea tu lector Feed con Java

JAN29


En este tutorial se crea paso a paso un lector Feed utilizando el lenguaje Java y el IDE Netbeans, ademas se hace uso de la librería rome-1.0 y JDom, el lector es sencillo pero cuenta con una interfaz gráfica lo que hace de este proyecto bastante entretenido. Ve el video y enterate un poco más de lo que haremos en este tutorial.


"Una fuente web o canal web (en inglés web feed) es un medio de redifusión de contenido web. Se utiliza para suministrar información actualizada frecuentemente a sus suscriptores. En su jerga, cuando una página web "redifunde" su contenido mediante una fuente web, los internautas pueden "suscribirse" a ella para estar informados de sus novedades. Los interesados pueden usar un programa "agregador" para acceder a sus fuentes suscritas desde un mismo lugar.


Son muy utilizados en los blogs o bitácoras de Internet, así como en prensa electrónica. Cada día hay más medios que utilizan este sistema de redifusión web. La gran difusión de este tipo de servicio web ha estimulado el interés en otros sectores que comienzan a ver en las fuentes web una forma efectiva de difundir y compartir información empresarial."

Ver tutorial

continue reading

12/5/12

Cargar datos a un JTree desde una base de datos

JAN29

Problema: Se necesita cargar los datos de una base de datos hacia un JTree, la base de datos es de un país que tiene departamentos y los departamentos tienen provincias y las provincias, municipios, al hacer clic en un nodo, debe desplegar sus nodos hijos. Al realizar clic en un nodo, se debe desarrollar una acción.

Base de datos:
-- 
-- Base de datos: 'dbbolivia'
-- 
-- 
-- Estructura de tabla para la tabla 'departamento'
-- 
CREATE TABLE departamento (
  dep_id int(2) NOT NULL,
  dep_nombre varchar(32) NOT NULL,
  PRIMARY KEY  (dep_id)
);
-- 
-- Estructura de tabla para la tabla 'provincia'
-- 
CREATE TABLE provincia (
  prov_id int(2) NOT NULL auto_increment,
  prov_nombre varchar(32) NOT NULL,
  dep_id varchar(32) NOT NULL,
  PRIMARY KEY  (prov_id)
);
-- 
-- Estructura de tabla para la tabla 'municipio'
-- 
CREATE TABLE municipio (
  mun_id int(2) NOT NULL auto_increment,
  mun_nombre varchar(32) NOT NULL,
  prov_id int(2) NOT NULL,
  PRIMARY KEY  (mun_id)
);
Solución.
¿Qué necesitamos?

  • Netbeans
  • Servidor MySQL

Crear la base de datos y agregar algunos datos

1. Crear una proyecto netbeans, agregar un JFrame (interfaz.java) y agregar los siguientes controles:
2. Agregar también una clase (nombre:database.java) para inter actuar con la base de datos MySQL. el código de la clase es:
import java.sql.*;
/**
 * @web http://www.jc-mouse.net
 * @author Mouse
 */
public class database {
  /* DATOS PARA LA CONEXION */
  private String bd = "dbbolivia";
  private String login = "";//USUARIO
  private String password = "";//CONTRASEÑA
  private String url = "jdbc:mysql://localhost/"+bd;
  private Connection conn = null;
//___________________________________________________________________________________ Soy una barra separadora :)
   public database(){
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            System.out.println("OK base de datos "+bd+" listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
    }
//___________________________________________________________________________________ Soy una barra separadora :)
    public Connection getConnection()
    {
        return this.conn;
    }
//___________________________________________________________________________________ Soy una barra separadora :)
/* METODO PARA REALIZAR UNA CONSULTA A LA BASE DE DATOS
 * INPUT:
 *      table => nombre de la tabla donde se realizara la consulta, puede utilizarse tambien INNER JOIN
 *      fields => String con los nombres de los campos a devolver Ej.: campo1,campo2campo_n
 *      where => condicion para la consulta
 * OUTPUT: un object[][] con los datos resultantes, sino retorna NULL
 */
    public Object [][] select(String table, String fields, String where){
      int registros = 0;
      String colname[] = fields.split(",");

      //Consultas SQL
      String q ="SELECT " + fields + " FROM " + table;
      String q2 = "SELECT count(*) as total FROM " + table;
      if(where!=null)
      {
          q+= " WHERE " + where;
          q2+= " WHERE " + where;
      }
      //obtenemos la cantidad de registros existentes en la tabla
      try{
         PreparedStatement pstm = conn.prepareStatement(q2);
         ResultSet res = pstm.executeQuery();
         res.next();
         registros = res.getInt("total");
         res.close();
      }catch(SQLException e){
         System.out.println(e);
      }
    //se crea una matriz con tantas filas y columnas que necesite
    Object[][] data = new String[registros][fields.split(",").length];
    //realizamos la consulta sql y llenamos los datos en la matriz "Object"
      try{
         PreparedStatement pstm = conn.prepareStatement(q);
         ResultSet res = pstm.executeQuery();
         int i = 0;
         while(res.next()){
            for(int j=0; j<=fields.split(",").length-1;j++){
                data[i][j] = res.getString( colname[j].trim() );
            }
            i++;         }
         res.close();
          }catch(SQLException e){
         System.out.println(e);
    }
    return data;
 }
//___________________________________________________________________________________ Soy una barra separadora :)
}
Esta clase se conecta a la base de datos, también cuenta con una clase para realizar una consulta
3. Clase interfaz.java
- Las librerias que se utilizan son:
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
- Crear una instancia a la clase database.java:
private database db = new database();
- Implementar la clase database, así como el código para llenar el JTree en el constructor de la clase interfaz.java:

public interfaz() {
        initComponents();
        this.setTitle("JTree - http://www.jc-mouse.net/");

     //se crea la raiz
     DefaultMutableTreeNode pais = new DefaultMutableTreeNode("Bolivia");
     DefaultMutableTreeNode departamento;
     DefaultMutableTreeNode provincia;
     DefaultMutableTreeNode municipio;     

     //se obtienen los departamentos
     Object[][] data_dep =  db.select("departamento", " dep_id, dep_nombre", null);
     if( data_dep.length > 0)
     {
        for(int i=0; i < data_dep.length; i++)
        {
            //se crea hojas departamentos
            departamento = new DefaultMutableTreeNode(data_dep[i][1]);
            pais.add(departamento);
            //se obtiene las provincias
            Object[][] data_prov =  db.select("provincia", "prov_id,prov_nombre" , " dep_id='" + data_dep[i][0].toString()+"' ");
            if( data_prov.length > 0)
            {
                for(int j=0; j< data_prov.length; j++)
                {
                    provincia = new DefaultMutableTreeNode(data_prov[j][1]);
                    departamento.add(provincia);
                    //se obtienen los municipios
                    Object[][] data_mun =  db.select("municipio", "mun_id,mun_nombre" , " prov_id='" + data_dep[j][0].toString()+"' ");
                    if( data_mun.length > 0)
                    {
                        for(int k=0; k< data_mun.length; k++)
                        {
                            municipio = new DefaultMutableTreeNode(data_mun[k][1]);
                            provincia.add(municipio);
                        }
                    }
                }
            }
        }
     }

    
    DefaultTreeModel modelo = new DefaultTreeModel(pais);
    this.jTree1.setModel(modelo);

    jTree1.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {

        public void valueChanged(TreeSelectionEvent e) {
            // Se obtiene el Path seleccionado
            TreePath path = e.getPath();
     Object [] nodos = path.getPath();
            String txt= jTextArea1.getText() + "Path seleccionado: ";
            for (Object nodo: nodos)
                txt+=nodo.toString() + " | ";                
            txt+="\n";            
     // Se obtiene el Nodo seleccionado
            DefaultMutableTreeNode NodoSeleccionado = (DefaultMutableTreeNode)nodos[nodos.length-1];            
            txt+="-> Accion para Nodo Seleccionado [" + NodoSeleccionado.getUserObject().toString() + "]";
            txt+="\n";
     jTextArea1.setText(txt);
  }            
    });

    }

- Explicación: Se crea la raíz país (Bolivia), después se extrae los registros de la tabla departamentos y se añade a la raíz país, se extrae los registros provincias y se añade a su raíz departamento, se repite el proceso para municipios.

- Ejecutar

Descargar proyecto HERE

continue reading

Post recomendado