miércoles, 12 de octubre de 2011

De nuevo por aquí

¡¡HOla amigos javeros!!

Una disculpa por la tardanza para seguir bloggeando por aquí, la verdad he pasado un periodo de descanso, aunque no lo crean ya llevo alrededor de año y medio sin tirar ni una sola linea de código Java. Ha sido bastante a gusto y fructífero este tiempo para otras disciplinas en que me desenvuelvo, pero para el desarrollo ha sido uno de los más largos periodos de inactividad que he tenido, que aunque he seguido desarrollando en otras tecnologías, debo admitir que he extrañado la singular manera que Java tenía de hacerme ver mis tendencias autodestructivas al momento de programar; cosa que otros lenguajes - como Php - no hacen.

Pero bueno, este no es un blog para hablar de las disciplinas varias que pueda tener ni de mis nostalgias reprimidas, es más bien para hablar de tecnología y cosas relacionadas con el mundo de la programación en Java y en otros menesteres.

Hay mucho de que hablar: la nueva versión de Java, nuevas tecnologías, tutoriales pendientes, el mundo de Google y su aplanadora de aplicaciones, frameworks, redes sociales, PHP, bases de datos, desarrollo ágil; en fin, muchas otras curiosidades.

Espero contar con su valiosa participación y cualquier comentario como siempre bienvenido. Saludos a tod@s l@s Javer@s y no Javer@s... continuamos...

miércoles, 14 de septiembre de 2011

Aplicacion web en medio de solo/lectura (CD) con Jetty y Derby. Parte 2: Implementación

Sin más preámbulos más que la referencia a la primera parte de este post que fue la motivación vamos directamente a la implementación.

Aquí esta lo que necesitaremos y utilizaremos:
  • Java JDK instalado (versión utilizada 1.6) con su respectiva versión de JRE (máquina virtual)
  • Jetty (versión utilizada 6.1.22).
  • Proyecto web Java construido (Puede ser el war, pero nosotros utilizaremos el proyecto con los fuentes compilados, como el que genera NetBeans en el directorio build/web del proyecto para este ejemplo)
  • Derby (versión utilizada 10.5.3.0)
Pasos a seguir:
  • Paso 1: Tener instalado y funcionando el Java JDK.
  • Paso 2: Configurar Jetty para su uso en medio de sólo lectura
  • Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby.
  • Paso 4: Preparar Base de Datos con Derby 
  • Paso 5: Como almacenar.
  • Paso 6: Como ejecutar.


Paso 1: Tener instalado y funcionando el Java JDK.

Este paso me imagino todos los javeros ya deben tenerlo cumplido, y los que no, deben hacerlo. Hago énfasis porque es importante que estén incluidas las variables de entorno en el path del sistema para evitar cualquier conflicto de ejecución tanto en Windows como en Linux. Esto es que además de tener instalada la máquina virtual, asegurarse de tener variables como JAVA_HOME definidas en el sistema, tanto en Linux como en Windows.

Paso 2: Configurar Jetty para su uso en medio de sólo lectura

Hay que descargar el archivo con el servidor embebido Jetty desde aqui y descomprimir. En la estructura e directorios buscamos el archivo JETTY/etc/jetty.xml, donde  JETTY es el directorio raíz donde esta desempaquetada la aplicación,  y nos vamos a la parte del log y comentamos de la siguiente manera:
<!--==================================== -->
<!-- Configure the Request Log-->
<!--==================================== -->
<!--
<Set name="RequestLog">
[snip]
</Set>
-->


Así comentamos la parte que activa el log de Jetty para que no intente guardar el log en nuestro medio de solo lectura, como lo es un CD.


Paso 3: Preparar proyecto web Java: configuración para uso de base de datos embebido con Derby 


Esto puede ser cualquier proyecto web hecho en cualquier IDE, en mi caso tomé un proyecto hecho en NetBeans y compilado con ant al cual llamaremos PROYECTONETBEANS (ruta que contiene la estructura del proyecto web java en Netbeans, con directorios como build, dist, lib, src, web, etc. ). Por lo tanto aquí supondremos que esta debidamente creado el proyecto y con las librerías necesarias (Incluyendo el jar del driver jdbc para usar Derby)

