viernes, 20 de junio de 2014

Conversión de archivos PDF y WORD a fragmentos en TXT en Java

Este mes estuve trabajando en una librería customizada en java la cual debía convertir ciertos documentos, algunos con extensión PDF y otros en WORD (.doc), en archivos de texto plano TXT, aparte de esta tarea se requería fragmentar los archivos TXT según ciertos indicadores de corte (TOKENS).



Todo este proceso aparentemente sin sentido era necesario pues existe una arquitectura de búsqueda de IBM denominada Content Analytics que realiza la tarea de una manera mas óptima y para lo cual requiere la fragmentación.



La parte de extracción de texto plano ,la desarrolle basandome en las siguientes API's: para PDF use iText (anteriormente denominada lowagie) y para WORD use Apache POI. Añadí finalmente un archivo de configuración (config.properties) en donde se especifica una ruta de entrada para PDF, una ruta de entrada para WORD y una sola ruta de exportación para ambos, aparte también añadí un vector de tokens para PDF separado por comas y otro vector de tokens para WORD, también separado por comas.Existen en la solución dos archivos demo.java uno es para PDF y otro es para WORD. Espero les sirva, les dejo aquí el link del drive, hasta la próxima!


lunes, 2 de junio de 2014

Eliminar sesiones bloqueantes en Oracle

En estos días tuve que lidiar con ciertos procesos en lote que al fallar causaban bloqueos en tiempo de ejecución debido a la falta de un commit o rollback dependiendo del punto de vista claro. A continuación dejo un script que me fue útil para revertir tales bloqueos teniendo en cuenta que se conoce a priori el nombre de la tabla bloqueada involucrada.




           
--1. Obtener el o los ID's del objeto tabla probablemente bloqueado:

SELECT object_id FROM dba_objects WHERE object_name='USUARIO';

--2. Obtener los valores SID para el o los ID's recuperados en el paso 1:

SELECT sid FROM v$lock WHERE id1 IN (74590,75456) 

--3. Obtener los valores de sesion usando los SID's recuperados en el paso 2:

SELECT sid, serial# from v$session where sid in (67,72,131,132,198,11)

--4. Matar sesiones bloqueantes en la tabla usando pares 'sid,serial#' del paso 3:

ALTER SYSTEM KILL SESSION '11,1202'
ALTER SYSTEM KILL SESSION '67,2405'
ALTER SYSTEM KILL SESSION '72,972'
ALTER SYSTEM KILL SESSION '131,1847'
ALTER SYSTEM KILL SESSION '132,1598'
ALTER SYSTEM KILL SESSION '198,16041'


Espero les sea de utilidad.

sábado, 24 de mayo de 2014

Obtener el IP cliente con java en un esquema HA, con proxy o balanceador de carga

Eventualmente, se puede usar el comando servletRequest.getRemoteAddr() para recuperar la direccion IP del cliente que accede a nuestra aplicación java web de la siguiente manera:

 
   String ipAddress = request.getRemoteAddr();


Pero, si el usuario se conecta via un servidor proxy (ya sea de software o hardware) o en un esquema de alta disponibilidad considerando un balanceador de carga, el código original devolvera el ip del balanceador, router o proxy, no el ip del cliente original conectado.



Para resolver este problema, se debe recuperar la direccion IP del encabezado de la peticion HTTP mas conocida como “X-Forwarded-For (XFF)“ De la siguiente manera:

            
   //el cliente esta conectandose a traves de algun otro equipo?
   String ipAddress = request.getHeader("X-FORWARDED-FOR");  
   if (ipAddress == null) {  
    ipAddress = request.getRemoteAddr();  
   }


Hasta la próxima!

jueves, 22 de mayo de 2014

Configurar Jasper Reports 5 en JBoss EAP como módulo

