Etiqueta

16 de septiembre de 2019

Conexión nativa a Microsoft SQL Server con Omnis Studio 10

Recientemente el DAM para Sybase de Omnis Studio 10, ha sido modificado para su uso mediante la versión "open-source" de LIBCT desarrollada por FreeTDS. FreeTDS facilita principalmente conexión libre de uso, para servidores Sybase ASE y Sybase ASA. Pero resulta que la librería LIBCT de FreeTDS, también soporta conexiones nativas a Microsoft SQLServer, anteriormente, esto sólo era posible mediante los DAM ODBC o JDBC.




La nota técnica: https://omnis.net/developers/resources/technotes/tnsq0036.jsp le dará más detalles sobre como configurar el DAM para su uso con Microsoft SQLServer.

30 de agosto de 2019

Acceso a datos con aplicaciones Web

Una buena práctica cuando estamos creando aplicaciones para la Web con Omnis Studio, consiste en la creación de un grupo de sesiones (session pool) para controlar el acceso a datos por parte de los usuarios de la aplicación Web. La idea es otorgar a cada usuario activo de la aplicación una sesión individual de acceso a datos, mejorando así los tiempos de acceso, ya que la base de datos podrá atender simultáneamente las peticiones de cada uno de los clientes.


El método Omnis que nos permite hacer esto se denomina $makepool, puesto que Omnis creará el grupo de sesiones de modo global (bajo $root), parece lógico invocarlo desde un método (por ejemplo $acceso) situado en la clase "Startup_Task" y que será ejecutado desde su $construct. Eso garantizará que cada vez que se haga disponible nuestra aplicación Web (se abra la librería) el grupo sea automáticamente creado. El código será algo como esto:

Do $extobjects.PGSQLDAM.$objects.PGSQLSESS.$makepool('myPool',1,'192.168.10.10','myUser','myPassword') Returns iMyPoolRef

El segundo parámetro (1 en el ejemplo) es el número de sesiones de que constará el grupo inicialmente, lo cual no plantea ningún problema, ya que todo "session pool", dispone de propiedades que nos permiten (entre otras cosas) aumentar ésta cifra según surja la necesidad debido al incremento en el número de usuarios que esten haciendo uso de la aplicación Web, o simplemente conocer su cifra actual.

El primer parámetro del método $makepool es el nombre que identifica al grupo de sesiones de modo único. Dado que su existencia es global (nivel $root), deberá eliminarse cuando se destruya su "Startup_Task"". Esto significa que no podrá existir otro grupo de sesiones con el mismo nombre. La variable "iMyPoolRef" nos permite referenciar al grupo creado, pero tambien disponemos de un modo para conocer todos los posibles y diferentes grupos de sesiones que puedan llegar a existir bajo un mismo servidor de aplicaciones Omnis, en $sessionpools.

Para cerrar el grupo de sesiones, usaremos el siguiente código situado en el método $destruct de nuestra clase "Startup_Task":

Do $sessionpools.$remove(iMyPoolRef)

Note que "iMyPoolRef" es una variable de instancia y tipo "Item Reference" cuyo valor ha sido asignado por el método $makepool.

Ahora explicaremos cómo solicitar una nueva sesión al grupo, con el fin de otorgársela al usuario durante el tiempo que esté usando nuestra aplicación Web, para ello usaremos el metodo $new. Con éste fin crearemos un nuevo método en nuestra clase "Startup_Task" al que denominaremos $getSessionFromPool, con el siguiente código:


If iSessionPoolRef.$poolsize=iSessionPoolRef.$inuse
Do iSessionPoolRef.$poolsize.$assign(iSessionPoolRef.$inuse+1)
End If
Quit method iSessionPoolRef.$new()
El tamaño del grupo de sesiones ($poolsize) puede ser aumentado en cualquier momento, nosotros lo haremos comprobando si se ha alcanzado su límite actual ($poolsize=$inuse) y cada vez que requiramos de una nueva sesión. El método $new retornará un nuevo objeto de sesión para acceso a datos.

Ahora nos queda una cuestión importante por resolver, ¿Cómo ejecutar el método $getSessionFromPool ubicado en la calse "Startup_Task" desde una clase "Remote_task"?

Naturalmente necesitamos hacerlo así, ya que queremos asignar la nueva sesión a cada nueva conexión remota. Empezaremos por crear una variable de tipo task, en la clase "Remote_task", donde alojar el nuevo objeto de acceso a datos, la llamaremos "tSessionObj", también resultará lógico que el código para invocar al método $getSessionFromPool lo situemos en el método $construct de la "Remote_task", la respuesta a la pregunta del párrafo anterior sería:

