Mar
09

Números Palindrómicos

En projecteuler.net se ofrece el siguiente problema:

Un número palindrómico se lee de la misma forma en ambos sentidos. El palíndromo más grande a partir del producto de dos números de 2 dígitos es 9009 = 91 x 99.

Encontrar el palíndromo más grande a partir del producto de dos números de 3 dígitos.

A continuación les planteo la solución original que yo hice antes de acertar a la respuesta y poder ver la solución que se plantea en la misma página una vez resuelto el problema!

public Set calcularPalindromosNumerico(Integer min, Integer max){
        Set <Integer>listaPalindromos = new HashSet<Integer>();
        for(int i = min; i <= max; i++ ){
            for(int j = min; j <= max; j++){
                Integer res = j*i;
                if(isPalindromo(res))
                    listaPalindromos.add(res);
            }
        }
        return listaPalindromos;
    }

Lo primero que cabe resaltar en el método anterior es que utilizamos una clase “Set” con el único propósito de no almacenar resultados repetidos (100*110 y 110*100 por ejemplo) [Recordamos que la clase Set no almacena datos duplicados]. Lo segundo que hay que notar es que el método recibe objetos envoltorio Integer. Esto es así ya que la lista que contendrá los números palindrómicos no estará ordenada y usaremos al método estático “sort” de la clase Arrays para ordenar dicho arreglo, pero para que lo anterior funcione, los elementos a ordenar deben implementar a la Interfaz Comparable según nos lo indica la documentación de la clase Arrays, así pues, los envoltorios de los tipos primitivos implementan a esta interfaz y es por ello que el método recibe objetos Integer en lugar de int.

Por último, creamos otro método que permita validar si un número es palindrómico.

public boolean isPalindromo(int numero){
        String palindromo = ReverseString.reverseIt(
                String.valueOf(numero));

        if(numero == Integer.parseInt(palindromo))
            return true;
        else
            return false;
    }

ReverseString es una clase que podemos encontrar aquí

Lo único que nos resta hacer es crear el método main que nos permita comprobar el resultado:

public static void main(String []args){
        Palindromo palindromo = new Palindromo();
        Object[] listaPalindromos = palindromo.calcularPalindromosNumerico
                                (100,999).toArray();

        Arrays.sort(listaPalindromos);
        for(Object i : listaPalindromos){
            System.out.println(i);
        }
    }

El 100 y 999 que se pasan como argumentos al método, esta claro que es el primero y último número de 3 cifras que existen!

De esta forma, obtenemos que el palíndromo más grande resultado de la multiplicación de dos números de tres cifras es: 906609

En la misma página de project euler , se proporciona un PDF con el algoritmo que da solución al problema! Pero este PDF solo lo podremos ver una vez que hayamos acertado a la respuesta!

Como complemento, para hallar números palindrómicos, existe el 196-Algorithm que pueden revisar como lectura adicional!

Saludos!!

Mar
07

DB4O: El poder de las Bases de Datos Orientadas a Objetos

DB40

Hace alrededor de 1 año, conocí a DB40, una Base de Datos Orientada a Objetos Open Source!… ¿Pero qué es DB4O? y sobre todo ¿para que me sirve si ya se utilizar MySQL, SQL Server, Oracle y otro manejador de Base de Datos Relacional?… Estas preguntas son las que trataré de responder a continuación.

¿Qué es DB4O?

Bien, como ya lo dije arriba, DB40 es una Base de Datos Orientada a Objetos de alto rendimiento. En algunos Benchmark realizados, DB4O muestra un rendimiento superior o similar a las Bases de Datos Relacionales, en el caso de Java, utilizando JDBC o algún Framework como Hibernate! Podemos ver estas pruebas en la página de polepos.org

¿Hibernate?… ¿Qué es eso?

Bien, si no sabes que es Hibernate te lo explicare a continuación!

Hibernate es una “herramienta” para Java (NHibernate es la versión para .NET) que nos permite poder conjuntar sin ningún problema al modelo Orientado a Objetos con el Relacional! Debes de saber que ambos modelos no son compatibles!