En esta última semana tuve que resolver un problema de dependencia para poder usar el componente Jasper Reports 5 en el servidor JBoss EAP 6 instalado en Red Hat, en mi escenario ya estaba configurado el jasper como modulo sin embargo se usaba una versión anterior a la requerida por mi aplicación (específicamente la 3) lo cual desencadenaba errores al querer ejecutar los reportes del nuevo site. Por lo cual procedí a modificar la carpeta del módulo anterior ya configurado a fin de elevar la version del Jasper, primero se debe bajar el servicio del jboss con el comando en la terminal service jboss-as stop como root claro despues localize la carpeta del módulo del jasper en la siguiente ubicación /opt/jboss6/jboss-eap-6.0/modules/JasperReport3/main/


Copie todos los archivos jar necesarios en la carpeta main antes descrita a fin de que pueda levantar el Jasper Reports 5, la carpeta quedo con los siguientes archivos (dar click en la imagen para ampliar):


Luego de copiar los archivos antes descritos se debe modificar el archivo module.xml que es finalmente en el que se configuran las dependencias en los JAR del módulo, evidentemente antes en este archivo se encontraba direccionado el jar del Jasper Reports 3 y sus dependencias por lo cual solo tuve que actualizar este documento ahora referenciando a los nuevos componentes del Jasper Reports 5 copiados anteriormente.


Luego de modificar y guardar el archivo module.xml iniciamos nuevamente el servicio con el comando en la terminal service jboss-as start como root y ya podemos usar el Jasper Reports 5 en nuestro servidor.

Si desean bajar la carpeta main completa la dejo comprimida en el siguiente enlace del drive. Espero les sea de ayuda. Hasta la próxima!

lunes, 5 de mayo de 2014

Configurar pool de conexiones en JBoss EAP


El siguiente post es referido a configurar un pool de conexiones usando el servidor de aplicaciones JBoss y variables JNDI, primero indicar que este tipo de variables nos ayudan a recuperar configuraciones del mismo entorno del servidor lo que hace mas segura y configurable a nuestra aplicacion web, por ejemplo conexiones de base de datos, URL's de web services, conexiones LDAP, etc, etc.

Primero añadimos la variable JNDI de conexion (datasource) en el servidor en la pestaña profile y la opción Datasources damos click en add, llenar los campos según sea su motor de base de datos, en mi caso use oracle y quedo como se muestra la imagen (click en la img si se desea ampliar):



Una vez configurado el datasource procedemos a activarlo con el boton enable despues de seleccionarlo y testear la conexion en la pestaña Connection de la parte inferior del detalle de la configuración.



En la clase de nuestra aplicación que recupera la conexion debemos importar dos paquetes referidos al uso de variables JNDI que son javax.naming.Context y javax.naming.InitialContext luego podemos recuperar el datasource JNDI en nuestro codigo de la siguiente manera:
 
            
Connection cn = null;
try {
 Context ctx = new InitialContext();
 DataSource ds = (DataSource) ctx.lookup("java:jboss/ConfigSistemita");
 cn = ds.getConnection();

} catch (SQLException e) {
 System.out.println(e.toString());
 cn = null;
} catch (Exception e) {
 System.out.println(e.toString());
 cn = null;
}
return cn;


Hasta la próxima!

martes, 25 de marzo de 2014

Cuida tu vista regulando el color de pantalla con f.lux



Nunca pensé sentir tanta tensión en la visión por mirar pantallas luminosas durante todo el día. En algún momento de mi vida incluso pensé que mis jóvenes ojos eran invencibles. Luego, ya hace como 3 años, empecé a tener dolores de cabeza agudos al final de cada día acompañados de fastidios como aquellos en los que te entra algo casi microscópico debido al viento, finalmente decidí medirme la vista, hace un mes presente los mismos síntomas y tuve que cambiar la medida de los lentes por segunda vez,  me di cuenta de que además de mis lentes necesitaba cambiar algo adicional.



Decidí finalmente dar un cambio y empecé a googlear  y encontré a f.lux es una aplicación que cambia la temperatura de color de la pantalla, la adaptación de la luz que se ve a la hora del día, lo que ayuda a reducir la fatiga en la vista. Hay una nueva versión beta que trae algunas mejoras realmente útiles.