Yo utilicé el framework Hibernate para utilizar mi base de datos con un manejador Derby, pero se puede hacer con o sin Hibernate y usar la clase JDBC de manera directa para poblar la base de datos con Derby en nuestro programa e incluso utilizar cualquier otro cliente para manipular la base de datos fuera de nuestro programa.

Ahora lo que hay que hacer para utilizar nuestra base de datos de manera embebida en el medio de sólo lectura es cambiar la manera en como se carga el driver del jdbc (Controlador para Java de la base de datos). Esto lo hacemos donde definimos el driver esto es:
  • Si estas usando Hibernate como en mi caso hay que modificar el archivo de configuración "hibernate.cfg.xml". Yo tenía esta configuración en mi archivo al usarlo de manera local:
<property name="hibernate.connection.driver_class" >org.apache.derby.jdbc.EmbeddedDriver</property>
<property name="hibernate.dialect" >org.hibernate.dialect.DerbyDialect </property>
<property name="hibernate.connection.url" >jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED </property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>

Cambié el valor de la propiedad "hibernate.connection.url" por: "jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED" . Con esto queda configurado el sistema para usar la base de datos embebida con Derby en el medio de solo lectura.
  • En caso de que estés utilizando el driver JDBC directamente desde alguna clase lo único que tienes que hacer es cambiar el texto del Driver de Derby. Esto sería cambiar la línea 1 a la línea 2: 
Linea 1:
Connection conn = DriverManager.getConnection("jdbc:derby:directory:derbytestbd;create=true;territory=es_MX;collation=TERRITORY_BASED","root","");


Linea 2:
Connection conn = DriverManager.getConnection("jdbc:derby:classpath:/derbytestbd;territory=es_MX;collation=TERRITORY_BASED","root","");



Se puede observar como en ambos casos utilicé un usuario "root"  sin contraseña (vacío).

Una  vez hecho esto simplemente copiamos el directorio donde esta nuestro proyecto al directorio de Jetty. Esto sería copiar el directorio con los archivos compilados del proyecto web, en mi caso copiar el contenido de PROJECTONETBEANS/build/web a un JETTY_HOME/webapp/miproyecto , estamos pasando todos los jsp's y directorios WEB-INF y META-INF que son necesarios para que nuestra aplicación web funcionara en un contenedor tomcat por ejemplo.

Paso 4: Preparar Base de Datos con Derby

Debemos preparar la base de datos para que funcione en el medio de solo lectura.

Para empezar a manipular la base de datos es importante que  hayamos finalizado cualquier cliente que pudiera estar conectado y haciendo uso de nuestra base de datos.

Nuestra base de datos se llama "derbytestbd" entonces este es el nombre del directorio que contiene nuestra base de datos derby en la ubicación que lo hayamos creado. Dentro de este directorio antes de copiarlo debemos borrar el archivo directorio derbytestbd/tmp (sólo el tmp), el cual puede o puede no existir, así que no se preocupen si no existe.

Una vez hecho esto nos disponemos a crear el jar con los archivos de la base de datos. La mejor manera es utilizando el comando jar de la siguiente manera:

$ jar cMf derbytestbd.jar derbytestbd

Para más información de como crear un jar con tu base de datos Derby checar el Tema de la documentación de Derby "Transferring read-only databases to archive (jar or zip) files"

Donde derbytestbd es el directorio donde esta nuestra base de datos Derby y derbytestbd.jar es el nombre del nuevo archivo jar que se creará con nuestra base de datos para el medio de solo lectura.

Continuamos copiando nuestro nuevo archivo jar "derbytestbd.jar" en donde tenemos nuestro proyecto preparado para el medio de sólo lectura, es decir donde esta nuestra aplicación Jetty. Entonces copiamos derbytestbd.jar a JETTY_HOME/webbapp/miproyecto/WEB-INF/lib y así el jar de nuestra base de datos quede ligado al classpath de nuestra aplicación.

Paso 5: Como almacenar.

¡Listo! ya tenemos nuestro proyecto preparado para utilizarlo en un medio de sólo lectura. Para almacenarlo solo es necesario copiar el directorio completo JETTY_HOME al medio de almacenaje que deseemos. En este tutorial se indica que sea en un CD, pero se puede copiar a una memoria USB, disco portátil, etc. Así que tal cual se oye, técnica "copy&paste" y ¡ya!.