Pero yo he utilizado Java y MySQL… ¿Como no van a ser compatibles?

Es verdad, el paradigma Orientado a Objetos con el Modelo Relacional son incompatibles. No importa que tu hayas trabajado y desarrollado una aplicación que guarde datos en MySQL mediante Java, C# o algún otro lenguaje OO, en realidad lo único que has hecho, es escribir una simple sentencia SQL y enviarla al manejador de BD pero desde Java.

El hecho de enviar sentencias SQL a algún manejador de BD Relacional, no significa que sean compatibles!… Pero bueno, finalmente ¿A que me refiero cuando digo que son incompatibles?,.. pues bien, veámoslo con un ejemplo.

Persona ximena = new Persona("Ximena", "Rodriguez", 'F');
JDBC.save(ximena);

Si Java fuera compatible con MySQL/PostgreSQL/etc., el código anterior, indudablemente funcionaria! Es decir, sería posible guardar objetos! En lugar de eso, necesitamos utilizar variables escalares que contienen los valores que deseamos guardar, concatenarlas a otra cadena que tiene la sentencia SQL y finalmente enviarlas al manejador de Base de Datos mediante una alguna interfaz que comunique Java con  MySQL/PostgreSQL/etc., como lo es JDBC.

public void guardar(String nombre, String aPaterno, char sexo){
    stmt.executeUpdate(
                "INSERT INTO persona("nombre, paterno, sexo )" +
                    "VALUES(' "+nombre+', ' "+aPaterno+" ', ' "+sexo+" ')");
}

Y para recuperar datos, es lo mismo, debemos enviar una consulta SELECT * FROM y con el resultado que nos devuelve la BD, ir iterando sobre cada registro para guardar el valor en variables o en Listas.

Finalmente podemos ver el esfuerzo requerido para conectar los dos mundos;

import java.sql.*;

public class Jdbc10 {
  public static void main(String args[]){
    System.out.println(
                  "Copyright 2004, R.G.Baldwin");
    try {
      Statement stmt;
      ResultSet rs;

      //Register the JDBC driver for MySQL.
      Class.forName("com.mysql.jdbc.Driver");

      //Define URL of database server for
      // database named JunkDB on the localhost
      // with the default port number 3306.
      String url =
            "jdbc:mysql://localhost:3306/JunkDB";

      //Get a connection to the database for a
      // user named auser with the password
      // drowssap, which is password spelled
      // backwards.
      Connection con =
                     DriverManager.getConnection(
                        url,"auser", "drowssap");

      //Display URL and connection information
      System.out.println("URL: " + url);
      System.out.println("Connection: " + con);

      //Get a Statement object
      stmt = con.createStatement();

      //As a precaution, delete myTable if it
      // already exists as residue from a
      // previous run.  Otherwise, if the table
      // already exists and an attempt is made
      // to create it, an exception will be
      // thrown.
      try{
        stmt.executeUpdate("DROP TABLE myTable");
      }catch(Exception e){
        System.out.print(e);
        System.out.println(
                  "No existing table to delete");
      }//end catch

      //Create a table in the database named
      // myTable.
      stmt.executeUpdate(
            "CREATE TABLE myTable(test_id int," +
                  "test_val char(15) not null)");

      //Insert some values into the table
      stmt.executeUpdate(
                "INSERT INTO myTable(test_id, " +
                    "test_val) VALUES(1,'One')");
      stmt.executeUpdate(
                "INSERT INTO myTable(test_id, " +
                    "test_val) VALUES(2,'Two')");
      stmt.executeUpdate(
                "INSERT INTO myTable(test_id, " +
                  "test_val) VALUES(3,'Three')");
      stmt.executeUpdate(
                "INSERT INTO myTable(test_id, " +
                   "test_val) VALUES(4,'Four')");
      stmt.executeUpdate(
                "INSERT INTO myTable(test_id, " +
                   "test_val) VALUES(5,'Five')");

      //Get another statement object initialized
      // as shown.
      stmt = con.createStatement(
               ResultSet.TYPE_SCROLL_INSENSITIVE,
                     ResultSet.CONCUR_READ_ONLY);

      //Query the database, storing the result
      // in an object of type ResultSet
      rs = stmt.executeQuery("SELECT * " +
                "from myTable ORDER BY test_id");

      //Use the methods of class ResultSet in a
      // loop to display all of the data in the
      // database.
      System.out.println("Display all results:");
      while(rs.next()){
        int theInt= rs.getInt("test_id");
        String str = rs.getString("test_val");
        System.out.println("\ttest_id= " + theInt
                             + "\tstr = " + str);
      }//end while loop

      //Display the data in a specific row using
      // the rs.absolute method.
      System.out.println(
                        "Display row number 2:");
      if( rs.absolute(2) ){
        int theInt= rs.getInt("test_id");
        String str = rs.getString("test_val");
        System.out.println("\ttest_id= " + theInt
                             + "\tstr = " + str);
      }//end if

      //Delete the table and close the connection
      // to the database
      stmt.executeUpdate("DROP TABLE myTable");
      con.close();
    }catch( Exception e ) {
      e.printStackTrace();
    }//end catch
  }//end main
}//end class Jdbc10
Código fuente: Using JDBC with MySQL, Getting Started