Por la mañana y por la tarde, verá la luz de color azul la cual la pantalla normalmente empuja hacia fuera. Cuando se pone el sol, la luz cambiará a un color más rojizo, y cuando cae la noche, va a convertirse en una luz aún más profunda de color rojo. Cada paso que el color es adaptable, así que usted puede decidir la intensidad del color.

Es normal ver a la luz azul durante el día, pero a medida que se vuelve más oscuro, esa luz fastidia en los ojos por su intensidad. La luz rojiza es más soportable en los ojos, sobre todo por la noche, es por eso que se utilizan las luces rojas para preservar la visión nocturna.


Para cualquier persona que pasa horas detrás de una pantalla, f.lux es una aplicación obligatoria a mi parecer. Pasamos un montón de tiempo y dedicamos mucho esfuerzo en asegurarnos que utilizamos teclados ergonómicamente correctos, sillas y escritorios para nuestra postura, así que creo que es tiempo de que demos a nuestros ojos un nivel similar de tratamiento. Hasta la próxima.

domingo, 23 de marzo de 2014

El impacto de explicar a los clientes el diseño web mutidispositivo

Cuando entras a una reunión con un cliente, debemos mentalizarnos casi como visitantes del futuro. Nosotros, como profesionales web, pasamos días inmersos en los nuevos paradigmas de la web multidispositivo. Sin embargo, incluso para nosotros, el cambio y los ajustes que vienen con la vida en Internet son constantes y pueden resultar en retos abrumadores. Entonces, ¿cómo creemos que se sienten nuestros clientes?

La web actual debe ser fluida e implica cambios rápidos, agiles y repentinos. Nuestros procesos para trabajar con ella y con nuestros clientes tienen la necesidad de reflejar eso. Es hora de que nos despojemos de los vestigios mentales que hemos heredado de antiguas aplicaciones para poder construir nuevos sistemas basados en la honestidad, la inclusión y la comunicación genuina. Debemos ofrecer a nuestros posibles clientes el servicio y el proceso de inmediato, permitiéndoles ver y detectar todas las fallas, mejoras y baches en el camino. A través de esta relación se convertirán en verdaderos socios al aprender a navegar mejor en este extraño y evolucionando universo digital juntos.



La perspectiva lo es todo

Cuando nuestros clientes primero piensan en un sitio web, la imagen mental que evocan es probable que sea la de un navegador web en una computadora de escritorio. Esto es completamente comprensible, después de todo, la mayoría de sus experiencias de sitios web se producen mientras están sentados en sus escritorios, experimentando continuamente en la comodidad de sus sillas.

Desde donde estamos sentados nosotros, sin embargo, vemos la web como compuesta de muchos más dispositivos. Hasta hace poco, ha sido conveniente pensar que aquellos dispositivos son solo "smartphones", "tablets " y "laptops". Pero a medida que más dispositivos y más variados han entrado en el mercado, los cubículos digitales se han multiplicado y desbordado, a manera de una aglomeración de tamaños de pantalla, resoluciones, navegadores, sistemas operativos, convenciones, y las posibilidades de la interfaz.

Esto ha requerido una revisión en nuestro pensamiento. En lugar de sitios web es una serie de construcciones perfectas prestadas en cada pantalla en detalle exigente, los diseñadores web han comenzado a pensar en términos de sistemas complejos. La flexibilidad se ha convertido en una moneda más valiosa que la especificidad.



Si sus clientes siempre han sido parte de un proyecto de diseño tradicional antiguo, esto no es lo que estarán esperando encontrar en sus reuniones. Entonces, ¿cómo comenzamos a cerrar esta brecha? ¿De qué manera ayudamos a nuestros clientes a comenzar a ver el Internet a través de nuestras gafas de diseñador web? Por amor de Dios, ¿cómo les podemos hablar de esto?