Do $itasks.myLib.$getSessionFromPool() Returns tSessionObj

El literal "myLib" deberá corresponder al nombre de nuestra librería o bien usar la notación [$clib().$name] (importante usar los corchetes) para obtener el nombre de la misma, si optamos por esto último estaríamos garantizando su funcionamiento aunque se llegue a cambiar el nombre asignado inicialmente a la librería.

Esto es todo o casi todo, ahora sólo nos quedaría asignar la sesión (normalmente) a la o las clases "table" que use nuestra aplicación Web, para esto lo más habitual es disponer de una super-clase "table" que será heredada por el resto de clases "table", de ese modo escribiremos nuestro código de asignación de sesión una única vez.

Suponiendo que el nombre de nuestra super-clase es "taSuper", escribiríamos en su método $construct lo siguiente:

Do $cinst.$sessionobject.$assign(tSessionObj)

Naturalmente el resto de clases "table", heredaran este método constructor, aunque también pueden tener el suyo propio, pero si lo usamos, tendremos que utilizar el comando "Do inherited" para ordenar la ejecución del método $construct en la superclase.

24 de mayo de 2019

Creación de paquetes firmados para la instalación de aplicaciones Omnis en MacOS

Este documento explica cómo hacer lo siguiente:
  1. Preparar tu "First Run Install" con los archivos propios de la aplicación.
  2. Instalar los ficheros .df1 en modo de sólo-lectura.
  3. Crear tu propio "package" (.pkg) de instalación.
  4. Colocar "script's" dentro del "package".
  5. Construir el "package", desde una opción de menú o mediante Cmd+B.
  6. Firmar el "package" resultante, para su distribución.
  7. Probar su carga/descarga, instalación y ejecución.

Antes debo explicarte que realmente existen dos tipos de firmas, una es la "Firma de la aplicación" (Application Signing) y la otra la "Firma del producto" (Product Signing). Ambos tipos pueden ser obtenidos tras registrarte como desarrollador en Apple. ($99 dólares anuales)

De modo que lo primero es convertirse en un desarrollador registrado, para después obtener su certificado. Hacerlo desde Xcode es más fácil que hacerlo manualmente desde la web, pero de todos modos se trata de un proceso realmente sencillo.

Ahora te contaré cómo se hace, si el caso es que no vas a usar Xcode. Lo primero es, que tendremos que hacer uso de tu cuenta en Apple, esa misma que usas para comprar cosas en iTunes o en la App Store. Si no tienes una, tendrás que registrarse para obtenerla.

Lo primero será iniciar sesión con tu cuenta de Apple. Una vez allí, localiza el enlace al "Programa de Desarrolladores" (Developer Program) o al de "Desarrollador Registrado" (Registered Developer). Una vez allí podrás realizar el registro como nuevo desarrollador Apple. Una vez completado el proceso, (es posible que la nueva cuenta tarde un poco en activarse) podremos solicitar certificados.

Localiza el enlace a Certificados (Certificates). Desde aquí podrás solicitar certificados, indicándote también cómo proceder. Observarás que se hace uso del "Keychain Access" (Acceso a llaveros) durante la creación de certificados. Observa también que la página web muestra un menú en la esquina superior izquierda, donde figuran en primer lugar dispositivos iOS, deberemos cambiarlo a MacOS para obtener así el certificado correcto.

Una vez seleccionado MacOS podrás ver sus opciones. Deberemos escoger aplicaciones o instaladores que no estarán en la tienda de aplicaciones (App Store). A partir de ahí, verás que debes elegir entre un certificado para aplicaciones que están en desarrollo o para las ya en producción, elige producción (Production). Luego verás que tienes que elegir entre aplicaciones (Applications) o instaladores (Installers). Elige instalador, porque es el que necesitamos para firmar nuestro .pkg.

Descubre que en la parte inferior de la página, hay un lugar donde hacer clic para obtener un "Certificado Intermedio" (Intermediate Certificate). Este también es necesario, ya que causa que los demás se ejecuten correctamente. Así que obtén el denominado "WW Developers", sin marcar la opción "CA Authority".

Ahora descubrirás que necesitas generar un "Cert. request" desde el "Keychain Access" de tu Mac, después tendrás que subirlo a la web de Apple, para finalmente poder descargar nuestro certificado. Lo que se descarga es un certificado digital que deberás instalar también en el "Keychain Access" de tu Mac, para esto, bastará con hacer doble clic sobre el certificado que acabas de descargar.

