Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

Aplicación Java para dividir un archivo de texto muy grande en varios archivos más pequeños

jueves, 7 de agosto de 2014

En varias ocasiones he tenido que lidiar con archivos de texto extremadamente largos, con miles de líneas de texto, y en una de esas veces me tocó un archivo de Log con cientos de miles de líneas que mis editores de texto en Windows no podían abrir, y los que si lo lograban, no me permitían manipular el archivo sin antes quedarse congelados. Aunque encontré algunas herramientas en línea que podían abrir el archivo y permitirme leer, no me permitían manipularlo.

Mi solución, para mi caso particular, fue dividir el archivo en varios archivos más pequeños, ya que era un Log de transacciones de una aplicación y solo necesitaba depurar usando las entradas del log. Lo que hice fue escribir un pequeño programa en Java. Hace poco le agregué una interfaz gráfica para facilitar su uso.

Para utilizar esta herramienta deberás contar con lo siguiente:

  1. Tener instalado el JRE 6 de Java. el común de los equipos ya deben tenerlo instalado. Solo deberás tener por seguro que tienes la versión 6.
  2. Descargar la herramienta desde el repositorio en GitHub.
  3. Descomprimir el archivo ZIP en una ubicación que conozcas. Por ejemplo, en C:\Users\jesfre\Documents\text-splitter-pack. En tu caso sería tu nombre de usuario.
  4. Entrar a la carpeta y hacer doble-clic en el archivo run.bat. Deberá abrirse una ventana de comandos y ejecutarse automáticamente una pequeña interfaz gráfica similar a esta:
  1. En esta ventana deberás:
  • Seleccionar el archivo de texto muy grande que quieres dividir.
  • Seleccionar la carpeta donde quieres que se guarden los archivos más pequeños que se generarán como resultado de la división del archivo grande.
  • Asignar la cantidad máxima de líneas que deberá tener cada archivo dividido. Por ejemplo, si el archivo grande tiene 1200 líneas de texto, y quieres que se generen 10 archivos más pequeños, deberás asignar en Set the number of lines per file: la cantidad de 120.
  • Hacer clic en Save files para generar los nuevos archivos. En mi caso, el archivo se llama prueba_archivo grande.txt y contiene 389 líneas de texto.
  • Al terminar deberás poder ver los resultados de la siguiente forma:

Para ver tus archivos, navega hasta la carpeta que seleccionaste en Target folder... y verás los nuevos archivos que han sido generados recortando el archivo más grande.


Para terminar, simplemente cierra la ventana de la aplicación.

Esta herramienta funciona con cualquier archivo que contenga texto plano, como archivos de tipo .txt, .csv, entre otros.

Podrás ver que es una herramienta muy simple. Ahora te invito a compartirla y mejorarla, pues es de código abierto y está disponible en https://github.com/jesfre/file-splitter.





Mavenizar un proyecto Web existente usando project-mavenizer

martes, 29 de julio de 2014

Aunque personalmente no me gusta el anglicismo Mavenizar, es el tema que abordaré para esta guía.

Explicaré cómo mavenizar un proyecto Web que no cumple con la estructura de directorios estándar de Maven. Estos proyectos no estándares pueden ser aquellos que han sido construidos hace ya un tiempo atrás, legados, o aquellos generados usando las herramientas de un IDE como Eclipse y por lo cual no se ajustan a los requerimientos convencionales de Maven. En ocasiones he 
mavenizado algún proyecto ya existente que he tenido que modificar para aprovechar los beneficios de algunos plugins de Maven y así evitar reinventar la rueda en su código.
Además, esta guía tiene el objetivo de explicar el funcionamiento de una herramienta de código abierto para llevar a cabo la tarea de mavenización. La herramienta es project-mavenizer. Con esta herramienta podremos generar un archivo de configuración POM que pueda utilizar la estructura no estándar del proyecto existente, en vez de modificar la estructura del proyecto para que se ajuste a las convenciones de Maven.

La guía de project-mavenizer la podemos encontrar también en inglés, nivel Tarzán, en GitHub.

Descargar y descomprimir la herramienta

  1. Descarga la herramienta desde GitHub. Este es un archivo ZIP llamado project-mavenizer-pack.zip que contiene:
    • La herramienta de mavenización project-mavenizer-0.0.1.jar.
    • Un proyecto Web de ejemplo llamado NonStandardWebProject que no cumple con el estándar de directorios de Maven.
    • El archivo sample.properties que deberás editar, y opcionalmente renombrar, para poder usar con tu proyecto.
  2. Descomprime el archivo project-mavenizer-pack.zip en una ubicación bien identificada; por ejemplo en C:\mavenizator\project-mavenizer-pack\.

Agregar tus configuraciones

  1. Deberás editar el archivo C:\mavenizator\project-mavenizer-pack\sample.properties y seguir las instrucciones que vienen en el mismo. En resumen es asignar los siguientes valores:
    • Asignar un nombre al proyecto, digamos miproyectomaven. Este será también el nombre del archivo WAR generado.
    • Asignar la ubicación de la carpeta de tu proyecto. Para el caso de nuestro ejemplo de prueba es C:\mavenizator\project-mavenizer-pack\NonStandardWebProject.
    • Asignar la ruta a la carpeta con el contenido Web del proyecto. Para nuestro ejemplo, C:\mavenizator\project-mavenizer-pack\NonStandardWebProject\WebContent.
    • Asignar la ruta a las carpetas con código fuente y recursos para el classpath del proyecto. En el archivo sample.properties vienen unos ejemplo.
    • Asignar la ruta a la carpeta que contiene todas las librerías usadas en tu proyecto. Ve el ejemplo en el archivo.

Mavenizar el proyecto Web

  1. Abre una ventana de comandos y navega hacia la carpeta que descomprimiste. En los siguientes ejemplos estaré usando MS-DOS.
  2. Desde tu ubicación en línea de comandos, ejecuta lo siguiente: c:\mavenizator\project-mavenizer-pack> java -jar project-mavenizer-0.0.1.jar.