Haga de sus comentarios un bucle

La granularidad de la retroalimentación del cliente debe coincidir con el nivel de detalle de la entrega que están viendo. Echemos un vistazo a una reacción común:

    Cliente: Hmm . La maqueta se siente un poco vacía de lo que pensé que haría.

    Yo: En el documento de especificaciones nos dijo que quería que fuera a la vez sofisticado y limpio. Tal vez esto no es suficientemente sofisticado?

    Cliente: Eso suena bastante bien. ¿En qué piensas?

    Yo: No estoy exactamente seguro de lo que parece, pero yo creo que las interacciones y banners que crearemos más tarde serán una oportunidad de tener más información en el website. ¿Por qué no vemos lo que podemos hacer ahora , tal vez revisemos el esquema de color para ser más enérgicos, entonces a ver qué podemos hacer para animar las cosas una vez que tengamos la versión desplegada. ¿Le parece bien?

    Cliente: Sí! Vamos a hacerlo.

Usted debe ajustar las cosas hasta que el cliente este de acuerdo en que estemos  lo suficientemente cerca de lo ideal. Recuerde: cada solicitud del cliente para una revisión es en realidad una petición de una conversación. Mi respuesta predeterminada a cualquier cambio es, " ¿Por qué?". Ayude a su cliente a centrarse en el "por qué ", y recordarles que averiguar el "cómo" es su responsabilidad. Centrándose en el "por qué" le ayuda a abordar la raíz del problema.

Ahora podemos empezar

Tomarse el tiempo para ayudar a nuestros clientes a entender los desafíos que enfrentamos y el papel que van a jugar en nuestro proceso que hace que sean más fáciles de comunicar y trabajar con ellos. Incluso le ayudará a construir la confianza en usted, a fortalecer su relación, y confiar más plenamente en su equipo para este y futuros proyectos. Hasta la próxima.

lunes, 10 de marzo de 2014

Aplicando la estrategia mobile offline first ante la frustración de la desconexión

Cuando se trata de la creación de aplicaciones, a menudo asumimos que nuestros usuarios son muy parecidos a nosotros. Nosotros los imaginamos con los últimos dispositivos, el software más reciente, y las conexiones más rápidas. Para esto debemos tener una variedad de dispositivos(o al menos emuladores) y navegadores antiguos para las pruebas, pasamos la mayoría de nuestro tiempo de construcción desde la comodidad de nuestros dispositivos de escritorio modernos, siempre en línea.



Para nosotros, un error de conexión o servicio lento es un problema temporal en la red de telefonía o wifi el cual es rutinario. Desde esta perspectiva, se tiene la tentación de pensar en la conectividad, móvil o de otro modo, como algo que se resolverá por sí mismo con el tiempo, a medida que una mayor cobertura de la red y un servicio más rápido. Y eso funciona, siempre y cuando nuestros usuarios a mantenerse por encima del suelo en grandes y muy modernas ciudades bien desarrolladas, pero este no es el caso siempre.

Pero, ¿qué sucede una vez que suben en el metropolitano o al tren eléctrico, a bordo de un avión, en un viaje por tierra, o ir a visitar el campo? O cuando se paran en la esquina con menos cobertura de un edificio o simplemente se encuentran como parte de una gran multitud? Nuestras aplicaciones con UX cuidadosamente construidas se convierten en fuentes de frustración, porque confiamos tan
plenamente en ese enlace que irá supuestamente de nuevo a nuestros servidores.

Esta dependencia hace caso omiso de una verdad fundamental: Desconectado es simplemente un hecho de la vida. Si usted usa un móvil, usted estará desconectado en algún momento. Sin embargo. Hay maneras de tratar con este hecho.

Como encontrar el balance de conexión?

Las aplicaciones web solían ser completamente dependiente del servidor que hace todo el trabajo , y el cliente sólo muestra el resultado. Cualquier interrupción en la conexión era un problema importante : si usted se encontraba desconectado, no podía usar la aplicación.

