Archivo

Posts Tagged ‘JavaScript’

Novedades y bugs resueltos en Oracle Forms 12.2.1.3.0

Recientemente Oracle ha publicado la nueva versión de Forms 12.2.1.3.0, incluida en Oracle Fusion Middleware 12c, de la que podemos anunciar novedades muy interesantes:

  • Integración con Javascript en la configuración de Java Web Start y FSAL (Forms standalone Launcher).
  • Servicios para despliegue de Forms (FADS).
  • Soporte para fijar el tamaño de la smart bar con un nuevo parámetro del applet.
  • Soporte para el Row Banding.
  • Diálogos de abrir fichero, guardar y guardar como modernizados.
  • Soporte para obtener la fecha de modificación a través de webutil.
  • Configuración avanzada para el EM.
  • Propiedades de iconos y de estilo del cursor.
  • Soporte para varios monitores.

En este enlace podéis encontrar todas las novedades que hemos citado, además de descargaros la nueva versión en la página de descargas de Oracle Forms & Reports 12c. Nosotros ya hemos instalado esta nueva versión y en breve os seguiremos informando sobre las novedades más importantes.

Leer más…

Oracle JET y la realidad aumentada

Hoy me gustaría enseñaros como una aplicación híbrida realizada con Oracle JET (Framework JS) puede ser tan potente como deseemos sin tener que realizar un desarrollo nativo. Y, además, para apoyar esta demostración me serviré de la realidad aumentada.

jetOracle JET está dirigido a desarrolladores JavaScript que trabajan en aplicaciones en el lado del cliente, y es una colección de librerías JavaScript de código abierto que junto a las librerias propias de Oracle permiten crear aplicaciones que se consumen e interactúan simple y eficientemente con otros productos Oracle.

Más información en este otro post introductorio a Oracle JET.

1
La realidad aumentada consiste en combinar el mundo real con el virtual mediante un proceso informático, enriqueciendo la experiencia visual y mejorando la calidad de comunicación.
Gracias a esta tecnología se puede añadir información visual a la realidad y crear todo tipo de experiencias interactivas.

 

El Desarrollo:

Hemos elegido JET como Framework de desarrollo de aplicaciones de movilidad por su agilidad a la hora de desarrollar y por la facilidad al acoplar plugins cordova.

Para el desarrollo de la realidad aumentada nos basaremos en un plugin cordova, mediante el cual podremos comunicarnos con lenguaje JavaScript y de esta forma explotar las apis del dispositivo.

Paso a paso:

Gracias a Yeoman podemos agilizar el desarrollo de aplicaciones JET, ya que nos genera un esqueleto básico de la aplicación.

Para ello ejecutaremos el comando:

yo oraclejet:hybrid <<NombreDelProyecto>> –platforms=<<ANDROID,IOS…>>

yo oraclejet:hybrid augmentedReality –platforms=Android

Leer más…

Categorías:JavaScript Etiquetas: , ,

Oracle PCS – Reglas de formulario en las tareas humanas

En Oracle BPM es posible utilizar Oracle ADF para implementar tareas humanas, pero en Oracle Process Cloud Service solo se pueden crear formularios utilizando web forms. Crear un formulario es una tarea sencilla y nos ofrece la posibilidad de definir reglas que nos permiten conseguir requerimientos complejos.

1

Para cada uno de los elementos del formulario tenemos una serie de propiedades o eventos que podemos gestionar. Por ejemplo el evento onload del formulario, u obtener si el valor de un campo es válido, etc.

2

Para construir las reglas debemos usar JavaScript y podemos obtener los fragmentos de código, para cada uno de los eventos o propiedades, si hacemos click en el botón a la derecha de cada uno.

3

Vamos a construir un par de reglas para que podáis ver lo sencillo que es.

Leer más…

Categorías:Cloud Etiquetas: , ,

Problemas de rendimiento en una JVM

agosto 20, 2015 1 comentario

java

Si te dedicas a la administración de sistemas Middleware, tarde o temprano acabas encontrando problemas de rendimiento sobre las aplicaciones. Hay muchos factores que pueden afectar al rendimiento, como puede ser una aplicación mal desarrollada, consultas en base de datos con tiempo de ejecución elevado, latencias de comunicaciones y un largo etcétera.