Deberás ver algo similar a esto:
C:\mavenizator\project-mavenizer-pack> java -jar project-mavenizer-0.0.1.jar 
Set the properties file name:sample.properties 
Loading /C:/mavenizator/project-mavenizer-pack/sample.properties 
Generated file is: C:/mavenizator/project-mavenizer-pack/NonStandardWebProject\pom.xml 
C:\mavenizator\project-mavenizer-pack>


Probarlo

  1. Ahora puedes usar tu proyecto como un proyecto Web Maven. El pom.xml generado en el proyecto tiene las configuraciones necesarias para correr la aplicación usando un Tomcat embebido. Para correrlo, desde la ventana de comandos navega a la carpeta del proyecto Web y ejecuta c:\mavenizator\project-mavenizer-pack\NonStandardWebProject > mvn clean tomcat7:run.
  1. Si puedes ver algo similar a Starting ProtocolHandler ["http-bio-9966"] y sin errores previos entonces abre el enlace http://localhost:9966/miproyectomaven/ desde un navegador de Internet.

Después de ejecutar el comando se deberá haber generado un nuevo archivo pom.xml en la carpeta raíz del proyecto. Sería c:\mavenizator\project-mavenizer-pack\NonStandardWebProject\pom.xml.


Prueba la herramienta, espero que te sirva y, si quieres, puedes mejorarlo pues es de código abierto. El código está disponible en https://github.com/jesfre/project-mavenizer.



Cliente para HSQLDB en Windows

sábado, 26 de enero de 2013

Bases de datos en memoria

Cuando comenzamos a trabajar con las bases de datos en memoria como lo son H2, HSQLDB (antes HypersonicSQL) o Derby, encontramos que son excelentes herramientas para tener acceso rápido a datos persistentes; y que ofrecen grandes ventajas para construcción de software de todo tipo en Java. Ya sea como base de datos temporal de nuestra aplicación empresarial, para ejecución de pruebas o para demostraciones a los clientes, siempre se hace indispensable la administración visual de estas bases de datos, tablas, registros, etc.

Las herramientas gráficas de administración de las RDBMS como los TOAD, SQLyog, MySQL Workbench, SQL Developer, entre otros, ofrecen grandes facilidades para las bases de datos correspondientes. Pero, ¿y para las bases de datos en memoria? 

SQuirreL SQL Client es la herramienta gráfica que utilizo para visualizar mis bases de datos en memoria, ya sea con H2, HSQLDB o Derby, aunque también soporta otros motores de bases de datos tradicionales.

SQuirreL SQL Client es muy sencillo de configurar y utillizar. Pero con la introducción de Windows Vista/7 encontré un problema al intentar instalarlo y posteriormente al intentar correr la herramienta.

Mi ambiente de trabajo:
  • Laptop Mexicana 
  • Procesador de 64bits
  • 8GB de RAM 
  • Windows 7 Professional de 64 bits

Problema al instalar SQuirreL SQL Client en Windows 7

El primer problema surgió al intentar instalar SQuirreL, ya que no permitía crear la carpeta de instalación en Program Files (x86), esto por el permisos de seguridad.
Tratándose de un archivo JAR el instalador del programa, Windows no da la opción de Correr en modo administrador.
Por lo tanto, al intentar crear la carpeta de instalación de SQuirreL muestra el error: "This directory can not be writtenPlease chose another directory"
La instalación se lleva a cabo con el clásico Next>Next.

  










 



Solución 1 al problema de seguridad: Desactivar la seguridad del control de acceso

Para solucionarlo se puede bajar el nivel de seguridad en el control de acceso de Windows. Esto significará reiniciar el equipo antes de poder ejecutar nuevamente la instalación, y nuevamente después de haber instalado para incrementar nuevamente la seguridad. Procedimiento para desactivar UAC. No queremos esto.


Solución 2 al problema de seguridad: Abrir desde navegador

Otra opción para poder ejecutar completamente la instalación de SQuirreL, es 

  1. Abrir un navegador de Internet (IE) en modo administrador (Para este caso no usaremos Google Chrome)
  2. Arrastrar y soltar el instalador de SQuirreL en la ventana del navegador. En mi caso: C:\downz\squirrel-sql-3.3.0-install.jar. O copiar la ruta del archivo del Explorador de Windows y pegarlo en la barra de direcciones del navegador.
  3. En la ventana de diálogo, seleccionen Abrir.


Esto ejecutará el archivo de instalación en modo administrador, con lo que permitirá terminar la instalación del programa.


Problema para ejecutar el programa recién instalado y solución

Al finalizar la instalación de SQuirreL podríamos comenzar a usar la aplicación. Pero surge ahora un nuevo problema. Al hacer doble clic o correr el archivo por lotes que ejecuta el programa, simplemente no lo carga. El problema está en que el archivo por lotes que ejecuta el programa necesita una corrección ya que la ruta de instalación de Java, apuntado por nuestra variable JAVA_HOME contiene espacios. Por ejemplo, C:\Program Files (x86)\Java\jdk1.6.0_17. Para solucionarlo, editaremos el archivo squirrel-sql.bat modificando la línea set IZPACK_JAVA=%JAVA_HOME% agregándole comillas set IZPACK_JAVA="%JAVA_HOME%". Con esta modificación ya será posible ejecutar y comenzar a usar nuestro cliente de gestión de bases de datos en memoria.


Últimas anotaciones

Claro que podríamos habernos evitado todo esto con solo seleccionar una ruta distinta para instalar nuestro programa. Pero nosotros los programadores en ocasiones... 

Disfruten tirando código.

Depurar codigo desde Eclipse usando el plugin de Jetty para Maven

martes, 10 de enero de 2012

Hace ya un tiempo estuve desarrollando una aplicación usando Maven como sistema de building. Pero llegué al punto de que cuando quería depurar la aplicación desde Eclipse, simplemente por la forma en la que funciona el plugin de Jetty para Maven, no me redirigía al código fuente cuando se detenía en un breakpoint, sino en el .class, claro, eso es un problema cuando necesitas ver las líneas de código. Pues bien, luego de un poco de búsqueda, encontré que en la documentación del plugin de Jetty explican cómo lograr depurar el código fuente.