Ese problema se resuelve, en parte, por los clientes más ricos, donde más de la lógica de la aplicación se ejecuta en el navegador como google docs (actualmente google drive), por ejemplo. Pero para una experiencia adecuada de offline first, también se desea almacenar los datos en la parte front, y si se desea que se sincronice con el almacén de datos del servidor. Felizmente, las bases de datos en el navegador están madurando, y hay un número cada vez mayor de soluciones para esto como derby.js, Lawnchair, hoodie, firebase, remotestorage.io, sencha touch entre otros- los cuales resuelven los aspectos técnicos
cada vez de manera más fácil.

Pero tenemos problemas más grandes y mucho más raros: el diseño de las aplicaciones y sus interfaces de conectividad intermitente conducen a una gran cantidad de nuevos escenarios, problemas y errores que debemos controlar dependiendo del negocio.

La experiencia de uso de un sitio web o aplicación sin conexión debe ser mucho mejor, menos frustrante y de más potencia. Necesitamos el equivalente UX de diseño de páginas web sensibles : un fuerte catálogo de guías y patrones para un mundo multidispositivo desconectado. Pues actualmente el usuario final no solo se conecta desde su móvil sino también desde la PC o tablet.



Entendiendo el ciclo de vida de la conectividad

La mayoría de las aplicaciones web tienen dos puntos de conexión relacionados de fracaso los cuales son:
el envío desde el cliente y la recepción del cliente (llega a ser equivalente a demanda de servidor).
Dependiendo de lo que hace su aplicación, es posible que el usuario final desee 3 cosas:

1. Comunicar u ocultar explícitamente el estado de conectividad y sus cambios (por ejemplo, en un cliente de chat sería informar a los usuarios que los nuevos mensajes escritos no se envían inmediatamente).

2. Permitir la creación del lado del cliente y funciones de edición, incluso cuando la aplicación se encuentre fuera de línea, y tranquilizar a los usuarios que sus datos están seguros y eventualmente se enviarán hacia al servidor (pensar en una aplicación para compartir fotos que le permite tomar y publicar fotos en cualquier circunstancia).

3. Deshabilitar, modificar, o incluso ocultar características que no pueden trabajar fuera de línea, en lugar de dejar que la gente las vea y no las pueda usar (imagine un botón de "enviar" que se transforme en un botón "enviar al recuperar la conexión").



A fin de ayudarnos entre sí y también a futuras generaciones de diseñadores, desarrolladores y expertos en interfaces de usuario (UX), te invitamos a unirte a la discusión en offlinefirst.org. La meta futura es la de crear un manual en línea que incluye los patrones UX y anti-patrones, las opciones de tecnología, y la investigación sobre el usuario. Hasta la próxima!

miércoles, 26 de febrero de 2014

Temas para bootstrap

Si a alguno de ustedes se les ha ocurrido customizar un poco su web móvil con bootstrap pero no tiene el tiempo suficiente como para modificar los css y crear un skin desde cero, este recurso les servirá de mucho.



Entren a http://bootswatch.com/ , escojan el tema que más se acomode a su necesidad, luego solo deben bajar los dos siguientes archivos en css: bootstrap.css y bootstrap.min.css y reemplazarlos en su proyecto, aconsejo desde luego hacer un backup de estos dos archivos originales en caso quieran volver a su tema anterior. Hasta la próxima.

martes, 11 de febrero de 2014

Elegir PhoneGap, Bootstrap ó JQuery Mobile

Por lo general cuando nos toca desarrollar un sitio web móvil a medida es determinante el momento en que decidimos que tecnología y frameworks usar, en especial si de diseño se trata. Una forma de ayudar a nuestra elección es el análisis del las ventajas y desventajas que tienen las opciones disponibles actuales que se muestran en el título de este post. Bien, empezemos por aclarar que estas tres herramientas fueron creadas para resolver diferentes problemas con diferentes enfoques.