Haz que tus certificados se carguen al inicio de sesión (Login Keychain), es una de las tres opciones que se muestran en la ventana tras el dobre-click. También el propio "Keychain Access" muestra un pequeño menú en la esquina superior izquierda, desde el que poder elegir "Login keychain" para el nuevo certificado.

Los certificados se guardan en el "Keychain Access" y son necesarios para verificar tu identidad. Al fin y al cabo, se trata de poner tu firma en tus productos de modo que otros puedan verificar su procedencia.

Una vez que tengas los dos certificados instalados, estarás listo para firmar los instaladores (Productos). Realmente lo único que los desarrolladores de Omnis necesitamos en este momento es la firma de instalador (Installer). Pero también podemos volver a firmar la aplicación Omnis.

Por aplicación, debemos entender una copia completa del paquete Omnis instalado, que lleva la extensión ".app". Mientras que por instalador debemos entender que se trata de un "Package" con extensión ".pkg" y no de orto tipo de instaladores más sofisticados de los que guían al usuario durante la instalación, mientras le muestran algunas imágenes.

Realmente a un desarrollador Omnis (de momento) le vastará con preocuparse por firmar su instalador, y añadir alguna que otra secuencia de comandos que permita ajustar después de la instalación algunas propiedades y cambiar algunos permisos.

En este momento, Apple no obliga a que la aplicación tenga el código firmado para poder ejecutarse, si el caso es que se instala desde un paquete firmado, ten en cuanta que si firmas la aplicación, no podrás cambiar nada dentro de ella sin volver a firmarla. Si alguna vez Apple requiere que la aplicación esté firmada, los desarrolladores de Omnis tendremos que enviar instaladores completos.

La firma deberá llevarse a cabo desde la línea de comandos del terminal y deberá realizarse una vez construido el instalador, este será modificado mediante el comando correspondiente, para incluir tu seña de identidad.

Omnis requiere de la ejecución de un "script" que corrija permisos y, en ocasiones, propiedades de todos los archivos contenidos en el paquete. Este script es muy simple, solo unas pocas líneas de código. La razón por la que debe ejecutarse tras la instalación es debido a que los permisos y las propiedades deben cambiarse, de otro modo el programa fallará y no podrá ejecutarse con normalidad. Crearemos un script para Omnis 4.3 y otro para Omnis Studio 8. Lo más probable es que el script para 8 también funcione para 10 y que el de 4 funcione para 5 y 6.

Para la creación del instalador o .pkg, usaremos "Packages" disponible en:

  
El botón de descarga se encuentra en la esquina superior derecha.

Primero, si tienes archivos ".df1", asegúrate de "Obtener información" (Comando-I) de cada uno de ellos, para marcarlos "Todos" con acceso de "Lectura/Escritura" y situarlos bajo "First Run Install" si se usa.

Después crearemos nuestro "package", simplemente mediante colocar los elementos a instalar sobre el área "Payload" (Carga útil) de "Packages". Ten en cuenta que si quieres que algo quede situado sobre el nivel raíz del disco duro, deberás arrastrarlo a la parte superior, hasta que veas que la línea se desplaza totalmente hacia la izquierda, luego la sueltas, junto a otras posibles cosas que también se deban encontrar en ese mismo nivel.

Ten en cuenta que pueden existir carpetas ocultas. Para verlas, busca en uno de los menús la opción "Show hidden folders". Esto mostrará, (entre otras cosas) una carpeta "fonts" que podrás usar para instalar fuentes... simplemente colócalas con sangría debajo del nombre de esa carpeta, debajo de "fonts" y se instalarán correctamente.

Entra en "Packages Destination" y selecciona la carpeta "First Run Install" de Omnis y su destino, puedes colocar los archivos donde quiera que vayan. Algunos estarán a su vez, en otras carpetas dentro de "First Run Install", la cual es a su vez es una carpeta dentro de Omnis (para localizarla, haz clic con el botón derecho sobre Omnis y "Mostrar contenido del paquete" - luego "Contents", después "MacOS", y encontrarás la carpeta "First Run Install"). Dentro de ésta es donde deberás poner todas tus cosas. Cuando el usuario ejecute Omnis por primera vez, todos su contenido será copiado en los destinos mencionados.