Con DB4O es tan sencillo conectar a la BD como hacer lo siguiente:

// Crear una base si no existe, abrirla si ya existe.
     File file = new File("testDb4o.yap");
     String fullPath = file.getAbsolutePath();
     ObjectContainer db = Db4oFactory.openFile(file);
     try{
           // realizar alguna acción con db4o
           // Ejemplos :
           db.set(obj);		// Almacena un objeto en la base
           db.commit();	      // Realizar la transacción (y arrancar otra)
           db.delete(obj);   // Eliminar un objeto en la base
     }
     finally{
           db.close();         // Cerrar la base y liberar los recursos
}

Existe abundante documentación en ingles y en español sobre el uso de DB4O con Java y C#, al bajar DB4O de la página oficial, encontraremos en dicha carpeta, un completo tutorial en español sobre su uso, además de una guía de referencia! De igual forma, existe un libro “The definitive guide to db4o” que aunque no es la versión actual, sin duda es un excelente comienzo para iniciarse en esta fantástica BD.

Finalmente… Dijiste que Hibernate conjunta los dos mundos, ¿Como lo hace? y si ya lo hace, ¿Para que usar DB4O?

Bueno, Hibernate utiliza archivos XML para “mapear” clases Java con columnas de una Tabla Relacional y mediante este mapeo, es posible hacer algo similar al código que vimos para guardar objetos en DB4O, pero la diferencia es que Hibernate internamente se encargará de hacer dicho “mapeo” por nosotros e insertar en las columnas de la Tabla Relacional! A cambio de esta comodidad de utilizar Java y MYSQL/SQL Server/etc., Hibernate disminuye el rendimiento de la aplicación!

Es causa de mucha polémica decir si DB4O es o no es la opción idónea para aplicaciones empresariales de gran escala, por lo mismo que las Bases de Datos Orientadas a Objetos no tienen un fuerte sustento matemático como si lo tienen las Relacionales, su penetración no ha sido tan fuerte! Por lo anterior, la industria del Software no ha querido experimentar en ambientes reales de gran escala la potencia de DB4O.

Independientemente de lo anterior, DB4O es la mejor opción para aquellos desarrolladores Freelance que desarrollan aplicaciones de escritorio o incluso web que no requieren de almacenar millones de datos!

Algunos recursos sobre el uso de DB4O son:

Mar
07

Project Euler: Matemáticas y Programación

Project Euler es una página que consta de más de 200 problemas matemáticos, que por su dificultad en el número de operaciones y cálculos, no son posibles de resolver sin la ayuda de la programación!