PhoneGap es esencialmente un wrapper (navegador) que enmarca la aplicacion web el cual permite acceder a librerias nativas (API's) de los dipositivos (como la camera, bluetooth, etc.) haciendo uso del lenguaje JavaScript.

Bootstrap es un framework web preparado para aplicar la técnica del responsive design. Su propósito es adaptar la vista según se a el dispositivo con el que se acceda. Proporcionando diferentes presentaciones para smartphones, tablets, PC's, etc.

jQueryMobile es un framework web móvil que permite la vista multiplataforma móvil de la aplicación web reescribiendo enteramente los elementos JavaScript, HTML y CSS.

Ahora teniendo en claras estas definiciones pasamos a los Pro's y los Contras de los frameworks antes mencionados.

Bootstrap:
Pro: Fácil de aprender, fácil de configurar y customizar.
Pro: Muchos websites lo usan como por ejemplo twitter, la nasa, etc.
Con: UX limitada, esta es un área en la que jQuery tiene la ventaja, especialmente si usas sliders o menus drop down. Los sliders en bootstrap no son arrastrables en los móviles.

jQuery Mobile:
Pro: Interfaz más amigable al usuario final.
Pro: Fácil de aprender, especialmente si has usado antes la librería jQuery.
Con: Necesita mayor inyección de data para una mejor experiencia de usuario, esto podría hacer que tu aplicación dinámica sea muy compleja de modificar.

PhoneGap:
Pro: Fácilmente te permite crear aplicaciones web interplatforma haciendo uso de JavaScript/HTML/CSS y brinda acceso a las APIs del dispositivo.
Con: El tiempo de respuesta en especial en android es mayor que los frameworks antes mencionados.

Conclusión mucho depende del enfoque que busques darle a tu aplicación y de sus particularidades. Por ejemple si se quiere algo netamente informativo bastaría con bootstrap, si se desea una interfaz más atractiva para el usuario podría usarse jQuery Mobile y si lo que se desea es interacción con las API's nativas de los dispositivos PhoneGap. Hasta la próxima.

viernes, 7 de febrero de 2014

Obtener el sistema operativo cliente usando javascript

En una ocasión anterior les había comentado como obtener el navegador y la versión con PHP, en este post les comentaré algo que tiene una utilidad parecida pues también nos sirve para hacer una bifurcación en caso tengamos una aplicación web para escritorio y otra para el móvil, se que también existe el responsive design con su estrategia mobile first lo cual evitaría el uso de esto pero el código a continuación les puede servir también en otros casos como hacer compatibles en un website otras muchas cosas, por ejemplo si entras en tu website y tu tienes una aplicación en google play y otra en la appstore de apple puedes mostrar el enlace según sea el móvil con el que accedan a tu website o mejor dicho según el sistema operativo que tenga el móvil (Android o IOS) lo cual permite una mejor experiencia de usuario al recomendar la aplicación segun sea el sistema operativo cliente. A continuación les dejo el código para determinar dos variables booleanas y evaluar si el origen es un dispositivo con android o un dispositivo con ios.

            
var ua = navigator.userAgent.toLowerCase();
var esAndroid = ua.indexOf("android") > -1;
var esiPhone = ua.indexOf("iphone") > -1;
var esWPx = ua.indexOf("windows phone") > -1;


El siguiente paso solo sería evaluar estas variables en una condicional y mostrar la información requerida (en este caso el enlace a descargar la aplicación Android o el enlace a descargar la aplicación IOS) según sean las variables booleanas recuperadas.

Hasta la próxima.

miércoles, 22 de enero de 2014

Compartir cookies entre dominios (Crossdomain cookies)

La semana pasada me tope con un problema muy particular, actualmente estoy laborando en una institución que tiene implementado un esquema de alta disponibilidad (HA) el cual consiste en un balanceador de carga y dos servidores cada uno con su replica de la aplicación web, digamos pe1.dominio.com y pe2.dominio.com, por lo que si existe una configuración frecuente en una de ellas al redirigir a la otra mediante el balanceador las cookies no pueden ser vistas y la configuración frecuente del usuario no se mostrará. Lo que se requiere evidentemente es que dos dominios compartan de alguna manera las cookies con la configuración frecuente requerida en el login.
Entonces me puse a investigar un poco, de todo lo que pude encontrar seleccione inicialmente dos alternativas una que no muy legal por asi decirlo y que no es compatible con todos los navegadores por el javascript que se debe de usar, es la siguiente: método via XSS . La otra opción era recurrir al almacenamiento en cliente propio del html5.
Finalmente me di cuenta que no existe un estándar para compartir las cookies entre dominios, en teoría una cookie sirve para un dominio y un navegador, por lo que hacerlo vía javascript no es compatible con todos los navegadores, pero pense un poco mejor y habría otra opción (al menos en teoria): 

1. Centralizar todas las cookies en un único tercer dominio, digamos gestorcookie.dominio.com 
2. Cuando el usuario hace una petición a pe1.dominio.com o a pe2.dominio.com le debe redirigir a gestorcookie.dominio.com
3. gestorcookie.dominio.com le vuelve a dirigir de nuevo a pe1.dominio.com o a pe2.dominio.com segun sea el origen con la información que se necesita.

Aclaro que quizás desde otro punto de vista no sea muy seguro, y se tiene que crear algún tipo de artificio con variables post o get entre el dominio gestor de cookies y los dominios pe1 y pe2 tanto para la creación como para la lectura de este tipo de variables. Ahora la pregunta: Alguien se atreve a implementarlo? . Si logran hacerlo por favor compartan. Hasta luego.

jueves, 16 de enero de 2014

Comunicación entre aplicaciones web usando xml, java y javascript

En estos días me tope con un problema a resolver y se trata de verificar la creación de un archivo PDF en una aplicación web distinta a la mia, el cual en el ejemplo que explicaré a continuación denominaremos cargo. Evidentemente tuve que modificar las dos aplicaciones para que se puedan comunicar de alguna manera, en este caso opte por XML, la arquitectura quedó masomenos del siguiente modo:


En donde Rich Client vendria a ser la aplicacion cliente y Server es la aplicacion donde se vericará la creación/existencia del registro en base de datos o archivo en PDF en este caso ya que podría servir para verificar ambos.

Primero configuramos en el Server el XML de respuesta que se enviará al cliente en base a algunos parámetros get, en este caso el número de cargo y el tipo de cargo, para lo cual necesitamos crear un servlet al cual nombrare ValorPosible.java en la aplicación servidor que contenga lo siguiente:

response.setContentType("text/xml;charset=ISO-8859-1");
      PrintWriter out = response.getWriter(); 
      int tipoval = Tool.parseInt(request.getParameter("tipoval"));
      String resultado = "-1";
     
      switch(tipoval)
      {
      case 70://validar si  hay algun tipo de documento registrado de un cargo
        {
            String nCargo = request.getParameter("nCargo");
            String nTipo = request.getParameter("nTipo");
            String query = "select count (*) NUM from w_doc_cargo where ncargo="+nCargo+" and ntipo="+nTipo;
            int conta =Tool.parseInt(Tool.obtieneDatos(query).getString("NUM"));
            out.print(
                  " \n" +
                  " \n" +
                  "" + conta  + " \n" +
                  "");
              break;
        }
    }
    out.close();
}