Cuando ya tengas colocados todos los ficheros y carpetas en el lugar que le corresponden dentro de Omnis, deberemos colocar el propio Omnis y cualquier otra cosa que necesitemos en el área "Payload" (Carga útil) de "Packages", de éste modo estaremos listos para construir nuestro paquete. Observa que dispones de muchas opciones, pero ninguna de ellas necesaria durante la construcción de un paquete básico como el nuestro. Claro que no es imprescindible hacer todo esto para instalar una aplicación, pero el uso de "Packages" proporcionará al usuario una experiencia de instalación más profesional.

Una vez que creado, podremos ver un pequeño ícono de caja y será ahora cuando deberemos proceder con el proceso de firma del Producto (Product Sign) mediante comandos de Terminal, después lo probaremos, comprobaremos que podemos cargarlo/descargarlo, que el proceso de verificación "Apple Gatekeeper", funciona correctamente y que la aplicación Omnis puede ser ejecutada sin problemas.

Un truco para ahorrarnos trabajo en el terminal, consiste en arrastar cualquier archivo sobre la ventana de éste, para así obtener la ruta hacia el mismo ya escrita sobre la línea de comandos.

Otra forma de hacerlo es escribiendo la ruta entre comillas dobles, para no necesitar escapar de los espacios u otros caracteres especiales. Por ejemplo escribiendo:

"/Users/Das's/Desktop/JyotishStudio4.pkg"

Algunos comandos de Terminal solicitarán tu contraseña, si te aparece un pequeño candado como cursor en el Terminal, significará que debes escribir tu contraseña de administrador para completar el comando. En algunos casos, puede que se te muestre un cuadro de diálogo solicitando esta misma contraseña.

Aquí está el comando que debes usar para firmar el "Package":

productsign --sign "Developer ID Installer: Das Goravani" /Users/Das\'s/Desktop/build/JyotishStudio4.pkg /Users/Das\'s/Desktop/JyotishStudio4signed.pkg

Realmente el comando consiste en la primera parte solamente, hasta el nombre del desarrollador. El resto son DOS rutas. LA PRIMERA es la ruta hacia el paquete que queremos firmar, sólo UN ESPACIO la separa del nombre del desarrollador y de la segunda ruta indicada. La segunda ruta corresponde a un nuevo archivo que se creará. Será un duplicado de nuestro paquete pero con la firma incluida. El original permanecerá coo estaba.

Si has escrito todo correctamente, al presionar retorno, se firmará tu aplicación y se creará el nuevo archivo cono nuestro instalador ya firmado. Ahora todo lo que queda resta, es probarlo, cosa que puedes hacer de inmediato, cono sólo hacer doble clic sobre él o bien empezar por subirlo a algún sitio para después descargarlo y luego instalarlo.

Su ejecución no será exitosa, a menos que pongamos antes nuestro "Post Process Script". El script deberemos ubicarlo (como ya hemos indicado) desde el programa "Packages" en el apartado "Post Install" pestaña "Scripts". Podemos simplemente arrastrarlo, para soltarlo sobre "Post Install" para ver su icono allí.

El "script" necesario para Omnis 4, 5 o 6, sería el siguiente:
#!/usr/bin/env bash
# Este script se ejecuta una vez instalada la aplicación.
# Indica la ruta hacia tu aplicación
APPLICATION_ROOT="/Jyotish Studio 4.0/JS4.app"
# Estabece permisos
sudo chown -R root:admin "${APPLICATION_ROOT}"
sudo chmod -R 775 "${APPLICATION_ROOT}"
Crea un documento de TEXTO PLANO, con estas líneas y guárdalo, para después añadirlo a tu instalador como ya se ha descrito. Se ejecutará después de la instalación, establecerá todos los permisos y propiedades haciendo que el programa se ejecute correctamente.

Para Omnis 8:
#!/usr/bin/env bash
# Este script se ejecuta una vez instalada la aplicación.
# Indica la ruta hacia tu aplicación
APPLICATION_ROOT="/Applications/Omnis Studio Runtime 8.0.2 x64.app"
# Estabece permisos
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/startup"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/icons"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/iconsets"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/local"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/omnispdf"
sudo chmod -R a+rw "${APPLICATION_ROOT}/Contents/MacOS/studio"
# Para Brainy Data's PDFDevice (omitir si no se usa)
sudo chmod a+rw ../MacOS
Quiero dar las gracias en especial a Das Goravan, Paul Mulrooney y Alex Clay por el trabajo realizado y su aportación a éste documento.