Hace 2 días recién me inscribí, así que al día de escribir esta entrada, solo llevo 5 ejercicios resueltos! Desde luego que he iniciado con los más fáciles!

Lo interesante de esto es que para entrar a un nivel “novice” debes tener entre 100 a 149 problemas resueltos! De lo contrario, estarías en el nivel 1 o 2 los cuales no son tan válidos, ya que si en un lapso de 60 días no resuelves ningún problema, desapareces del record! El nivel 3 es el nivel “novice” y en este nivel es cuando ya puedes quedar inmortalizado en el score sin importar el tiempo que ha pasado desde la última vez que resolviste un problema!

Para muestra del tipo de ejercicios, he aquí el primero que resolví el cual es un verdadero regalo!

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.

public class Multiplo {
    public int sumarMultiplos(int rango, int numeroUno, int numeroDos){
        int suma = 0;
        for(int i = 1; i<rango ; i++){
            if( (i%numeroUno) == 0 || (i%numeroDos) == 0){
                suma = suma + i;
            }
        }
        return suma;
    }
    public static void main(String []args){
        Multiplo m = new Multiplo();
        int suma = m.sumarMultiplos(1000, 3,5);
        System.out.println("La suma es: "+suma);
    }
}

Como ven, se trata de un problema bastante sencillo! Estaré poniendo en este blog todos los problemas que vaya resolviendo! Aunque solo lo hago cuando tengo por ahí un tiempo libre!

Saludos!!

Feb
27

Serializar objetos a XML

Mediante XStream podemos crear de manera extremadamente fácil un XML. En este ejemplo, aprenderemos la manera de hacerlo, para ello descarguemos la distribución binaria de la página oficial.-

HERRAMIENTAS

  • Equipo portatil Acer Aspire, Intel Celeron 1.86 Ghz, 1 GB RAM
  • Mandriva 2009, KDE 4
  • XStream 1.3.1
  • Eclipse 3.4.2-

DESARROLLO

Antes que nada, debemos agregar las librerias XStream a nuesro entorno de desarrollo, ya sea Eclipse, NetBeans o cualquier otro. En este enlace puedes ver como agregar librerias a eclipse. Las librerias que agregaremos para este ejemplo serán “xstream-1.3.1.jar”  y “xpp3_min-1.1.4c.jar”.

Posteriormente creamos un proyecto Dynamic Web. Creamos una clase Java llamada “Direccion” y posteriormente otra llamada “Persona” dentro del paquete “beans”.

package beans;

public class Direccion {

 private String calle;
 private String colonia;
 private String municipio;
 private String estado;
 private int cp;

}
package beans;

import java.util.ArrayList;

public class Persona {

private String nombre;
private String apaterno;
private String amaterno;
private ArrayList direccion;

}

Finalmente encapsulamos todos atributos en sus métodos setter y getter, seleccionando los atributos y dando click derecho sobre la selección para escoger la opción de “Source–Generate Getters and Setters”.

Ahora crearemos una clase llamada TestXML dentro del paquete test, y copiaremos el siguiente código:

