lunes, 26 de agosto de 2013

Ebooks gratis en español para descargar, primera parte





La Universidad Abierta de Catalunya pone a disposición documentos digitales de muy buena calidad, he leído varios y hoy quiero compartir con ustedes una lista con varios documentos en formato digital listos para ser descargados.

Espero les guste y los compartan con sus amigos.




  










Pagina 1,Pagina2



sábado, 17 de agosto de 2013

Expresiones regulares usando Java, parte I





Al programar, muchas veces nos vemos en la necesidad de validar si ciertas cadenas de textos cumplen o no con un patrón especifico, por ejemplo, saber si un texto esta compuesto en su totalidad por números, generalmente lo resolvemos de la siguiente forma:

public boolean esNumero(String cadena){
  try {
     Integer.parseInt(cadena);
     return true;
  } catch (Exception e) {
     return false;
  }
}

O tal vez así:

public boolean esNumero(String cadena){
    char numeros[] = {'1','2','3','4','5','6','7','8','9','0'};
    boolean bandera = true;
    for(char charCadena:cadena.toCharArray()){
        boolean banderaTemp = false;
        for(char charNumero:numeros){
            if(charCadena != charNumero){
            banderaTemp |= false;
        }else{
            banderaTemp |= true;
        }
    }
        bandera &= banderaTemp;
    }
    return bandera;
}

En otros casos necesitamos buscar fragmentos de textos en cadenas muchos más largas, por ejemplo, si estamos construyendo un editor de texto en java lo podemos hacer así:

public int buscarPosicionInicio(String cadenaABuscar,String cadenaDondeBuscar){
    int pos = cadenaDondeBuscar.indexOf(cadenaABuscar);
    if(pos == -1){
        System.out.println("El texto no fue encontrado");
    }
    return pos;
}

Admito que el código anterior pudo haber salido mas corto.

Para finalizar, muchas veces nos topamos con la necesitad de extraer textos o quizás remplazarlo de una cadenas más larga, estos dos últimos casos seria lo mismo, extraer un texto es equivalente a remplazarlo por una cadena vacía ("").

Los métodos que anteriormente escribí puede que sean de mucha utilidad, pero hay una técnica que nos facilita la resoluciones de problemas de este tipo y además nos agrega robustez a nuestros programas, dicha técnica hace uso de algo llamado Expresiones Regulares.

Hosting

EXPRESIONES REGULARES
En el área de la programación las expresiones regulares son un método por medio del cual se pueden realizar búsquedas dentro de cadenas de caracteres. Sin importar si la búsqueda requerida es de dos caracteres en una cadena de 10 o si es necesario encontrar todas las apariciones de un patrón definido de caracteres en un archivo de millones de caracteres, las expresiones regulares proporcionan una solución para el problema. Adicionalmente, un uso derivado de la búsqueda de patrones es la validación de un formato específico en una cadena de caracteres dada, como por ejemplo fechas o identificadores. Por Wikipedia

El uso de expresiones regulares no es nada difícil, basta con decir que en muchas ocasiones hacemos uso de ellas sin darnos cuenta, por ejemplo, si queremos referirnos a cualquier archivo de extensión jpg solemos expresarlo asi "*.jpg", si queremos buscar archivos de textos que empiecen con la letra "a" lo hacemos con la expresión "a*.txt"; lo anterior es una de las forma en que hacemos uso de las expresiones regulares en la informática, aunque poco a poco y según nuestras necesidades estas se harán más complejas, pero con práctica y dedicación lograremos comprenderlo y aplicarlo en nuestros proyectos.

Antes de empezar con ejemplos de expresiones regulares usando Java, sugiero descargar la aplicación kiki las cual esta disponible tanto para Windows como para Gnu/Linux, en mi caso particular solo hay que usar el Centro de software de Ubuntu y listo.

Captura de Kiki en acción

Anotaciones para usar kiki




Existen una seria de normas para construir de manera correcta nuestras expresiones regulares para java y estas las podemos ver recopiladas en la pagina oficial  de Oracle http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html, aunque están en ingles al traducirla se entiende muy bien; usaremos las más usadas que nos darán bases para posteriormente abarcar las demás.