Paso 6: Como ejecutar.

Para ejecutar unicamente es necesario correr el servidor Jetty utilizando el archivo jar JETTY_HOME/start.jar ejecutandolo de la siguiente manera:

$ java -jar start.jar

Para más información de como ejecutar o utilizar el servidor Jetty acceder a la página oficial del proyecto aquí.

De esta manera iniciamos el servidor Jetty en la computadora donde estemos. Ahora es necesario acceder a nuestro proyecto, lo cual lo haremos a través de un navegador web ingresando a la siguiente url (Con las opciones por default de Jetty): "localhost:8443/miproyecto"

Si todo sale bien estarás viendo tu proyecto corriendo desde un medio de sólo lectura de manera embebida en un servidor Jetty :D


Notas finales

Algunas consideraciones que pueden ayudar en caso de algún error:
  •  El tutorial del que tomé la mayoría de las cosas les puede ser útil también y lo encuentran aquí.
  • Es importante que los jar's necesarios para la aplicación estén incluidos en el directorio miproyecto/WEB-INF/lib , si algún problema con alguna dependencia esta fallando, revisar eso o el CLASSPATH para corregir problemas con dependencias.
  • Cualquier comentario extra o duda pueden externarla, espero con gusto poder ayudar.

    lunes, 19 de abril de 2010

    Zip en java: Comprimir archivos y/o directorios

    Ejemplo claro y conciso para hacer un archivo zip con las librerias de java. El siguente código sirve también para hacer un archivo zip de un directorio con todo su contenido, el cual es agregado de manera recursiva.

    A continuación copio y pego el código tal cual pero agrego el enlace de donde lo recuperé.
    import java.io.*;
    import java.util.zip.*;
    
    /**
     * Compresses a file or directory into a Zip archive. Users of the
     * class supply the name of the file or directory as an argument.
     */
    public class SimpleZip {
    
       private static ZipOutputStream zos;
    
       public static void main(String[] args) {
          //User must specify a directory to compress      
    
    
    
    
    if (args.length < 1) {
             System.out.println("Usage: java SimpleZip directoryName");
             System.exit(0);
          }
          //Get the name of the file or directory to compress.      
    
    
    
    
    String fileName = args[0];
          //Use the makeZip method to create a Zip archive.
    
    
    try {
             makeZip(fileName);
          }
          //Simply print out any errors we encounter.
    
    
    catch (Exception e) {
             System.err.println(e);
          }
       }
    
       /**
        * Creates a Zip archive. If the name of the file passed in is a
        * directory, the directory's contents will be made into a Zip file.
        */
       public static void makeZip(String fileName)
             throws IOException, FileNotFoundException
       {
          File file = new File(fileName);
          zos = new ZipOutputStream(new FileOutputStream(file + ".zip"));
          //Call recursion.
    
    
    recurseFiles(file);
          //We are done adding entries to the zip archive,
    
    
    //so close the Zip output stream.
    
    
    zos.close();
       }
    
       /**
        * Recurses down a directory and its subdirectories to look for
        * files to add to the Zip. If the current file being looked at
        * is not a directory, the method adds it to the Zip file.
        */
       private static void recurseFiles(File file)
          throws IOException, FileNotFoundException
       {
          if (file.isDirectory()) {
             //Create an array with all of the files and subdirectories         
     //of the current directory.
    String[] fileNames = file.list();
             if (fileNames != null) {
                //Recursively add each array entry to make sure that we get
               //subdirectories as well as normal files in the directory.
                for (int i=0; i<filenames.length; i++){ 
      recursefiles(new File(file, fileNames[i]));
                }
             }
          }
          //Otherwise, a file so add it as an entry to the Zip file.      
    else {
             byte[] buf = new byte[1024];
             int len;
             //Create a new Zip entry with the file's name.         
    
    
    ZipEntry zipEntry = new ZipEntry(file.toString());
             //Create a buffered input stream out of the file         
    
    
    //we're trying to add into the Zip archive.         
    
    
    FileInputStream fin = new FileInputStream(file);
             BufferedInputStream in = new BufferedInputStream(fin);
             zos.putNextEntry(zipEntry);
             //Read bytes from the file and write into the Zip archive.         
    
    
    while ((len = in.read(buf)) >= 0) {
                zos.write(buf, 0, len);
             }
             //Close the input stream.         
    
    
             in.close();
             //Close this entry in the Zip stream.         
    
    
            zos.closeEntry();
          }
       }
    }
    

    El método que hace toda la magia es makeZip(String fileName) el cual hace un archivo zip de nombre fileName+".zip" del respectivo archivo o directorio.

    Agrego aquí el link donde se recupera esta pieza de codigo, además de que hace una explicación de el uso de las librerias zip y gzip en java. Clic aqui (Ahora pide que te registres para poder acceder al artículo). 

    Algo con lo que he tenido complicación es en crear un archivo jar usando estas librerías, no he encontrado como hacer un jar que sea reconocido al momento de agregarlo al classpath y ejecutar la aplicación java, si alguien tiene algún ejemplo al respecto le agradecería cualquier comentario.

    Pazzzzzz

    viernes, 9 de abril de 2010

    Google .... un nuevo significado para la red


    Buzzeando, googleando, gmail, bloggear, picasa, google maps, google Earth, google docs, google news, google Chrome, google Chrome OS.. ¡google for everything!...

    No hace mucho salió la herramienta Buzz de Gmail que hace un intento por socializar Gmail y pretende competir con redes sociales como Facebook y Twitter.

    Google, como todos podemos observar poco a poco esta acaparando más y más tópicos y contextos, no solo en la red, sino en otros ámbitos tecnológicos como la telefonía móvil entre otras.

    Mi opinión al respecto es que simplemente son herramientas que nos hacen la vida más fácil sin duda, con aplicaciones que podemos usar para cualquier actividad diaria, pero, con tanta información que nosotros mismos dejamos para Google (pensando en Google como una corporación de principios benéficos) que tan difícil puede ser que se pase al lado oscuro y no saque algún provecho de toda la información. Al final de cuentas ahí esta, y no podemos asegurar ni una cosa ni la otra, así que solo el tiempo nos lo podrá contestar, por lo mientras, creo que seguimos en la ruta en que Google se hace más y más importante para nuestras cibernéticas vidas, y así mismo, para nuestras mismas vidas... jaja.

    A continuación incluyo algunos comentarios de usuarios que se han planteado este tipo de preguntas rescatados de este foro , que a manera personal me parecieron interesantes puntos de vista.

    "El peligro informático de Google (técnico) es exactamente igual que el peligro social de cualquier régimen absolutista, vulgo dictadura: sus objetivos pueden ser muy buenos, pero a la larga se convierten en simple tiranía, como ha ocurrido con Microsoft en otros terrenos. Es muy cómodo, rápido, amplio, una gran ayuda para el que escribe, estudia o simplemente quiere buscar algo. ¡Ojala se mantenga así, pero lo dudo! La tentación del poder es muy grande y comienzan las injusticias económicas o sociales"
    Romel H. Zell Madrid

    "Google es la única agencia fachada del gobierno de USA adjunta al NSA (Agencia Nacional de Seguridad) que esta produciendo dividendos,no solo del punto de vista financiero sino desde la función con que fue originalmente creada,que no es otra que recopilar información personal de la mayor cantidad de individuos posible tanto dentro como fuera del país. O que creen ustedes que los gigantescos servidores que la operan son gratuitos? solo preguntense donde esta la publicidad que la sostiene? Cuidado!!!!"
    Leo Contreras portland

    "Llegará hasta su propia destrucción,empezando por fracturarse en varias empresas secundarias. Lo desgraciado del sistema capitalista es que la competencia obliga a expandirse para sobrevivir, y esto termina en un monopolio total en donde los más débiles son absorbidos; de la concentración se pasa al abuso de poder, y de allí a la tiranía. La información es la esencia misma del poder, sin ésta no existiría.¿Ventajas? Para los poderosos todas, para los demás: cero. Los negocios no son filantropía."
    Armando Bronca Sydney



    Realmente ¿qué pretende Google?, ¿es en realidad una solución  cibernética para todos nuestros problemas? ¿O parte de ese plan maquiavélico para conquistar el mundo? Espero sus opiniones estimados javeros y no javeros.


    pazzzz

    miércoles, 10 de marzo de 2010

    Aplicacion web en CD con jetty y derby. Parte 1: Motivación

    Esa ocasión mis amig@s javer@s hablaremos de lo que  se puede considerar un ejemplo de la vida real de las herramientas embebidas para aplicaciones java. Específicamente hablaremos de la creación de un CD con una aplicación Web java que se ejecute de manera completamente autónoma (una aplicación de escritorio es algo un poco mas fácil de lograr, sin embargo esta vez sortearemos el reto de utilizar un servidor de paginas web dinámicas para una aplicación web de java en un ambiente monousuario).

    En esta primera parte hablaremos únicamente de la motivación y la mención de las herramientas de las que echaremos mano para lograrlo, dejando para una segunda parte (seguramente muy interesante) un ejemplo de la implementación mas detallado para que puedas probarlo por tu cuenta.

    La motivación de llevar a cabo este ejercicio es el buscar la posibilidad de reutilizar nuestros sistemas hechos para un contenedor Web, ya sea Tomcat, Glassfish, etc. El mayor problema de portabilidad de estos sistemas es que forzosamente necesitan dicho contenedor instalado en el sistema para poderse ejecutar. Entonces es un  paso un tanto tedioso si lo que queremos es que nuestro sistema lo pueda utilizar un usuario final en la comodidad de su computadora, sin importar si hay conexión a internet o que tenga los servicios de base de datos o servidor web instalados en su sistema local.

    Como comentaba anteriormente, la manera más fácil de llevar a cabo esto es utilizar una aplicación de escritorio. En la actualidad, con java, además de swing tenemos herramientas como JavaFX (de las que después hablaremos seguramente) que sumamente nos facilitan la implementación de sistemas de escritorio. Pero la idea es la reutilización, y si ya tenemos un sistema Web que facilita la vida para usuarios que acceden a él por medio de la red, porque no otorgar esta posibilidad a usuarios que lo quieran utilizar de manera local.

    Es aquí donde entra Jetty, que como en un post anterior lo mencionamos, es un contenedor para aplicaciones web de Java. Lo singular de ésta aplicación es la facilidad para poder integrar una aplicación web cualquiera, aún utilizando diversos frameworks (yo hasta el momento lo he utilizado con Hibernate, Struts2 y Spring sin ningún problema). Con unas simples configuraciones queda completamente funcionar como aplicación de solo lectura, y así también las aplicaciones que éste contiene.

    Después de haber sorteado este problema nos enfrentamos a un nuevo reto, lograr utilizar un manejador de base de datos para nuestra aplicación, sin tener que instalar uno forzosamente. Es aquí donde entra Derby, que como también anteriormente habíamos mencionado, es un manejador de base de datos hecho en Java y que puede trabajar de manera embebida. Inicialmente había elegido HSQL, sin embargo la característica de que sea un manejador que trabaja en memoria, en el momento que lo implementé aparecieron mas contras que pros de su utilización, así que decidí utilizar Derby, sin embargo tu eres libre de utilizar el manejador que mejor te plazca.

    Obviamente si nuestra intención es crear un sistema que corra en CD, la base de datos solo tendrá atribuciones de lectura, no podremos escribir en ella. Derby permite ser utilizado como base de datos de solo lectura, incluso por su integración con java, es posible agregar nuestra base de datos a un jar agregadolo simplemente al classpath.

    Para concluir esta primera parte del post, quisiera agregar que estas herramientas es posible utilizarlas en conjunto para una aplicación potable. Sin embargo, es necesario aplicar ciertas configuraciones para que funcionen como solo lectura y además requieren un directorio temporal en el sistema local para su disposicion tanto Jetty como Derby (Esto es algo chafa, pero si queremos utilizarlo de la manera fácil es necesario que se usen directorios temporales), y si a esto le agregamos algún lanzador automatico para correr la aplicación en un navegador una vez iniciados los servicios, ¡listo! tenemos nuestra aplicación portable, que fácil ¿no?.

    Este post continuará con el ejemplo práctico, dentro de poco. Recuerda, cualquier comentario es bienvenido... cambio y fuera...

    pazzzzzzz
    Aquí puedes ver la continuación de esta entrada 

    lunes, 1 de marzo de 2010

    Ordenar nuestra información, pesadilla

    Estaba un día viendo mis canciones, y me dije "¡que desm#$%dre tengo!, algún día tengo que ordenar", y el tiempo pasó y no he ordenado aún. Estaba otro día viendo los videos que tengo, unos los guardo en su formato original y otros los convierto a mp4 para verlos en el PSP, y me dije "¡que p#$%che desm#$%dre tengo!, un día de estos tengo que ordenar", y el tiempo ha pasado y pasado y no he ordenado. Un día estaba descargando aplicaciones para la computadora y cuando vi mi directorio de descargas dije "¡que p#$%"e des"#$%"#dre tengo, ya voy a depurar!". Lo mismo me ha pasado con las películas que tengo, con mis documentos, con mis juegos, con mis respaldos de información, en fin, con todo mi material digital que tengo disperso en diferentes medios, la verdad es que tengo un verdadero desm#$%dre.

    ¿Que hacer?, afortunadamente no me siento solo, se que mas de alguno le ha de suceder lo mismo, e incluso me atrevo a decir que debe ser un fenómeno mundial, y una de dos, o hay un duende informático que se encarga de esparcir nuestra información de manera desorganizada, o - una posibilidad que me parece menos lógica y menos plausible... jeje ;) - los desorganizados somos nosotros.

    Según el articulo que leí, y concuerdo con él, un gran problema que tenemos es la tendencia a guardar todo, como si tuviéramos un medio de almacenamiento infinito (sobre todo el disco duro de nuesta pc principal). En el artículo lo llaman  "Infinite U-store-it".  Y lo peor de éste fenómeno es que lo repetimos en todos los dispositivos que nos acompañan: gadgets, celulares, consolas de juegos, laptop, etc.

    La solución... mmm... tener un método de ordenamiento para que podamos conjuntar nuestros datos de manera útil y fácil de organizar y depurar. OK, creo que esto es una utopía, como voy a tener todo previsto ... si cuando uno compra un dispositivo nuevo, lo menos que te pones  a hacer es a idear un mecanismo de organización. Entonces en contra parte necesitamos una vacuna, una solución reactiva a este mal, pero difícilmente podemos encontrar una manera sistemática de solucionar el desorden... debe haber algún programita que lo haga... en el articulo que comento mencionan algunos ejemplos.

    En realidad esta entrada no es más que para que recordemos un poco este mal que nos aqueja y tal vez hagamos conciencia de..... poooooor fin.... ordenar nuestra información... jeje.. o encontrar una forma de convivir con ello de manera que no sea un gran problema.. jeje.. como realmente lo hacemos.. ;) ... un saludo javeros y no javeros... aquí les dejo el enlace del articulo al que hago alusión, para acceder al artículo haz clic aqui.

    pazzz

    viernes, 12 de febrero de 2010

    Alternativas de iluminación electrica: Tipos, ahorro, ecologia

    El otro día me encontré con un articulo muy interesante a cerca de las alternativas de iluminación eléctrica en el hogar, y creo que es algo que vale la pena compartir con los amigos javeros porque la electricidad es parte implícita de nuestras herramientas de trabajo.

    Como ya has de saber, como alternativas de iluminación en el hogar tenemos las bombillas incandescentes, lámparas fluorescentes y lámparas led. En el artículo mencionan características y diferencias e implicaciones ecológicas, además de un pequeño marco histórico, incluso cosas relacionadas con la salud que yo no sabia con respecto a las lámparas de luz fluorescente (Hechas con mercurio, que es un material tóxico, por lo tanto peligrosas si se rompen); cosas buenas para tomarse en cuenta la próxima vez que vayas a reemplazar alguno de tus focos fundidos... jeje..  así que sin más aquí esta.
     
    En estos tiempos de crisis económica y crisis ecológica, más vale ahorrar y buscar las alternativas más sanas. ¡¡Puedes comentar!!

    ¡¡Pazzzzzzzzz!!!