En el caso de WebLogic, las instancias no son otra cosa que un proceso Java y, como tal, una mala configuración también puede empeorar el rendimiento.

En este post nos vamos a centrar en la configuración de la memoria de procesos Java.

¿Qué información necesitamos?

Para poder analizar el comportamiento de la memoria de procesos Java es imprescindible recoger las trazas de Garbage Collector (GC). Esto se configura en el arranque del proceso Java mediante unas variables.

Estas trazas aportan datos sobre:

  • Tiempo de ejecución de GC.
  • Estado de la memoria (young, old y permanent) antes y después de las limpiezas.
  • Si se han ejecutado Full GC (FGC) y cuánto han estado ejecutándose: este dato es especialmente importante puesto que durante un FGC la instancia se queda congelada.

Un ejemplo de esta información sería (en esta traza de ejecución no se han realizado FGC):

2015-08-19T00:49:03.965+0200: 9,759: [GC pause (young), 0,0176360 secs]
   [Parallel Time: 15,7 ms, GC Workers: 2]
      [GC Worker Start (ms): Min: 9759,0, Avg: 9759,3, Max: 9759,6, Diff: 0,6]
      [Ext Root Scanning (ms): Min: 3,2, Avg: 3,5, Max: 3,7, Diff: 0,5, Sum: 7,0]
      [Update RS (ms): Min: 0,0, Avg: 0,0, Max: 0,0, Diff: 0,0, Sum: 0,0]
         [Processed Buffers: Min: 0, Avg: 6,5, Max: 13, Diff: 13, Sum: 13]
      [Scan RS (ms): Min: 0,0, Avg: 0,1, Max: 0,1, Diff: 0,1, Sum: 0,1]
      [Object Copy (ms): Min: 11,8, Avg: 11,8, Max: 11,8, Diff: 0,0, Sum: 23,6]
      [Termination (ms): Min: 0,0, Avg: 0,0, Max: 0,0, Diff: 0,0, Sum: 0,0]
      [GC Worker Other (ms): Min: 0,0, Avg: 0,0, Max: 0,0, Diff: 0,0, Sum: 0,1]
      [GC Worker Total (ms): Min: 15,1, Avg: 15,4, Max: 15,7, Diff: 0,6, Sum: 30,8]
      [GC Worker End (ms): Min: 9774,7, Avg: 9774,7, Max: 9774,7, Diff: 0,0]
   [Code Root Fixup: 0,1 ms]
   [Clear CT: 0,1 ms]
   [Other: 1,8 ms]
      [Choose CSet: 0,0 ms]
      [Ref Proc: 1,6 ms]
      [Ref Enq: 0,1 ms]
      [Free CSet: 0,1 ms]
   [Eden: 89,0M(89,0M)->0,0B(89,0M) Survivors: 13,0M->13,0M Heap: 102,2M(2048,0M)->15,0M(2048,0M)]
 [Times: user=0,03 sys=0,00, real=0,02 secs]

¿Cómo interpretamos esta información?

A pesar que las trazas de GC se pueden abrir con cualquier editor de texto, analizar estas trazas manualmente es muy tedioso y lento.

Hay varias herramientas que permiten ver esta información gráficamente y que, además, muestran estadísticas. La más comúnmente utilizada es GCViewer. Es un proyecto opensource que se mantiene vivo.

Antes de empezar

Explicar cómo ver si hay algún problema y cómo solucionarlo es un tema para el que se han escrito libros enteros, por lo que es imposible explicarlo en un post.

Aunque va a gustos, dejo algún libro que he utilizado como referencia (para mi opinión, de obligada lectura si te dedicas al sector):

  • Java Performance: The Definitive Guide“, de Scott Oaks
  • Java Performance“, de Charlie Hunt y Binu John (chapter 7: Tuning the JVM, Step by Step)

Antes de empezar, hay que tener muy en cuenta que:

  1. Realizar un buen análisis es una tarea que no se realiza en un momento. En la mayoría de los casos estamos hablando de una semana de trabajo exhaustivo.
  2. Una mala configuración puede empeorar el rendimiento. Puede llegar a ser peor el remedio que la enfermedad.