Simplemente es necesario seguir el tutorial que está disponible en

Con esos dos pasos se puede comenzar a depurar el código usando Eclipse, un poco tedioso pero muy rápido de configurar y funciona muy bien.

Primeros pasos con Java Web Start (2): La consola de Java

miércoles, 14 de julio de 2010

En un post anterior hacía una introducción a Java Web Start. Ahora quiero comentar acerca de una característica que proporciona Java, y esta es su consola. La consola de Java viene con la instalación del JRE. De acuerdo al sitio ayuda de Java,

La consola de Java ofrece información acerca de la versión del entorno de ejecución de Java (JRE), el directorio de inicio del usuario y los mensajes de error que aparezcan durante la ejecución de un applet o una aplicación.
Pues bien, lo que nos interesa en este momento de la consola es la posibilidad de mostrar los mensajes de error que se lanzan durante la ejecución de una aplicación; para este caso nos será de mucha ayuda al momento de probar y depurar nuestras aplicaciones Java Web Start ya que podremos ver con más detalle los errores que sucedan durante la ejecución de nuestras aplicaciones.
Por defecto la consola de Java no se muestra, por lo tanto habrá que habilitarla siguiendo los pasos que se describen en la misma página y que a continuación presento.
Habilitación de la Consola de Java para la plataforma Windows, para las versiones de Java 6.0, 1.5.0
  1. Haga clic en Inicio.
  2. Seleccione Configuración.
  3. Seleccione Panel de control.
  4. Haga doble clic en el icono de Java.
  5. Haga clic en la ficha Avanzado.
  6. Haga clic en el signo + situado junto a Consola de Java. (Img. 1)
  7. Seleccione Ver consola y haga clic en Aplicar.
Img. 1. La Ventana de configuración

Una vez hecho esto, si ejecutamos nuestra aplicación Java Web Start o cualquier otra podremos ver una ventana como la mostrada abajo en la que veremos los errores que lance la aplicación.


Para otras versiones de Java o la visualización de la consola en navegadores como Firefox y otros pueden ver la página de ayuda de Java donde se explica.

Illegal character in path at index 18: file: ~/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar

domingo, 11 de julio de 2010

Hace unos días mientras generaba mis CRUD usando la herramienta appfuse:gen de Appfuse me mostró el siguiente error extraño:

[INFO] null
Illegal character in path at index 18: file:/~/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.IllegalArgumentException
Después de buscar pocos minutos, enseguida encontré cuál era el problema. El problema es que Maven tiene ciertos conflictos al intentar parsear la ubicación del repositorio si tal ubicación contiene espacios en blanco. Y este es un error ya muy conocido que me había tocado ver antes, pero lo había olvidado (algo muy común).
Como en mi caso, que por estar usando un Windows XP en español, por defecto Maven genera el repositorio en "C:/Documents and Settings/<usuario>/.m2/repository/org/apache/ant/ant/1.7.0/ant-1.7.0.jar", por lo tanto generará este error en alguna ejecución. Los pasos para corregir el error fue:
  1. Mover el repositorio que Maven genera, que por defecto se encuentra en "C:/Documents and Settings/<usuario>/.m2/" a una que no contenga espacios como "C:\.m2"
  2. Editar el archivo de configuración de Maven que se encuentra en <MAVEN_HOME>\conf\settings.xml. Descomentar y actualizar la directiva que apunta al repositorio local en

    c:\.m2\repository
  3. y BUILD SUCCESSFUL

Espero les sirva para cualquier ejecución de Maven con el mismo problema.

SAXNotRecognizedException: Property 'http://apache.org/xml/features/nonvalidating/load-external-dtd' is not recognized

miércoles, 7 de julio de 2010

Actualmente estoy desarrollando una pequeña aplicación usando Appfuse 2.0.2. Appfuse cuenta con una herramienta de generación de código muy potente que usa Maven.

mvn appfuse:gen -Dentity=NombrePojo

Pues bien, al momento de intentar generar mis CRUD (Create, Retrieve, Update y Delete) me marcó el error:
org.xml.sax.SAXNotRecognizedException: Property 'http://apache.org/xml/features/nonvalidating/load-external-dtd'

Después de buscar un rato en la lista de correo de Appfuse encontré que es una funcionalidad no probada aún con Java 6 y recomiendan solucionarlo apuntando a otra URL, pero había que hacer algunos cambios muy drásticos, pero lo que quería era solamente solucionar ese error y no tenía inconvenientes en cambiar de versión de Java, así que
  1. instalé la versión 5 de Java,
  2. cambié el valor de la variable de entorno JAVA_HOME a la ubicación del JDK5 en vez de la 6,
  3. abrí una nueva ventana de comandos,
  4. ejecuté nuevamente la instrucción mvn appfuse:gen -Dentity=NombrePojo y
  5. vualá BUILD SUCCESSFUL.
Espero que les sirva si están usando Appfuse

Primeros pasos con Java Web Start

domingo, 25 de abril de 2010

Hace algún tiempo tuve que aprender a usar esta definición de la plataforma Java para desarrollar una pequeña aplicación Swing que se ejecutaría vía Java Web Start desde un link en una aplicación Web. Para usar Java Web Start se requiere más que nada realizar varias configuraciones, nada de programación.

Para hacer esto seguí estos sencillos pasos.

Pasos para habilitar la ejecución de JavaWebStart desde una aplicación Web

1. Empaquetar la aplicación
Lo primero que deberemos hacer será empaquetar nuestra aplicación en un archivo JAR. Además, para poder ejecutar nuestra aplicación desde una aplicación de JavaWebStart deberemos firmar el JAR digitalmente, pero esto se explicará más adelante. Para empaquetar nuestra aplicación usamos la herramienta de línea de comandos de Java. Aunque en todo caso, puede usarse cualquier herramienta disponible en nuestro IDE, si se dispone de uno.