[abc] Representa un carácter que puede
ser 'a' ó 'b' ó 'c'.
[^abc] Representa cualquier carácter
excepto 'a' y 'b' y 'c'; en este caso cuando digo cualquier caracter,
no me refiero solo a letras.
[a-z] Representa el rango comprendido
de la 'a' hasta la 'z', ojo no incluye 'ñ', vocales con tildes, ni
consonantes con diéresis, en pocas palabras solo se aceptan el alfabeto
ingles.
[a-zñ] Representa el rango comprendido
de la 'a' hasta la 'z', esta vez si incluye 'ñ', ojo solo incluye a la
'ñ', si queremos incluir más caracteres los colocamos al lado de la 'ñ'.
[A-Z] Representa el rango comprendido
de la 'A' hasta la 'Z', ojo no incluye 'ñ', solo el alfabeto ingles.
[a-zA-Z] Representa el rango comprendido
de la 'a' hasta la 'z' ó 'A' hasta la 'Z',pero solo el alfabeto ingles.
[a-d[m-p]] Es equivalente a [a-dm-p],
nótese que es parecido a la expresión anterior, representa el rango
comprendido de la 'a' hasta la 'b' y 'm' hasta la 'p', es decir solo
quedan incluidas 'a','b','c','d' y 'm','n','o','p'.
[a-z&&[def]] Es equivalente a [def], es la
intersección del conjunto de la 'a' hasta la 'z' y el conjunto
'd','e','f', el resultado es el mismo conjunto 'd','e','f'; aunque se
ve innecesario esta expresión  nos ayudara a comprender la que
sigue.
[a-z&&[^def]] Representa la intersección del
conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario
excepto los caracteres 'd','e','f', el resultado es el conjunto del
abecedario excluyendo 'd','e','f'.
[a-z&&[^m-p]] Representa la intersección del
conjunto de la 'a' hasta la 'z' y el conjunto todo el abecedario
excepto los caracteres 'm','n','o','p'.

Nota: Todas la expresiones descritas anteriormente solo representan un carácter.
Ahora veamos dos caracteres más que nos ayudaran a representar expresiones más largas, '*' y el '+'; el primero representa "cero o más" mientras el segundo "uno o más"; hagamos algunos ejemplos usando java para que sea mas fácil de entender.
Usaremos el siguiente código para evaluar nuestros ejercicios, y en la practica veremos lo útil que será usar expresiones regulares.




import java.util.regex.Pattern;

public class Ejemplo {
 
    public static void main(String[] args) {
        String expresionRegular = "[abc]";
        String cadenaAEvaluar = "a";
        boolean b = Pattern.matches(expresionRegular,cadenaAEvaluar);
        if(b){
            System.out.println("La expresion SI representa la cadena a evaluar");
        }else{
            System.out.println("La expresion NO representa la cadena a evaluar");
        }      
    }
}

Donde las variables expresionRegular y cadenaAEvaluar la modificaremos según el ejercicio.

Cuando:
expresionRegular = "[abc]";
cadenaAEvaluar = "a";
El resultado sera "La expresión SI representa la cadena a evaluar"
Sin embargo usamos otras letra distintas a 'a' ó 'b' ó 'c', ó mas de un carácter en cadenaAEvaluar, nos arrogara el resultado "La expresión NO representa la cadena a evaluar".


Cuando:
expresionRegular = "[0-1]";
cadenaAEvaluar = "a";
El resultado sera "La expresión NO representa la cadena a evaluar"
Para que la cadenaAEvaluar sea correcta, debemos introducir un numero, ejemplo "2"

Como ejercicio propongo que observemos los resultados con las demás expresiones.

Continuemos, ahora cabe la pregunta, ¿y si quiero evaluar mas de un carácter?
Recordemos el método isNumero propuesto al inicio, que nos dice si una cadena es un numero, usando expresiones regulares expresionRegular seria igual a "[0-9]+" que expresa una cadena 1 ó mas caracteres compuestos por números, el método quedaría más corto:

public boolean esNumero(String cadena){
        return Pattern.matches("[0-9]+",cadena);
}

Otro ejemplo, digamos que deseamos saber si una cadena esta compuesta por un numero y una palabra en minúsculas, separada con un punto, ejemplo "12345.holamundo"

Para los números de uno o más cifras ya sabemos que es "[0-9]+", para las letras minúsculas es muy similar "[a-z]+", la expresión resultante quedara de la siguiente forma "[0-9]+.[a-z]+"


 Es decir, cuando:
 expresionRegular = "[0-9]+.[a-z]+"
 cadenaAEvaluar = "12345.holamundo";
 El resultado sera "La expresión SI representa la cadena a evaluar"

Ya puedes ver todo lo que puedes hacer?, puedes construir tu expresiones regulares para validar Email, números de celular del tipo "310-234-5678", direcciones web, etc

Aquí termino ésta primera parte, espero sus comentario para mejorar.

Y como siempre esperando serles de utilidad.



martes, 30 de abril de 2013

Llenar y eliminar filas una tabla en java.