Resumiendo: ármate de paciencia y de buena documentación.

Ideas generales

  1.  ¿Cada vez que se ejecuta un FGC es realmente necesario? En versiones anteriores de JDK, cada 60 segundos se ejecutaba, de forma sistemática, un FGC. Este comportamiento no es el deseado, pero se puede evitar añadiendo unas variables en el arranque del proceso Java.
  2. Ampliar el tiempo entre ejecuciones de FGC puede sacar a la luz otros problemas. Los FGC ejecutados sin necesidad pueden estar ocultando leaks de memoria, que acabarían degradando aún más el rendimiento del proceso Java.
  3. Aumentar los espacios de memoria (sea cual sea) provoca un aumento en el tiempo de ejecución de GC y FGC. A veces, menos es más.
  4. La solución no tiene por qué venir únicamente del tuning de la VM. En algunos casos, pasa por el desarrollo de la aplicación que corre por encima (reducir los objetos en memoria y/o el tiempo de permanencia de estos objetos en memoria).
  5. Si se observa que el espacio de memoria young se llena con facilidad y estos objetos se van promocionando a la old, para al poco tiempo borrarse de la old, una solución podría ser aumentar el tamaño de la zona Young en detrimento de la old con el objetivo de disminuir estas promociones a la zona old, además de disminuir el tiempo y frecuencia de los FGC.
  6. Cada vez que se modifica un parámetro de configuración en el arranque, hay que volver a recolectar logs de GC para realizar una comparativa y ver si el cambio ha sido positivo.

Modificar archivos propiedades WebLogic 12c en tiempo de ejecución

Muchas veces nos encontramos con la necesidad de modificar en tiempo de ejecución los valores de variables definidas en archivos .properties. Para que estos archivos puedan ser modificados por las aplicaciones o por otro proceso externo (incluso por nosotros mismos mediante un editor de texto) deberán estar situados en una carpeta del sistema de archivos y hallarse fuera de cualquier paquete .ear, .war o .jar.

Tenemos que decidir como accedemos a los archivos en disco:

  1. Usando una ruta absoluta y cargado el archivo, típicamente mediante la clase File, por ejemplo: File file = File(“C:\\abcfolder\\textfile.txt”);
  2. Usando una ruta absoluta obtenida previamente de un archivo .properties incluido en la aplicación, a la que se concatena el nombre del archivo
  3. Apoyándonos en el cargador de clases de la aplicación y creando una librería compartida que incluya una carpeta ‘classes’, donde pondremos nuestros archivos .properties.

Elegir la primera de las opciones no es una buena práctica: si cambia la ubicación del archivo, estaremos obligados a volver a compilar y desplegar nuestra aplicación.

La segunda es una buena opción, pero la tercera tiene la ventaja de poder versionar fácilmente los recursos almacenados en el disco.

Además, los programadores de la aplicación podrá usar el cargador de clases para localizar el archivo sin especificar la ruta o creando una estructura de sub-carpetas a partir de la raíz del classpath (la carpeta ‘classes’), si así lo desean.

Vamos a realizar una pequeña aplicación que haga uso de una librería compartida con un único archivo de propiedades conteniendo dos variables: usuario y contraseña. Si ambos valores introducidos en la página inical coinciden con los valores en el archivo, se mostrará una segunda página indicándonos que hemos tenido éxito en la autenticación; de lo contrario, nos llevará a una tercera diciendo que el usuario o la contraseña no coinciden. Con este sencillo ejemplo podremos cambiar el archivo Credentials.properties y verificar que la aplicación toma los cambios cada vez que suceden.

Veamos la estructura que tendrá nuestra librería compartida antes de ser desplegada:

Estructura de archivos de la libraría

Estructura de archivos de la libraría

Si desplegamos esta carpeta en Weblogic como ‘Biblioteca’ y en el apartado ‘Accesibilidad de Origen’ marcamos la opción ‘Usar Valores por Defecto Definidos por Destinos de Despliegue’ estaremos indicando al servidor de aplicaciones que los archivos localizados en ‘WEB-INF/classes’ serán modificables en tiempo de ejecución por las aplicaciones que hagan referencia a esta librería desde sus weblogic.xml.