<MIAPLICACION_DIR>.jar –cf <nombre-archivo-jar>.jar <clase-java1>.class <clase-java2>.class <clase-javaN>.class


2. Firma digital
Ya tenemos casi listo nuestro JAR, ahora solo deberemos firmarlo. Esta firma digital es importante ya que todas las aplicaciones se ejecutan dentro de un sandbox, que es un espacio de seguridad del cliente donde se ejecutará la aplicación. Los pasos son los siguientes.

a) Generar el Keystore: Desde línea de comandos entrar al direcotorio bin de nuestra instalación de Java (el JAVA_HOME).

<JAVA_HOME>\bin>keytool -genkey -alias test –keyalg RSA -keystore test.jks

Luego se habrá generado el archivo test.jks en el directorio bin .

b)
Lo siguiente será firmar el JAR con la herramienta KeyTool IUI disponible en KeyTool IUI 2.4.1

Con estos pasos tendremos una aplicación empaquetada y firmada que podrá ejecutarse en el cliente. Para más información al respecto de firma digital escuche el podcast de Javahispano no. 080 - Criptografia y Firma Digital.

3. Archivo de configuración de Java Web Start
Ahora crearemos el archivo de configuración de nuestra aplicación Java Web Start en nuestro editor de texto preferido. El archivo de configuración tendrá el nombre que deseemos y con la extensión .jnlp (holaMundo.jnlp). Se puede encontrar más información sobre cómo crearlo y más opciones de configuración en el siguiente enlace JNLP File Syntax.

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
codebase="http://localhost:8080/micontextoweb/javaws"
href="TheTime.jnlp"
>
<!-- Información general de nuestra aplicación -->
<information>
<title>Hola Mundo</title>
<vendor>Jorge Ruiz Aquino</vendor>
<homepage href="/micontextoweb" />
<description>Archivo de ejemplo</description>
</information>
<offline-allowed/>
<!-- Se establecen los permisos para la aplicación dentro del sandbox -->
<security>
<all-permissions/>
</security>
<!--
Se listan los recursos necesarios para la ejecución de la aplicación,
como la versión mínima de Java requerida, la ubicación del JAR de nuestra aplicación,
además de las librerías externas que se usarán.
-->
<resources>
<j2se version="1.5+" />
<jar href="http://localhost:8080/micontextoweb/javaws/AplicacionFirmada.jar"/>
</resources>
<!-- Se establece el nombre de la clase que contiene el método main() -->
<application-desc main-class="ClaseMain" />
</jnlp>

Los permisos en nuestra configuración anterior son necesarios además de la firma digital que hemos agregado al JAR en el paso anterior.

Ahora que tenemos nuestro archivo AplicacionFirmada.jar y nuestra configuración JavaWebStart holaMundo.jnlp; pondremos estos archivos y las librerías necesarias en donde corresponda dentro de nuestro servidor Web. En mi caso, será en mi servidor Web Apache Tomcat /micontextoweb/javaws/, tal como está configurado en el archivo .jnlp, en el apartado .

4. Soporte de JNLP en el servidor Web
Lo siguiente será asegurarse que el servidor Web soporta archivos de tipo JNLP, que es la extensión de las aplicaciones Java Web Start. Para esto se debe habilitar el soporte del tipo MIME en la configuración del servidor, por ejemplo, en el servidor Web Tomcat se puede habilitar en la configuración del archivo /conf/web.xml agregando un nuevo mapping para el tipo MIME. Por defecto Tomcat ya lo tiene habilitado.

<mime-mapping>
<extension>jnlp</extension>
<mime-type>application/x-java-jnlp-file</mime-type>
</mime-mapping>


5. Soporte de JNLP en el navegador Web

Posteriormente, en nuestra aplicación Web agregaremos una porción de código Javascript para verificar que el navegador soporta el tipo MIME. Aunque, actualmente la mayoría de los navegadores soporta este tipo de archivos.