En java una tabla es un objeto de la clase Jtable, que nos permite dibujar tablas con sus respectivas filas y columnas semejantes a una hoja de calculo.

Las operaciones básica que podemos hace una tabla son: insertar columnas, insertar filas y eliminar filas.

Una forma muy sencilla de hacer las operaciones anteriormente descritas es usando algo llamado modelo,que no es más que los datos implícitos que maneja la tabla, las operaciones o modificaciones que hagamos en el modelo, se verán reflejados (dibujados) en la tabla.

Primero creamos nuestra tabla

private JTable tabla;
//o tambien asi
private javax.swing.JTable tabla;


Luego unicializamos nuestra tabla.
tabla = JTable(); 
//o tambien asi
tabla = new javax.swing.JTable();

Creamos nuestro modelo
DefaultTableModel modelo;

Inicializamos
modelo = new DefaultTableModel();


Vinculamos nuestro modelo a la tabla
tabla.setModel(modelo);


Hosting

Listo, ahora es solo cuestión de hacer operaciones sobre nuestros datos usando nuestro modelo, empezamos por agregar las columnas que necesitaremos durante la ejecución de nuestro programa.

modelo.addColumn("Id");
modelo.addColumn("Primer nombre");
modelo.addColumn("Segundo nombre");
modelo.addColumn("Primer apellido");
modelo.addColumn("Segundo apellido");
modelo.addColumn("Sexo");
modelo.addColumn("Direccion");
modelo.addColumn("Telefono");

Para agregar filas, primero crearemos un arreglo del tipo Object para ir almacenando nuestros datos que posteriormente adjuntaremos a nuestro modelo.


Object []object = new Object[8];
object[0] = jTextFieldId.getText();
object[1] = jTextFieldPNombre.getText(); 
object[2] = jTextFieldSNombre.getText(); 
object[3] = jTextFieldPApellido.getText(); 
object[4] = jTextFieldSApellido.getText(); 
object[5] = jComboBoxSexo.getSelectedItem(); 
object[6] = jTextFieldDireccion.getText(); 
object[7] = jTextFieldTelefono.getText(); 
        
modelo.addRow(object);

Otra forma de agregar datos a nuestra tabla usando el modelo es haciendo uso del método setValueAt de nuestro modelo donde debemos conocer previamente la fila y la columna donde se insertará el dato, así:

modelo.setValueAt(dato, fila, columna);
     
Para eliminar una fila de la tabla, solo necesitamos saber por medio de su posición dentro de las demás  filas,para eso usamos el método getSelectedRow() de la clase Jtable, luego mandamos por parámetros dicha posición al método removeRow de nuestro modelo, así:

modelo.removeRow(fila);

Para finalizar sugiero que agreguen más funcionalidades al programa, como por ejemplo.
- Poder eliminar varias filas.
- No permitir campos vacíos.
- No permitir id repetidas.

No olvides dejar tus comentarios.





domingo, 17 de marzo de 2013

Lista de Objetos usando Java.


Saludos a todos.

En ésta oportunidad escribiré acerca de una aplicación muy básica pero con conceptos que nos pueden ser de mucha en el aprendizaje de la programación en Java.

La idea básica de la aplicación es construir una clase llamada Persona, que contendrá propiedades y métodos propios de una persona del mundo real, con dicha clase construiremos objetos de personas y las iremos almacenando en una lista; además realizaremos dos operaciones con la lista, agregar y eliminar.

La apariencia final de la aplicación es ésta:


Para iniciar la clase Persona tendrá las siguientes propiedades:

    private String id;
    private String primerNombre;
    private String segundoNombre;
    private String primerApellido;
    private String segundoApellido;
    private String direccion;
    private String telefono;

Además por cada propiedad tendrá dos métodos que iniciaran con las palabra inglesa 'get' o 'set' respectivamente (no es obligatorio usar éstas palabras, pero es sugerido), para el caso de la propiedad 'id' quedaría así:

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

El método getId retorna el valor de la propiedad 'id' y setId permite asignarle un valor a la propiedad 'id'; a la práctica antes descrita se le conoce como encapsulamiento y lo que persigue es que no se puedan acceder a las propiedades de la clase directamente, sino haciendo uso de métodos.

Ubiquémonos en el cuerpo del método setId y encontramos la siguiente linea:
this.id = id;





Si observamos, podemos notar que dicho método recibe por parámetro una variable de tipo String llamada 'id', pero también tenemos una propiedad en la clase Persona con el mismo nombre; en caso de ser necesario podemos anteponer la palabra reservada this para dejar claro que hacemos referencia a la propiedad propia de la clase.