Ahora configuraremos la aplicación cliente, primero debemos agregar en la pagina JSP que desea verificar la existencia del archivo la siguiente funcion javascript, si desean pueden hacerlo invocando un archivo js externo o dentro del jsp no hay problema.

            
function retValXml(url1)
{
           if (window.XMLHttpRequest)
             {
             xmlHttp=new XMLHttpRequest();
             }
           else // for older IE 5/6
             {
             xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
             }
           var url=url1;
           xmlHttp.open("GET",url,false);
           xmlHttp.send();
           var dom=xmlHttp.responseText;
           return dom.split("Valor")[1].substr(1, dom.split("Valor")[1].length-3);
}

También agrego otra función javascript que será finalmente la que determinará la exitencia del registro o archivo en la aplicación servidor mediante la comunicación por XML.

            
function VisualizarPDF(nCargo, nTipo)
{   var url="http://server/servlets/ValorPosible?tipoval=70&nCargo=" + nCargo;
    var ret = retValXml(url);
    if(trim(nCargo)=="")
    {
        alert("Ingrese un número de cargo");
    }
    else if(ret=="0")
    {       
        alert("El número de cargo no existe");
    }
    else
    {
        //...Aqui va el codigo para redirigir hacia la url/ubicación predefinida de los cargos
        window.location.href = 'http://server/ruta/predefinida/pdfs/' + nCargo + ".pdf";
    }
}