function mimetypeCheck() {
// First, determine if Webstart is available
if (navigator.mimeTypes['application/x-java-jnlp-file']) {
plugin = navigator.mimeTypes['application/x-java-jnlp-file'];
} else {
document.write ("no jnlp file association
");
}
// Next, check for appropriate version family
for (var i = 0; i < navigator.mimeTypes.length; i++) {
plugin = navigator.mimeTypes[i];
}
}
mimetypeCheck();


6. Enlace a la aplicación Java Web Start en la aplicación Web
Finalmente, agregamos un enlace en nuestra aplicación Web para poder descargar la aplicación JNLP.

<a href="http://localhost:8080/micontextoweb/javaws/archivo.jnlp">Descargar JNLP</a>



Ahora estamos listo para arrancar el servidor Web y probar la ejecución de nuestra primera aplicación Java Web Start.


Suerte con su primera taza de Java Web Start.

Comenzando con Java (3) - La variable JAVA_HOME (Windows)

domingo, 21 de marzo de 2010

Normalmente cuando estamos comenzando a usar Java nos encontramos con que tenemos que agregar el JAVA_HOME (el directorio de instalación de Java) a las variables de entorno de Windows. Pues bien, para esa "primera vez" me he dado a la tarea de escribir este pequeño tutorial. Para este tutorial debemos tener presentes los siguientes conceptos:

Variables de entorno
Autoexec.bat
PATH: Que es donde el intérprete de comandos buscará los comandos de ejecución que escribamos en la consola, siempre y cuando no usemos una ruta específica para llamar al comando.

La idea del JAVA_HOME es que agreguemos una nueva variable de entorno a nuestro sistema. En este caso JAVA_HOME es el nombre de facto, aunque podría ser cualquier otro, lo importante es que además lo agreguemos al PATH para que Windows pueda reconocer los comandos de Java. Incluso podríamos no definir la variable JAVA_HOME y hacerlo todo directamente sobre la variable PATH, pero por convención y practicidad es mejor definirla, esto te será más claro conforme sigas usando Java.
Para agregar la nueva variable de entorno hay dos caminos a seguir.

El primero es usando la ventana de Propiedades del sistema de Windows.
(La forma en que siempre lo hago)

1. Hacer la combinación de teclas Inicio(la tecla de la ventanita) + Pausa para abrir la ventana de Propiedades del sistema.



2. Dentro de la ficha Opciones avanzadas, oprimir el botón Variables de entorno, lo que abrirá una nueva ventana titulada Variables de entorno.


Nota: Dentro de las variables de entorno tenemos las Variables de usuario y las Variables del sistema, las primeras funcionan mientras la sesión del usuario para la cuál está definida está abierta, las otras funcionan para todos los usuarios y se necesitan permisos de administrador para definirlas. Preferentemente yo siempre uso las Variables de sistema, a menos que haya una situación particular que requiera que use las variables de usuario.

3. En la sección de las Variables del sistema haremos clic sobre el botón Nueva, esto nos abrirá un pequeño cuadro de diálogo donde agregaremos los siguientes valores:
* en la caja Nombre de variable: JAVA_HOME
* en la caja Valor de variable: la ubicación donde hayas instalado el JDK, en mi caso C:\Archivos de programa\Java\jdk1.6.0_18 y hacer clic en Aceptar.


4. Buscar la varibla de sistema llamada Path y hacer clic en Modificar.
5. En el campo Valor de variable de la ventana de diálogo Modificar variable de sistema agregaremos nuestra nueva variable de entorno al final del valor existente separándolo por un punto y coma (;) de la siguiente forma: ;%JAVA_HOME%\bin;

De esta forma estamos haciendo referencia a la carpeta bin (donde están los comandos de ejecución) de la instalación de Java usando la variable JAVA_HOME que hemos creado en los pasos anteriores. También podríamos haber escrito directamente la ruta de la instalación del JDK en el Path, pero como lo he dicho antes, es preferible hacerlo de esta forma.

Después de estos pasos simplemente deberemos hacer clic en el botón Aceptar de cada ventana y tendremos agregada nuestra nueva variable de entorno.

Otra forma es haciéndolo directamente desde la ventana de linea de comandos:

1. Hacer la combinación de teclas Inicio + R para abrir la ventana Ejecutar, y escribir cmd y hacer clic en Aceptar. Esto abrirá una ventana de linea de comandos.


2. En la ventana de linea de comandos escribir: set JAVA_HOME=, nuevamente, en mi caso la ruta de instalación es "C:\Archivos de programa\Java\jdk1.6.0_18"

Nota
: Las comillas no son necesarias a menos que tengamos espacios en blanco en nuestra ruta, como en este caso.

3. Posteriormente, en la misma ventana, habrá que agregar esta variable al Path de esta forma: set Path=%Path%;%JAVA_HOME%\bin;


Con esto habremos agregado la nueva variable de entorno, pero solo estará disponible mientras permanezca abierta la sesión de la linea de comandos. Para hacer permanente nuestras variables de otra forma, podemos agragarlas al Autoexec.bat para que se carguen siempre que arranque el sistema.

Agregar las variables de entorno en el Autoexec.bat

1. Abrimos una ventana de Ejecutar como en el paso uno de la sección anterior y escribimos sysedit y hacemos clic en Aceptar.
2. En la ventana de AUTOEXEC.BAT agregamos las lineas
@echo off
JAVA_HOME="C:\Archivos de programa\Java\jdk1.6.0_18"
Path=%Path%;%JAVA_HOME%\bin;


Y después de guardar el archivo, preferentemente, reinicia el sistema.

Nota: Gracias a un comentario, debo remarcar que en versiones posteriores a Windows ME las variables de entorno se deben agregar por medio de la ventana de Propiedades del sistema y no por la modificación del archivo autoexec.bat, aunque aun es posible.

La prueba

Para comprobar que verdaderamente se ha agregado la nueva variable de entorno abre una ventana de línea de comandos y escribe java -version, y el resultado de ejecutar esta línea deberá ser algo similar a esto:


Para más inromación sobre comandos del DOS, el Autoexec.bat y en general sobre las variables de entorno, dejo estos enlaces:
Variables de entorno
Environment variables
Autoexec.bat (inglés)
Autoexec.bat (español)
Config.sys y Autoexec.bat
How do I set or change the PATH system variable?

Comenzando con Java (2) - El IDE

martes, 16 de marzo de 2010

En la sección anterior de esta serie de Comenzando con Java vimos cómo comenzar apoyándonos en tutoriales y les dejé algunos videotutoriales muy buenos que me he encontrado en la red. Ahora toca seleccionar nuestro editor de desarrollo.

La selección de nuestro primer IDE (Integrated Development Environment, Entorno Integrado de Desarrollo) es muy importante pues nos ayudará a resolver problemas comunes, acelerar nuestro aprendizaje y adaptarnos poco a poco a una forma particular de trabajo.

Debemos seleccionar el IDE de acuerdo a nuestras necesidades, por ejemplo, si lo necesitamos solo para el uso académico, aprendizaje de ciertas herramientas y/o tecnologías del mundo Java, si lo necesitamos para uso profesional, ya que en ciertas empresas dicen al desarrollador cuál IDE usar, etc.

Como este tutorial lo he escrito para quienes aun están aprendiendo a programar en Java, les recomiendo usar un IDE
Lo que yo recomiendo es verificar que el IDE:

  • sea intuitivo
  • tenga resaltador de código
  • tenga depurador
  • tenga autocompletado (no indispensable si estás aprendiendo)

Aunque llegarás a usar otras herramientas muy prácticas y otras muy complejas conforme avances en tu aprendizaje.

Por ejemplo, yo aprendí usando un editor muy simple: TextPad, y también vi a compañeros aprendiendo con JPadPro.

Uno muy utilizado en la academia para la enseñanza de la programación en Java es BlueJ, la cual también recomiendo mucho.

También puedes aprender con uno más profesional como Netbeans (comentarios a parte) que es un IDE muy completo y ampliamente usado en entornos profesionales. Es gratuito y puedes descargarlo en su versión más ligera para comenzar a programar. También puede usar la versión Classic de Eclipse. Consulta sus páginas respectivas o la Wikipedia para leer más al respecto y decidir por un IDE.

Pero existen muchos más en el mundo Java, para todos los gustos, solo he comentado los más comunes.


Enlaces:
Netbeans (Wikipedia| descarga)
Eclipse (Wikipedia| descarga)
BlueJ (Wikipedia| descarga)
TextPad (Wikipedia)
JPadPro

Invocar programas ASM desde Java paso a paso

miércoles, 27 de enero de 2010

Hace ya varios meses envié un tutorial al portal de JavaHispano donde explicaba cómo hacer para invocar funciones escritas en lenguaje ensamblador desde Java. Y como ya pasaron más de tres meses desde entonces, ya puedo usarlo en mi blog :D.
Aquí les dejo el Contenido y las dos primeras partes para que se den una idea; también les dejo el código fuente y el documento PDF del tutorial.

Contenido

  1. Introducción
  2. ¿Cuándo usar JNI?
  3. Requerimientos de software
  4. Configuración del ambiente de trabajo
  5. La programación
  6. La ejecución
  7. Conclusión
  8. Referencias y lecturas

1. Introducción
En el sitio de java.net existe un pequeño tutorial titulado Invoking Assembly Language Programs from Java1 pero está en inglés y no es muy sencillo para algunos nuevos programadores Java o ensamblador. En java.net explican cómo funciona la invocación de un programa ASM desde Java y qué hacer para lograrlo, pero no explican cómo hacer cada paso. Por lo tanto me he dado a la tarea de facilitar la comprensión de estas técnicas para los hispanohablantes que dan sus primeros pasos con JNI; ya que conocer un poco del funcionamiento de JNI y la invocación de aplicaciones en ensamblador es fundamental cuando se tienen aplicaciones que necesiten operaciones que consuman mucho proceso del servidor y se necesite implementar un pequeño programa a bajo nivel para ejecutar tales operaciones, y de esta manera disminuir el tiempo de espera que a veces suele ser crítico.
También con JNI tenemos la capacidad de invocar funciones y procedimientos escritos en otros lenguajes, como C/C++ o en nuestro caso ASM, por ejemplo, cuando se tienen sistemas legados y se necesite utilizar alguna función del código legado será necesario desarrollar aplicaciones que puedan ejecutar estas funciones. Para más información de JNI y sus capacidades se puede consultar el manual para programadores disponible en el sitio de Sun2.
Cabe señalar que este no es un tutorial introductorio a JNI o al API, por lo tanto se limitará a mencionar solo algunos conceptos necesarios. De forma rápida, comenzaremos con determinar el software que usaremos y de dónde obtenerlo, pero no nos detendremos a aprender el funcionamiento de ellos. Posteriormente agregaremos algunas variables de entorno y comenzaremos con la programación. Para esto, se presentan los programas y cómo compilarlos, sin embargo estará disponible el código fuente usado en el tutorial. Al finalizar el tutorial el lector deberá ser capaz de cargar una librería DLL en cualquier aplicación Java y usar los procedimientos de cualquier librería nativa.

2. ¿Cuándo usar JNI?
En algunas ocasiones, a algunos desarrolladores les tocará encontrarse en situaciones en las que una aplicación hecha completamente en Java no cubrirá todos los requerimientos para tal. Algunos ejemplos de estas situaciones pueden ser:

  • Cuando a pesar de querer escribir toda la aplicación en Java para permitir la compatibilidad entre plataformas, exiten características de la plataforma que son necesarias para la aplicación y no son soportadas por la librería estándar de Java. Esto es referido como dependencia de la plataforma.
  • Cuando ya se tiene una librería escrita en algún otro lenguaje y se desea hacerla accesible a nuestro código Java, por ejemplo, al tener que trabajar con código legacy. en estos casos las librerías se cargan dentro del mismo proceso de la apliación por medio de JNI, aunque existen otros mecanismos más eficientes que funcionan en procesos separados.
  • Si se quiere implementar porciones de código en un lenguaje de bajo nivel como ensamblador para disminuir el tiempo de procesamiento. Por ejemplo, en aplicaciones que necesiten renderizar gráficos 3D que requieren más tiempo de procesamiento, habrá que escribir una librería para gráficos en lenguaje ensamblador para tener un mejor rendimiento3.
  • En casos en los que quiera cargar una librería nativa en un proceso existente para evitar el costo de iniciar un nuevo proceso y cargar la librería en el mismo4.
  • También será oportuno usar JNI cuando se quiera utilizar algunas funcionalidades de un programa Java desde un código nativo.

Documento Invocar programas ASM dese Java paso a paso
Código fuente
El tutorial en Javahispano


Convirtiendo fechas entre zonas horarias (2)

sábado, 12 de diciembre de 2009

En mi anterior post titulado Convirtiendo fechas entre zonas horarias puse un ejemplo de cómo poder convertir una fecha/hora de una zona horaria local a una distinta. Pero trabajando con el mismo proyecto encontré que debía convertir una fecha de la zona horaria UTC a la local, y entonces mi líder técnico me dió una solución sencilla cambiando solo una línea del código de ejemplo del post anterior, justo para hacer lo que necesitaba en ese momento:

En la tarea que estaba realizando leía un archivo de texto con el dato "fecha" como una serie de números: "20090921"+"1230", que representa el 21 de Septiembre de 2009 a las 12:30; por lo que tuve que usar el formato de fecha "yyyyMMddkkmm". Esta fecha que recibía del archivo representaba una fecha/hora en el horario GMT. Y esta hora la debía pasar a mi zona horaria local que es CST o UTC-6 (Tiempo del centro).

public void cambiarZonaHoraria( String fecha, String patron, String tz ) {
SimpleDateFormat format = new SimpleDateFormat( patron );
format.setTimeZone(TimeZone.getTimeZone( tz ));
try {
System.out.println( format.parse( fecha ) );
} catch (ParseException pe) {
pe.printStackTrace();
}
}


Lo que hace es muy sencillo:
  • Primero crea una nueva instancia de SimpleDateFormat con el parámetro "patron" que le dice a la instancia que el texto que se le va a enviar está en ese formato, en mi caso "yyyyMMddkkmm".
  • Luego, lo más importante de lo que intentamos hacer, le asignaremos a nuestro objeto format el TimeZone en el que está la hora que queremos convertir, en mi caso era GMT.
  • Posteriormente, simplemente usamos el método parse(String) para convertir nuestro texto a un Date en la zona horaria local, en mi caso CST; por lo que el resultado final de este ejemplo es que el texto "200909211230" con el formato "yyyyMMddkkmm"lo cual representa "2oo9/09/21 12:30" en GMT pasa a ser "2009/09/21 6:30" en CST ya que son 6 horas menos a la referencia del Tiempo Universal Coordinado o UTC.
Solo debemos recordar cachar las excepciones o hacer un throw de ellas.

Convirtiendo fechas entre zonas horarias

domingo, 6 de diciembre de 2009

En cierto proyecto en el que estoy involucrado tuve que convertir algunas fechas en el huso horario UTC (GMT) a la zona horaria CST (Tiempo del centro) que es el que usa la mayoría de los estados en México. Como el proyecto está enteramente basado en tecnología Java, me di a la tarea de encontrar formas de hacer esto con librerías para Java.

Encontré que hay algunas librerías, como las de Quartz, implementan alguna clase para la conversión de zonas horarias. Pero en mi caso, necesitaba no depender tanto de librerías de terceros o fuera del API de Java.

Encontré que con las clases TimeZone y DateFormat puedo hacer la conversión usando las siguientes sentencias.


public void cambiarZonaHoraria(Date fecha, String to) {
DateFormat dateFormat = new SimpleDateFormat();
TimeZone tz = TimeZone.getTimeZone(to);
dateFormat .setTimeZone(tz);
System.out.println(dateFormat.format(fecha));
}


Lo que se hace básicamente es

  • crear una instancia de SimpleDateFormat con el formato de fecha local
  • crear una instancia del TimeZone con el nombre corto de la zona horaria que se especifique por el parámetro "to"
  • se asigna la nueva zona horaria al objeto dateFormat
  • haciendo uso del método format() del objeto dateFormat se hace la conversión de nuestra fecha a una cadena que representa la nueva fecha en la zona horaria que hemos creado, y esta fecha se imprime en pantalla.
De la misma forma se pueden hacer conversiones entre distintos husos y zonas horarias.
Ahora, cabe señalar que para crear un TimeZone se usa el nombre corto de la zona horaria. Aquí dejo un listado de zonas horarias con sus nombres e IDs que he obtenido ejecutando este pequeño programa que encontré en Java Developers Almanac:

import java.util.Date;
import java.util.TimeZone;

public class ListadoZonasHorarias {

public static void main( String[] args ) {
Date fecha = new Date();
// Obtiene el ID de todas las zonas horarias
String[] zoneIds = TimeZone.getAvailableIDs();

System.out.println(" ID | Nombre corto | Nombre largo |Diferencia horaria \n");
for (int i=0; i<zoneIds.length; i++) {
// Ontiene el TimeZone dependiendo del ID e imprime el ID
TimeZone tz = TimeZone.getTimeZone(zoneIds[i]);
System.out.print(tz.getID() + "\t|");

// Obtiene e imprime el nombre corto y largo de la zona horaria
String shortName = tz.getDisplayName(tz.inDaylightTime(fecha), TimeZone.SHORT);
String longName = tz.getDisplayName(tz.inDaylightTime(fecha), TimeZone.LONG);
System.out.print(shortName + "\t\t|");
System.out.print(longName + "\t|");

// Obtiene e imprime la cantidad de horas de diferencia al huso GMT
int ro = tz.getRawOffset();
int horas = ro / (60*60*1000);
int minutos = Math.abs(ro / (60*1000)) % 60;
System.out.print(horas + ":" + minutos);
System.out.println();
}

}
}

Espero que les pueda servir como a mí. Saludos.

An internal error occurred during: "JSP Content Validator".

lunes, 31 de agosto de 2009

En la oficina en donde trabajo usamos Myeclipse como IDE y constantemente cuando editamos archivos XML o JSP en algunos proyectos, usando MyEclipse 6.0.1 GA, comunmente nos lanza una ventana emergente cada vez que intentamos guardar este tipo de archivos con los siguientes errores:

An internal error occurred during: "JSP Content Validator".
org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidationHelper
An internal error occurred during: "JSP Semantics Validator (JSF)".
org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidationHelper
An internal error occurred during: "JSP Syntax Validator".
org/eclipse/wst/sse/ui/internal/reconcile/validator/ValidationHelper
Y como ya se me acabó la paciencia, estuve investigando y al parecer son muchos los que tienen el mismo problema, sin embargo encontré una solución rápida pero nada atractiva, la cual es desactivar las validaciones de JSP y JSF.

Para hacer esto debemos abrir la ventana de preferencias que está en el menú MyEclipse-->Preferences...

Y desactivar las casillas para

  • JSF Application Configuration Validator,
  • JSP Content Validator,
  • JSP Semantics Validator,
  • JSP Syntax Validator

Con esto tendremos solucionado provisionalmente el error de las validaciones que muestran esas molestas ventanas emergentes cada vez que queremos guardar una archivo JSP o XML.

Comenzando con Java (1)

Como lo prometido es deuda, y para no reinventar la rueda, decidí que en vez de grabar un video tutorial y aburrirlos con mi voz, mejor les daré acceso a algunos videos que otros ya han hecho de manera muy profesional.

1. Los primeros videos son unos que me encontré mientras buscaba cómo poder ayudar a unos compañeros a los que les dí tutorías. Son unos videos que comienzan desde los aspectos básicos de Java pasando por el IDE, conceptos, bifurcaciones, iteraciones, vectores y algunos ejemplos.

http://www.videoaprendizaje.com/index.php?topic=536.0

2. Los siguientes son una serie de videos muy profesionales con el propósito de ser un curso hacia la certificación SCJP del Ing. Julio César Fuenes Ochoa liberado bajo licecia Creative Commons. Se pueden descargar dos versiones del mismo autor, de dos sitios distintos.

http://locx24.wordpress.com/2009/02/23/curso-en-videotutoriales-de-java-se-50/

http://www.kootbox.com/component/option,com_remository/Itemid,27/func,select/id,6/orderby,2/page,1/

En fin, espero que disfruten de estos videotutoriales y les sea de mucho provecho. Sigan visitándonos, pronto pondremos videos con propósitos más específicos. Si tienen peticiones puden enviarlas o seguirnos vía Twitter.


Publicado originalmente en http://swcoders.com

¿PHP o Java?

domingo, 23 de agosto de 2009

A veces algunos amigos me preguntan qué lenguaje de programación deberían aprender, y yo les digo -el que quieras-. Pero sinceramente es un poco más complicado, porque les debería preguntar primero -Bueno, ¿qué es lo que quieres hacer?-

Pero tal vez la pregunta debería redefinirse y ahora explico porqué…

Porque recuerdo que en una clase nos dejaron la tarea de comparar las tecnologías PHP, Java y .NET. Sin embargo yo creo que ambas tecnologías, PHP y Java, no pueden compararse, y no quiero decir que PHP no le llegue a los talones a Java, no me malinterpreten.

Debemos tener presente qué es PHP. PHP es una tecnología de programación para Web; para eso fue creado. Sin embargo Java es una plataforma tecnológica con el que se pueden hacer aplicaciones Web, de escritorio, móviles, y un largo etcétera. Tal vez, la comparación que debería hacerse es “¿Qué necesito para lo que quiero hacer, PHP o JSP/Servlets?”. Ya que los JSP y Servlets son un conjunto de APIs de Java que permiten programar aplicaciones para Web. Además de estos, Java cuenta con decenas de otras definiciones con los que se pueden hacer infinidad de cosas.

Por eso, si me preguntan -¿Qué lenguaje de programación deberían aprender?-, yo podría preguntarles -¿Qué es lo que necesitas hacer?- Porque con JSP y Servlets puedes hacer lo que harías con PHP y mucho más.

Ahora, no quiero caer en que se puede programar en Java igual que se haría con PHP, porque también hay que reconocer que existe una curva de aprendizaje mayor en el lenguaje Java que en PHP. Y sin mencionar que cuando uno quiere hacer cosas más complejas y robustas tendrá que aprender a usar algún framework para lograr su trabajo.

Por fuera de todo eso, lo que siempre recomiendo es, aprende Java, ya que los programadores Java tienen una gran demanda en México y muchos países y son muy bien pagados. Hay mucha documentación gratuita y profesionales dispuestos a ayudar.

Por eso, únete a nosotros y síguenos constantemente para ir aprendiendo Java. Próximamente comenzaremos con los videos…


Publicado originalmente en http://www.swcoders.com.

¿Cómo puedo aprender Java?

jueves, 13 de agosto de 2009

En el blog de http://www.swcoders.com hace algún rato publiqué un post donde explico cinco sugerencias sobre cómo aprender a programar en Java, y para cualquier lenguaje de programación funciona igualmente. Pues este es un copy&paste del mismo:

En varias ocasiones mis amigos me han preguntado sobre cómo podrían comenzar a aprender a programar en Java. Pues lo que siempre les he respondido es “leyendo y haciendo“. Cuando aprendí a programar en Java fue gracias a unos amigos que me decían lo mismo, pero ¿de dónde leer?, lo que estos amigos me decían, y lo que yo respondo ahora a los que me hacen la pregunta es que “Google tiene todas las respuestas“, bueno, aveces no todas.

Es que para aprender a programar en cualquier lenguaje y para ser aficionado a la programación, la persona debe ser un investigador nato. Y si has llegado aquí es porque estás buscando aprender, y estamos para facilitarte el aprendizaje.


Leyendo. Hay muchos tutoriales esparcidos por toda la Web, solo es cosa de saber buscar. Pues si pones “tutorial OR manual Java” en cualquier buscador obtendrás cientos de guías de aprendizaje de Java. Solo es cosa de que te sientes un fin de semana con café y frituras frente a la computadora. Si eres más tradicional, pues hay cientos de libros muy baratos en mercadolibre.com, aunque también los hay en formato electrónico. Un lugar al que siempre voy es a www.g2p.org que te ayuda con los hacks de google para buscar en los índices de servidores buscando lo que tú quieras.

Haciendo. Muchos tutoriales tienen ejemplos de práctica básicos con los que puedes comenzar a jugar. En los mismos tutoriales te explican cómo configurar tu ambiente en Windows o Linux para poder programar en Java.

No temerle al inglés. Un factor de miedo que veo en muchas ocasiones en algunos amigos que quieren aprender a programar es que muchos libros y tutoriales que consiguen están en inglés. Pero para ser aficionado a la informática en general, debes aprender a no temerle a los idiomas, y no me refiero a que seas políglota; pero como mínimo, deberás estar aprendiendo a leer el inglés mientras aprendes a programar. Pero no temas, actualmente hay muchísima información y tutoriales en Español muy profesionales y sencillos con los que puedes aprender.

Foros. También puedes suscribirte a foros donde puedes hacer preguntas respecto de tus dudas y te aseguro que más de un programador Java estará dispuesto y tendrá la respuesta que buscas. Algunos son: Foros FIT, javahispano.org, programacion.com, programacionweb.net, forodejava.com.

Podcasts. Los podcast son un medio con el cuál puedes mantenerte actualizado sobre las últimas noticias y nuevas herramientas acerca de Java. Esto te ayudará a abrirte la mente a muchas cosas que existen en el mundo Java que tal vez desconozcas. El podcast que escucho con más frecuencia es el de javahispano.org, y el de javaposse.com, en inglés.


La nota original esta aquí.

Te invito a darte una vuelta por SWCODERS y ver el material y tutoriales que hay.