public class TestXML {

public static void main(String args[])
{
Direccion direccion = new Direccion(
"Aqui la calle","Aqui la colonia","Aqui municipio",
"Aqui el estado", 12345);

Persona persona = new Persona(
"Ascari", "Romo", "Pedraza", direccion);

XStream stream = new XStream();
stream.alias("persona", Persona.class);

String xml = stream.toXML(persona);
System.out.print(xml);

}

Como ven es muy fácil, ahora más interesante será obtener los datos de un manejador de BD, crear el XML como ya se explico y enviarlo a la capa de presentación en Flex para su visualización.


Saludos!!

Nov
17

Diferencia entre Flash, Flex, Flash Player y AIR

Introducción

Tanto Flash como Flex pueden ser utilizados para crear aplicaciones web y animaciones. Flash Player es el entorno de ejecución para correr aplicaciones sobre la web y AIR es el entorno de ejecución para correr aplicaciones sobre el escritorio. Esto último podemos considerarlo como un símil a lo que es la JRE para Java, es decir, Flash Player y AIR son requeridos para ejecutar aplicaciones Flash/Flex, mientras que Flash y Flex Framework son el conjunto de herramientas necesarias para crear dichas aplicaciones.

Si Flash y Flex tienen el mismo propósito, ¿Cuál es la diferencia?

Históricamente hemos considerado a Flash como la herramienta por excelencia para construir desde sencillas animaciones, vistosas páginas web interactivas, hasta complejas peliculas de dibujos animados que han visto su mercado en el Cine. Sin embargo, los que han sido fieles a Flash desde sus inicios, han utilizado a Flash no solo para la creación de animaciones, sino también para desarrollar Aplicaciones Ricas para Internet, aunque para la mayoría de los desarrolladores consideran más a Flash como una herramienta de animación para diseñadores y no para programadores.

Lo anterior es el punto de partida para comprender la diferencia. Muchos desarrolladores no consideraban “cómodo” utilizar las herramientas de dibujo, la línea del tiempo y los paneles visuales de Flash para crear formularios y otros elementos visuales que son comunes para las aplicaciones web. Fue por esto que Adobe Flex vio la luz hace algunos años. Adobe pensó que si ya tenían algo dirigido principalmente a diseñadores (Flash), sería bueno brindar a los desarrolladores algo más acorde a sus necesidades, pero que a la vez tuvieran como base un mismo entorno de ejecución(Flash Player) pues a fin de cuentas con Flash era posible crear tanto aplicaciones web como animaciones, lo único que faltaba era dar elementos propios a los desarrolladores y diseñadores y quitar aquellos que no les fueran útiles.

De esta forma, la diferencia entre Flash y Flex radica en su principal propósito. Flash al tener una línea del tiempo, y algunas herramientas para dibujo vectorial resulta muy cómodo construir animaciones. Por su lado, Flex suprime la línea de tiempo, herramientas de dibujo, etc., y ofrece una amplia gama de controles de usuario que pueden ser utilizados para construir Interfaces Gráficas mediante un lenguaje de marcas llamado MXML. Así como Flash utiliza ActionScript, Flex de igual forma lo utiliza para codificar la lógica de la aplicación.

Concretamente, Flash ofrece más recursos para diseñadores, mientras que Flex ofrece más recursos para desarrolladores, y ambos pueden correr sobre Flash Player o AIR.

Entorno de Adobe Flash

Entorno de Adobe Flex

Muy bien, pero ahora concretamente ¿Cuál es la diferencia entre Flash Player y AIR?

Bueno, pues como ya lo hemos dicho, ambos son “entornos de ejecución”. Sin embargo, Flash Player ya es conocido por ejecutar animaciones/aplicaciones web, mientras que AIR es un poco más reciente y nos sirve para poder ejecutar aplicaciones que pueden utilizar tecnología web dentro del escritorio.

Perfecto!! ahora comprendo… hay algo más?

En Flex también es posible crear animaciones complejas como en Flash, sin embargo, como ya mencionamos arriba, en Flex no existe la línea del tiempo, por lo tanto si queremos crear animaciones en Flex, debemos hacerlo con puro código ActionScript y esto obviamente no es nada práctico. Tanto las animaciones creadas visualmente en Flash como las aplicaciones web desarrolladas en Flex, tienen una salida común… ambos son convertidos a puro código ActionScript.

¿Puedo conjuntar Flash y Flex a la vez?

Claro! En Flash podemos crear vistosas animaciones que podemos terminar incrustando en nuestra aplicación Flex. Es decir, si quisieras desarrollar un carrito de compras que por ejemplo tuviera como fondo alguna animación (un carrito moviéndose, un señor comprando, etc), podrías utilizar Flash para hacer esta animación y Flex para construir la Interfaz de Usuario de el carrito de compras (Formulario, Cajas de Texto, Grid, Botones, etc) y comunicarlo con algún lenguaje de servidor como Java para accesar a una Base de Datos y regresar el resultado a la Interfaz de Usuario.

¿Cómo es eso de utilizar Flex y Java?

Sí, Flex no es un nuevo lenguaje de programación, solo es un Framework para desarrollar Aplicaciones Ricas para Internet, es decir, Interfaces de Usuario con un alto contenido visual que le permite al usuario tener una sensación de trabajar localmente. De esta forma, Flex cumple con su propósito que es la construcción de Interfaces de Usuario y deja el acceso a datos a lenguajes como Java, .NET, PHP, Ruby on Rails, Python, etc.

¿Qué necesito para desarrollar en Flex?

El SDK de Flex es Open Source, sin embargo, Adobe proporciona un IDE para desarrollar aplicaciones al puro estilo drag&drop, es decir, desarrollar aplicaciones de manera visual. Flex Builder tiene una licencia comercial, sin embargo, es posible encontrar algunos otros IDE´s alternos aunque no con la misma potencia de Flex Builder.

Nov
14

¿Qué es Adobe Flex?

Flex es la solución de Adobe para el desarrollo de Aplicaciones Ricas para Internet. Sun tiene por su parte a JavaFX y Microsoft a SilverLigth, pero lo cierto es que ninguna de ellas es tan popular como Flex.

Flex es y será el futuro de las Aplicaciones Web (no confundir con Páginas, Portales, etc.) dado que tiene la gran ventaja de poder ser utilizado con todo tipo de lenguajes de servidor como ASP.NET, Java, PHP, Ruby on Rails, Python, etc., además de sus interfaces tan atractivas. Por todo esto y la experiencia que Adobe (Macromedia) tiene en productos enfocados a la Web, sin duda Flex será el futuro del desarrollo de Interfaces Web que combinado con un lenguaje como Java o .NET para el back-end hacen sin lugar a dudas algo muy tentativo para utilizar.

Para los que aún no conocen Flex, es necesario señalar que las aplicaciones Flex corren bajo el Runtime de Flash Player para las aplicaciones web y bajo el Runtime de AIR para las aplicaciones de “escritorio”… Sí lo fabuloso de Flex es que podemos crear aplicaciones web o de escritoio. En el caso de las aplicaciones web, debo aclarar que en Flex no se implementa la lógica de negocio, para ello es posible utilizar la potencia ya conocida de Java ó algún otro lenguaje como se menciono anteriormente. De esta forma mediante Flex construiremos la Vista de nuestra aplicación y utilizamos cualquier otro lenguaje para la programación de nuestro Modelo (Lógica y Acceso a Datos… Sí… las conexiones a una BD se hacen con Java, .NET, PHP, etc.).

Con Flex es posible hacer aplicaciones con una rica interacción con el usuario, por ejemplo esto ó algo más complejo como un ERP.

Yo mismo he pasado por la creación de interfaces para aplicaciones de escritorio o web en Java utilizando Swing o JSF respectivamente (de igual forma con ASP.NET), hasta llegar a utilizar Flex siempre que es posible. Con Flex no es necesario complicarse la vida utilizando  Ajax, Flex es totalmente Asíncrono por naturaleza, lo que da al usuario una sensación de estar trabajando localmente.

Si eres un desarrollador Java debo decirte que yo mismo he probado JavaServer Faces y realmente es bueno, sin embargo siempre que el mercado no me demanda utilizar JSF, prefiero usar Adobe Flex. Algunos autores reconocidos en el mundo de java como Bruce Eckel ha dejado de lado a Java para la creación de interfaces y recomienda Flex en su lugar, de esta forma tener una aplicación con la elegancia de Flex y la potencia de Java.

Adobe Flex es open source, sin embargo lo que Adobe vende es “Flex Builder” que es el IDE basado en Eclipse mediante el cual es posible diseñar aplicaciones de manera visual, sin embargo, es posible crear y compilar aplicaciones Flex desde la línea de comandos de manera totalmente gratuita.

top