La aplicación aquí descrita tiene el siguiente contenido dentro de ‘weblogic.xml’

mikel_blog_modifPropWeblogicXML

La etiqueta <librar-ref> permite a la aplicación hacer uso de la librería cuya versión de implementación detalla mediante <implementation-version>

Y ya sólo nos queda conocer cómo accede nuestra aplicación a este recurso. La forma más sencilla es con un método en el ManagedBean de la página principal que será invocado cuando se pulse el botón ‘Login’.

mikel_blog_modifPropJava

Desplegamos la librería compartida y a continuación la aplicación.

mikel_blog_modifPropResult1

mikel_blog_modifPropResult2

Podéis descargar el proyecto completo para JDeveloper aquí.

Categorías:WebLogic Etiquetas: , ,

ADF tips (MOBILE): Llamar a un servicio web

ADF tips (MOBILE)

Si su empresa ha apostado por SOA y necesita implementar una aplicación móvil, la forma natural de alimentar de datos esta aplicación será mediante servicios web.

ADF Mobile permite la integración con servicios web de forma fácil con el componente “Web Service Data Control”. Este tipo de “data control” permite acceder tanto a servicios SOAP como a servicios REST. A continuación vamos a mostrar un ejemplo de cómo incorporar una llamada a un servicio web en una aplicación ADF Mobile.

Para poder realizar esta demostración hemos creado un servicio web en una instalación local de Oracle Service Bus. El servicio consiste en una operación que devuelve una lista de frutas. En este post no entraremos en cómo implementar el servicio web. Por otro lado, vamos a suponer que ya disponemos de una aplicación móvil en desarrollo, a la que vamos a incorporar la llamada al servicio.

Paso 1: crear el “data control”
Seleccionamos el proyecto “ApplicationController” y a continuación llamamos a la galería para crear un nuevo objeto. En este caso, seleccionamos la opción “Data Control” dentro de la rama “Business Tier”. En las opciones que aparecen escogemos “Web Service Data Control (SOAP/REST)”. A continuación se inicia el asistente.

nuevo_dataControl

En el asistente se nos pide un nombre para el “data control”, que indiquemos el tipo (en nuestro caso, se trata de un servicio SOAP) y que especifiquemos la URL del descriptor del servicio (WSDL).

asistente1

Leer más…

ADF tips (MOBILE): Ejecutar un método javascript desde java

septiembre 17, 2013 1 comentario

ADF tips (MOBILE)

ADF Mobile permite extender su funcionalidad estándar mediante el uso de javascript, css3 y html5. En este post vamos a ver cómo podemos invocar un método javascript desde una clase java de nuestra aplicación.

Para nuestro ejemplo, implementaremos un método para mostrar mensajes emergentes. Un caso habitual en las aplicaciones, que requieren que en determinados casos se muestre un mensaje emergente cuyo texto cada vez sea distinto y que necesita ser aceptado por el usuario.

ADF Mobile está desarrollado sobre la plataforma Phonegap/Cordova (en función de la versión) y en esta plataforma existe una API en javascript que permite crear este tipo de avisos. En concreto, el método que vamos a usar es el siguiente:

    navigator.notification.alert(message, alertCallback, [title], [buttonName])

Los parámetros que espera la función son:

  • message: texto del mensaje a mostrar
  • alertCallback: función javascript a ejecutar una vez el usuario acepta el mensaje. Si no se va a ejecutar ninguna acción, se puede pasar el valor null.
  • title: título a mostrar en la ventana del mensaje
  • buttonName: texto que aparecerá en el botón que cierra el aviso

Así pues, el objetivo que nos proponemos es crear una clase java que nos permita crear avisos mediante una llamada al método javascript indicado. ADF Mobile tiene una serie de clases públicas con distintas utilidades que permiten realizar diferentes acciones sobre el framework. Una de las acciones que permite es la de invocar métodos javascript. La clase que contiene esta utilidad es AdfmfContainerUtilities. El método que sirve para realizar las llamadas es el siguiente:

public static java.lang.Object invokeContainerJavaScriptFunction(java.lang.String featureId,
                                                                 java.lang.String methodName,
                                                                 java.lang.Object[] args)
                                                        throws AdfException

Leer más…