Una vez tengamos creada la clase Persona, ya podemos crear objetos de la misma, agrego que una clase no es lo mismo que un objeto; la clase en términos menos técnicos es como una plantilla que nos sirve de guía para construir objetos cada vez que los necesitemos; los objetos o también llamados instancias son una representación de los objetos del mundo real.

Para la construcción de objetos de la clase Persona usamos la palabra reservada new de la siguiente forma:

Persona persona1 = new Persona();
Persona persona2 = new Persona();
Persona persona3 = new Persona();
Persona persona4 = new Persona();

Ahora solo nos falta una lista para ir almacenando nuestras instancias, en java podemos hacerlo de muchas formas como por ejemplo:

Persona persona = new Persona();//creamos el objeto persona
ArrayList<Persona> arrayList = new ArrayList<Persona>();//creamos el objeto lista
arrayList.add(persona);//almacenamos la persona en la lista

Ademas tambien podemos usar arreglos, nos quedaría algo así:

Persona persona1 = new Persona();//creamos el objeto persona1
Persona persona2 = new Persona();//creamos el objeto persona2
Persona[] ListaPersonas = new Persona[100];//Creamos una arreglo para 100 personas
ListaPersonas[0] = persona1;//almacenamos la persona1 en la posicion 0
ListaPersonas[1] = persona2;//almacenamos la persona2 en la posicion 1





Pero no he usado ninguna de las anteriores formas para almacenas a los objetos 'persona', he preferido usar una lista del tipo DefaultListModel; la razón es que ésta lista es un modelo de otro objeto llamado Jlist que una vez los 'asociamos'  me permitirá visualizar informacion de cada persona en la lista, cada vez que agregue o elimine una persona de la lista automaticamente se verá el cambio en el Jlist, para el codigo nos quedará algo asi:

JList jListPersonas = new Jlist();//Creamos el objeto que nos visualizará las personas
DefaultListModel modelo = new DefaultListModel();//creamos la lista modelo
jListPersonas.setModel(modelo);//Asociamos la lista modelo a el objeto que nos visualizará las personas

Persona persona = new Persona();//creamos el objeto persona

