Archivo

Posts Tagged ‘JavaScript’

Novedades y bugs resueltos en Oracle Forms 12.2.1.3.0

octubre 13, 2017 2 comentarios

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…

Agregar librerías de terceros en Oracle JET usando Bower

junio 9, 2017 3 comentarios

El mundo JavaScript es enorme y con una gran comunidad que nos proporciona multitud de líneas de código ya desarrolladas. Para tener un control sobre cada una de estas líneas, y no tener que estar buscando en Google cada una de las librerías, ha nacido “Bower”.

¿Qué es Bower?

Si buscamos una definición encontramos que Bower es una especie de manejador de paquetes para la web, es decir, cualquier librería de código abierto necesaria para el desarrollo de un front-end.

Es probable que se confunda npm con bower, ya que el concepto y funcionamiento es bastante similar, y la diferencia estriba en que npm está enfocado a módulos y Bower está enfocado y optimizado para el front-end.

 

Ejemplos de uso:

bower install jquery
bower install knockout

Estructura

Cada vez que instalamos un paquete a través de Bower, éste genera una carpeta llamada “bower_components”, en la cual se descargan todos los componentes descargados a través de la herramienta.

El desarrollo

Hoy, desarrollaremos una aplicación híbrida usando una librería muy conocida en el mundo JavaScript como es threeJS.

Dividiremos el desarrollo en 4 pasos:

  • Preparar estructura de la app
  • Instalar threeJS con Bower
  • Configurar Grunt para recuperar las nuevas librerías
  • Desarrollar la animación 3D que deseamos mostrar.

¿Qué es ThreeJS?

Three.js permite la creación de animaciones 3D aceleradas por GPU utilizando el lenguaje JavaScript como parte de un sitio web sin depender de los complementos de navegación propietarios. Esto es posible gracias a la llegada de WebGL.

Las bibliotecas de alto nivel, como Three.js o GLGE, SceneJS, PhiloGL o una serie de otras bibliotecas, hacen posible la creación de complejas animaciones en 3D que se muestran en el navegador sin el esfuerzo de realizar una aplicación independiente o un plugin.

Véase: https://en.wikipedia.org/wiki/Three.js
Leer más…

Animaciones 3D con Three JS y Oracle JET

En el día de hoy me gustaría enseñaros la librería JavaScript ThreeJS.

¿Qué es ThreeJS?

Three.js permite la creación de animaciones 3D aceleradas por GPU utilizando el lenguaje JavaScript, como parte de un sitio web, sin depender de herramientas adicionales. Esto es posible gracias a la llegada de WebGL.

Las bibliotecas de alto nivel como Three.js o GLGE, SceneJS, PhiloGL (o una serie de otras bibliotecas) hacen posible la creación, y posterior muestra en el navegador, de complejas animaciones en 3D sin el esfuerzo de tener que realizar una aplicación independiente o un plugin.

Véase: https://en.wikipedia.org/wiki/Three.js

El objetivo

El objetivo de este post es desarrollar una aplicación capaz de generar una matriz, y que además, la aplicación pueda moverse por ella después de haber utilizado el giroscopio del dispositivo.

El desarrollo

Antes de empezar debemos identificar o crear el contenedor donde se creará el canvas en el que se visualizará nuestra animación 3D. En este caso utilizaremos el div “pageContent”, este div lo hemos creado en el index.html donde se visualizarán los distintos módulos de la aplicación; por defecto viene creado en el template “navdrawer”.

var container = document.getElementById( ‘pageContent’ );

El siguiente paso será crear la cámara. Este objeto pretende imitar la forma en que el ojo humano ve. Es el modo de proyección más común utilizado para la representación de una escena 3D.

var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);

Para la representación de la cámara necesitamos 4 parámetros:

fov — Camera frustum vertical field of view.
aspect — Camera frustum aspect ratio.
near — Camera frustum near plane.
far — Camera frustum far plane.

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:TxD - Mobile 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…

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í.