Nótese que en la pagina JSP de la aplicación cliente en la funcion javascript anterior invocamos al servlet de la aplicación servidor en la línea:

var url="http://server/servlets/ValorPosible?tipoval=70&nCargo=" + nCargo;

Solo nos quedaría testear nuestra funcion invocandola desde un hipervinculo o enlace de la siguiente manera:

<a href="#" onclick="javascript:VisualizarPDF(1,70);" > Descargar </a>

Evidentemente en la aplicación este link debe tener el parámetro número de cargo como dinámico en la función VisualizarPDF en este caso estoy pasando el codigo de cargo "1", despues de verificar la existencia se redirige hacia el archivo "1.pdf" ubicado en la ruta predefinida de archivos en la aplicacion servidor o en la que configuremos en el código.

Hasta luego.

viernes, 10 de enero de 2014

Editor de gráficos web con hoja de cálculo en google drive

Después de un largo tiempo ausente me anime a publicar algo así que al actualizarme un poco en visualization encontré un componente gráfico muy útil que se llama chart editor, para visitar la página y descargar el código original en code playground click aquí. Así que me puse a modificar un poco el código del editor original lo cual iré comentando en este artículo.

Primero debemos entender como es que genera los diferentes tipos de gráficos este asistente en web, por lo general podemos usar un rango seleccionado de celdas de una hoja de calculo alojada en google drive, debemos tener en cuenta que tal hoja de calculo debe estar en modo compartido público de los contrario no podrá cargarse la data, hay otro modo de usar este generador de gráficos web al establece un data table haciendo uso de JSON lo cual publicaré en otro artículo.

Entonces manos a la obra, primero debemos crear una hoja de calculo en drive y compartirla como pública de la siguiente manera:


Después click en el botón compartir y definir como público.


La dirección pública generada por drive de mi hoja de cálculo por ejemplo es:

https://docs.google.com/spreadsheet/ccc?key=0AplEIWl3vfe3dEk2TkJrdjBESkpkcHFJRV9lLUJ0bmc&usp=sharing

Luego modificamos el código del chart editor en el campo denominado dataSourceUrl y establecemos el rango de celdas en ese campo


Primero debemos cambiar el parámetro llamado key por el parámetro key de la dirección publica generada por drive de nuestra propia hoja de calculo, también el parámetro range en mi caso puse B3:C5 pues es el intervalo en el que se encuentra la data en la hoja de calculo (notar el intervalo en la segunda imagen de este articulo que muestra el contenido de la hoja de calculo).

Finalmente probamos el código abriendo el archivo html modificado en el navegador


Para cambiar de tipo de gráfico solo deben darle click en la opción abrir chart wizard y si quieren obtener el código estático para embeberlo en cualquier pagina denle click en obtener embed y copian el código generado en el text area de la parte inferior.

Vale resaltar que modifique un poco el código original del chart editor de google code playground para que me generase un código embebido y así poder usarlo en todos lados sin necesidad de conexión a internet, si alguien encuentra otra forma de hacerlo por favor compartirlo. Finalmente les dejo mi código modificado del chart editor a continuación: Ver/Descargar Código HTML.