persona.setId(“78076126”);//Llenamos datos con los métodos que inician con set
persona.setPrimerNombre(“rey”);
persona.setSegundoNombre(“fernando”);
persona.setPrimerApellido(“salcedo”);
persona.setSegundoApellido(“padilla”);
persona.setDireccion(“Kra 33A - #22a 17”);
persona.setTelefono(“77300000”);
        
modelo.addElement(persona);//Agregamos la persona a la lista

Reitero que los objetos de tipo persona que se agregue a la lista modelo seran visualizados automaticamente en la Gui del programa.

Algo que es de notar es el siguiente metodo de la clase Gui, donde hago uso de los métodos de la clase Persona que inician con 'get' que sirve para acceder a los valores de las propiedades de los objetos persona y que posteriormente mostraré en un JTextField.

private void llenarListaConPersona(Persona persona) {
        jTextFieldId.setText(persona.getId());
        jTextFieldPNombre.setText(persona.getPrimerNombre());
        jTextFieldSNombre.setText(persona.getSegundoNombre());
        jTextFieldPApellido.setText(persona.getPrimerApellido());
        jTextFieldSApellido.setText(persona.getSegundoApellido());
        jTextFieldDireccion.setText(persona.getDireccion());
        jTextFieldTelefono.setText(persona.getTelefono());





Sugerencias

- En la clase Persona sobreescribimos un método llamada toString que pertenece a la clase padre Object que retorna la propiedad 'id', cambie ésto de tal forma que éste método retorne el primer nombre de la persona y vea lo que pasa cuando usar el programa, investigue que pasó.

- En la clase Persona borre método toString ó meta dentro de comentario y vea lo que pasa cuando usar el programa, investigue que pasó.

- Modifique o agregue, para que el programa no permita campos vacíos.

- Modifique o agregue, para que el programa no permita id repetidas.

- Agregue un nuevo botón en la parte inferior derecha que permita eliminar a todas las personas de la lista.

Comente como resolvió las sugerencias, así podrá compartir su punto de vista y podrá observar como hicieron los demás.

Nota final; este ejemplo es solo una manera didáctica, pero al manejar grandes volúmenes de información por experiencia no sugiero ésta práctica, ya que consume muchos recursos y tendrá una aplicación lenta.





Como siempre esperando serles de utilidad.

lunes, 7 de enero de 2013

Operaciones sobre base de datos de Zoho (Reports)





Saludos,

Ya una vez hice un ejemplo de como usar la base de datos en la nube de Zoho para hacer consultas (click aqui), pero ademas de hacer consultas podemos insertar filas, modificarlar, eliminarlas y muchas cosas mas.






Toda la documentación esta disponible en sus pagina oficial (Click aqui).

Como siempre deseando serles de utilidad.




domingo, 25 de noviembre de 2012

Aprender a programar en java

Hosting

Saludos, ésto es un intento de mostrar una lista de documentos que nos servirá para iniciar en el mundo de la programación en Java, en la medida de lo posible agregaré algunas más que me hacen falta.

Acepto sugerencias por medio de comentarios.

                                       

Aprenda Java como si estuviera en primero - Tecnun
Java basico con ejemplos
Aprendiendo Java y Programación Orientada a Objetos
Material en html para aprender Java
Construcción de Software Java con Patrones de Diseño

Como programar en java






miércoles, 14 de noviembre de 2012

Búsqueda binaria en un arreglo usando Java


Saludos,




Antes de iniciar con la explicación  hagamos un ejercicio mental, imaginemos que un amigo desea que adivinemos un número que tiene en un papel anotado y que solo él conoce, antes que empecemos nos advierte que el número está comprendido del 0 al 100, y por último por cada intento que hagamos el nos dirá si el número es mayor, menor o igual al número que tiene anotado en el papel.

Digamos que el número secreto a adivinar es el 81.
Bueno si eres sistemático empezaras intentando con el 50.
[1,2,3,.......,58,59,50,51,52,.......,98,99,100]
Tu amigo te dirá que el número que deseas adivinar es mayor que 50.
A éste punto ya debes deducir que el número está entre el 51 y el 100.
Observa como ya no tienes que gastar intentos con los números comprendidos de 0 a 50.

Ahora intentemos con el 75.
[51,52,53,.......,73,74,75,76,77,.......,98,99,100]
Tu amigo te dirá que el número que deseas adivinar es mayor que el 75.
A éste punto ya debes deducir que el número está entre el 76 y el 100.
Observa como ya no tienes que gastar intentos con los números comprendidos de 0 a 75.

Ahora intentemos con el 87.
[76,77,78,.......,85,86,87,88,89,.......,98,99,100]
Tu amigo te dirá que el número que deseas adivinar es menor que el 87.
A éste punto ya debes deducir que el número está entre el 76 y el 86.
Observa como ya no tienes que gastar intentos con los números comprendidos de 0 a 75 y 87 a 100.

Ahora intentemos con el 81.
[76,77,78,79,80,81,82,83,84,85,86]
Tu amigo te dirá que has acertado.



Si te has fijado, la técnica para adivinar el número es dividiendo el rango en dos partes, si el número a adivinar es mayor tomamos el rango que nos ha quedado a la derecha sino si el número a adivinar es menor tomamos el rango que nos ha quedado a la izquierda sino si el número es igual al número a adivinar, bingo hemos adivinado; si la primera vez no adivinamos el número realizamos los pasos anteriores nuevamente hasta que adivinemos (asumiendo que el número a adivinar existe).

La técnica anteriormente descrita es análoga a la técnica para la búsqueda binaria.
Como podemos observar y asumiendo la analogía, uno de los requisitos para el algoritmo de búsqueda binaria es que los datos esten previamente ordenados.
Este algoritmo se utiliza cuando el vector en el que queremos determinar la existencia de un elemento está previamente ordenado. El algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente el número de iteraciones necesarias (wikipedia).

Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del array (normalmente el elemento central): si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del array que va desde el inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del array que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en todo el array (wikipedia).

He aquí el código que les ofrezco.




class BusquedaBinaria{
 /**
 * Busca un valor numerico dentro de un arreglo numerico...
 * previamente ordenado usando el metodo de busqueda binaria 
 * 
 * @param arreglo con los elementos; dato a buscar
 * @return posicion del elemento buscado, en caso de no existir retorna -1
    */
 public static int busquedaBinaria(int  vector[], int dato){
  int n = vector.length;
  int centro,inf=0,sup=n-1;
   while(inf<=sup){
     centro=(sup+inf)/2;
     if(vector[centro]==dato) return centro;
     else if(dato < vector [centro] ){
        sup=centro-1;
     }
     else {
       inf=centro+1;
     }
   }
   return -1;
 }

 public static void main(String []args){
  int[]vector ={1,4,7,8,9,14,23,47,56,60,61,63,65,66,68,69,70,73,76,77,79,80,82};
  int valorBuscado = 70;
  System.out.println(busquedaBinaria(vector,valorBuscado));
 }
}



Entrada destacada

Matriz de adyacencia para un grafo

"La matriz de adyacencia es una matriz cuadrada que se utiliza como una forma de representar relaciones binarias."; aunque pa...