Disclaimer

Some times, when I want to publish a new software or library just to share it with the world, I found that some sort of disclaimer should be provided. The most common, is one that says something like this:

The Software is provided “as-is” without warranty of any king…. blah… blah…blah

The previous sentence is very common in many open-source licenses like the MIT License and the X11 license, among other DFSG Licenses.

However, sometimes, I just want to have my own simple non-complicated disclaimer for stuff I do and write. Something like:

I do not pretend that this <library_name_goes_here> is the fastest, the leanest, the smallest or the best, I just pretend that it does exactly what I planned it to do, and that it does it well enough for me. I hope it does the same for you, and if it happens that you were able to improve it… just let me know.

Tautología II

balloon graffiti bansky

Los requerimientos de un sistema son como globos en una mano. Si se mantienen fuertemente agarrados se conservará el control y se disfrutarán. Si se sueltan, aunque sea un poco, se safarán y saldrán volando descontroladamente.

Reading multiple files from ORACLE using PL\SQL

ORACLE is not my favorite database manager. It feels outdated, old, complicated and slow (specially because all the available software is made on JAVA, except TOAD which is a very nice tool).

It is quite annoying that some task that We may consider advanced in database management and programming are quite easy to do by other database software like Microsoft SQL Server 2005/2008, but in ORACLE are terribly complicated, obscure and taking a lot of time.

Some time ago I was involved in a very important project for China where sadly We have to use ORACLE 11g as database server. We have a very important but simple requirement: read the content of a set of plain text files that will be available in a public folder, parse their content and insert it into a known set of tables using a 100% PL\SQL solution (no C++ or anything external from ORACLE could be used).

As you may know, there is a very solid stored procedures package in ORACLE called UTL_FILE which contains functions to read and write text files, as long as the name and extension of the file is known when invoking those functions.

And then problems started… because the name of the files that We are going to read are not known, they contain a date and time component as part of their name (for example: MyFile_20101015_1045.txt) but such name’s components are not known at any given time.

So, from the requirements We face two challenges:

  1. Since the exact file name is not known, We could not use the functions available in the UTL_FILE.
  2. The solution must be completely and exclusively written in pure PL\SQL.

Luckily there is a hidden functionality in ORACLE’s SYS schema, in the DBMS_BACKUP_RESTORE package called SearchFiles available out of the box (which means that no additional installation of special stuff is required to have it). The mentioned package is used by ORACLE when restoring a backup (automatically or manually).

The SearchFiles function takes a file name pattern and creates a list of those files that match it (recursively considering any sub directories) and storing the result in a temporary table called X$KRBMSFT (which belongs to the family of those handily $x tables).

So, with this knowledge, We have new challenges:

  1. Isolate the SYS schema to warrant the security of it (nobody should access this schema).
  2. Retrieve the data stored in the table from outside the SYS schema.
  3. Process the data using the UTL_FILE package.

The following diagram depicts the design of this solution:

We can solve challenges 1 and 2 creating a stored procedure which We will call ListFiles, and storing it in a new package under the SYS schema. This stored procedure will be a proxy or gateway to invoke the SearchFiles procedure. The values of the X$KRBMSFT table will be returned as a cursor, so the consumers of this stored procedure will no require access privileges to it. The script is as follows:

create or replace PACKAGE EXT_UTILS AS
    TYPE cur_output IS REF CURSOR;
    PROCEDURE ListFiles(p_dir_pattern IN VARCHAR2,
                        cur_out OUT cur_output);
END EXT_UTILS;

create or replace PACKAGE BODY EXT_UTILS AS

PROCEDURE ListFiles(p_dir_pattern IN VARCHAR2, 
                    cur_out OUT cur_output) AS
v_ns VARCHAR2(200);
v_select VARCHAR2(200);
v_dir_pattern VARCHAR2(1024);

BEGIN

    v_dir_pattern := p_dir_pattern;

    -- Change LIKE clause to match file pattern or format specification.
    -- The LIKE condition should match files with the next file name format: “NamePrefix_20100812_1312.txt”.
    v_select := 'SELECT FNAME_KRBMSFT FROM X$KRBMSFT WHERE UPPER(FNAME_KRBMSFT) LIKE UPPER("%NamePrefix!_________!_____.txt") ESCAPE "!"';
    SYS.DBMS_BACKUP_RESTORE.searchFiles(v_dir_pattern, v_ns);
    OPEN cur_out FOR v_select;

END;

END EXT_UTILS;

Then We will grant execute permissions to our schema to execute this new package only. In other words, our schema will be able to see and execute the ListFiles stored procedure from SYS, but will not see or be able to invoke with anything else form there. Since the EXT_FILES does not expose anything from the SYS side rather then its own implementation, security is warranted.

-- In the real life, <user> will be our schema.
GRANT EXECUTE ON EXT_UTILS TO <user>;

After you invoke the EXT_UTILS.ListFiles stored procedure, you’ll receive a cursor with the name, extension and complete path to the files you need to work with, which you can pass as argument to the stored procedures of the UTL_FILE package.

PROS: this approach is flexible and reliable as a 100% PL\SQL solution with good performance. It leverage on existent ORACLE stored procedures and packages. Also, this solution works for ORACLE 10g.

CONS: this solution requires some work to be done as SYS. Some maintainability could be lost since some work requires the intervention of the database administrators (even when the creation of the EXT_FILES package will be done only once). Appropriate privileges for execution must be granted to your schema for the new EXT_UTILS package. Finally, in order to use the ULT_FILE package, SYS must grant create and drop directory objects privileges to your schema.

WARNING: As x$krbmsft is an in memory table, it is recommended to take precautions. Calling the SearchFiles procedure on a directory with too many sub directories and files that match the given pattern has the potential to consume large amounts of memory.

Hope it helps someone.

Some helpful links:

Forzar la desinstalación del VS2008

Muchas veces nos encontramos con la situación de que necesitamos agregar o remover un componente de nuestra instalación del VS2008, o simplemente nos queremos deshacer de él. Sin embargo, cuando ejecutamos desde el medio (DVD ó ISO) a través del cual lo instalamos, o desde el ‘Add or Remove Program’ del Control Panel (o su equivalente en Windows Vista/7) nos encontramos con el siguiente mensaje:

La solución final vendría de desinatalar completamente y de forma forzosa el VS2008 empleando la herramienta de auto-desinstalación de Microsoft, la cual puede ejecutarse desde aquí.

Please Stand-By

please_stand_byHoy día es habitual en los aplicativos restringir las posibles acciones de los usuarios cuando el sistema está realizando algún procesamiento. Esto es algo que ha ido evolucionando con el tiempo, pasando de mensajes de texto que titilaban en la pantalla a barras de progresos y animaciones, algunas muy creativas y otras muy molestas.

Con el advenimiento de la tecnología web, surgieron nuevos patrones de comportamiento de los usuarios y nuevos retos para los diseñadores y programadores para evitar que las acciones de éstos afectaran el comportamiento esperado del sistema.

Por ejemplo, uno de los patrones conductuales de los usuarios que eventualmente surgieron, especialmente con los sitios dinámicos y el e-commerce, fue el que se conocería como deja-vù.

Para entender este patrón conductual supongamos el siguiente escenario: un usuario accede a un aplicativo web y pulsa un botón (o un enlace), pero no percibe que el aplicativo esté haciendo algo y nuevamente pulsa el botón. Supongamos que el usuario es tan perceptivo como una oruga y nuevamente cree que el aplicativo no ha recibido su solicitud y se la pasa dándole varias veces al botón hasta que aparece un resultado, el cual muy probablemente sea producto de la primera vez que presionó el botón. En el mejor de los casos hasta allí habrá llegado el problema.

Continuando con el ejercicio, supongamos que el botón se encargaba de insertar alguna información (o más doloroso aún, realiza un debito irreversible a la cuenta bancaria del usuario). Entonces por cada vez que el usuario le dio al botón, el servidor recibió una solicitud de realizar esa acción, que en el mejor caso bien puede ignorar, o puede lanzar un error que el usuario verá a posteriori o simplemente repetirá dicha acción el número de veces que el usuario haya pulsado el botón.

Pero todo esto ocurre porque el aplicativo carecía de un mecanismo para expresar de forma clara y explícita que ha recibido la petición del usuario, más allá de lo que el explorador que esté empleando el usuario haga para indicar que está esperando una respuesta del servidor.

Claro que hoy día los usuarios están más acostumbrados a la latencia de los sistemas web, pero no existen garantías de que el patrón conductual se haya superado al ciento por ciento. Y más si en la actualidad todos los sistemas web están siendo implementados con algún tipo de framework de AJAX que hace que las páginas web no se tengan que cargar completamente para mostrar el resultado de la acción del usuario.

Y para empeorar las cosas, los usuarios ya no quieren el texto de ‘Por favor espere’ titilando en una esquina del monitor, lo que quieren es diseño, animación y color; algo que a veces no tenemos ni el tiempo, ni el dinero o las habilidades para proveer.

Por suerte, existen almas caritativas que recorren el mundo poniendo a su disposición estos tres escasos elementos, para que desarrolladores en general puedan hacer uso de ellos y proveer a los usuarios de sus sistemas de esa barrita que aparece cuando una sombra bloquea toda la pantalla para que no la anden $@#&*!§ por ahí insistiendo en que se haga algo de lo cual el servidor ya está enterado y en vías de procesar.

Y es entonces donde esta entrada les recomienda el siguiente enlace: www.ajaxload.info en el cual se ofrece imágenes tipo gif animados personalizables y de diferentes motivos para agregar como recursos de espera para que los usuarios de nuestros sistemas, hipnotizándolos y entreteniéndolos, no insistan en sus peticiones y simplemente esperen a que el sistema termine de hacer lo que tiene que hacer.

Lo mejor… es totalmente gratis.

Tautología

Iced PC

Desarrollar aplicaciones y andar por sobre el agua son dos cosas muy sencillas; siempre que el agua y los requisitos funcionales esten congelados

Bienvenidos al front-end

The Architect
De la wikipedia extraemos la siguiente definición de front-end:

“El front-end es la parte del software que interactúa con el o los usuarios y el back-end es la parte que procesa la entrada desde el front-end.[...] La idea general es que el front-end sea el responsable de recolectar los datos de entrada del usuario, que pueden ser de muchas y variadas formas, y procesarlas de una manera conforme a la especificación que el back-end pueda usar”.

Se preguntarán, ¿qué tiene que ver una abstracción ampliamente conocida del diseño de software con un blog de arquitectura de soluciones, más allá de lo claramente evidente?

Pues de una simple analogía: que el arquitecto de soluciones de software suele ser el front-end técnico entre lo que el cliente desea y lo que el equipo de trabajo y la tecnología permiten realizar. En otras palabras, se convierte en la interfaz que traduce los deseos del cliente en especificaciones técnicas que su equipo de trabajo puede llevar a cabo con facilidad y efectividad, y retornar el resultado de dicho proceso nuevamente al cliente.

Como todo front-end, ofrece una serie de prestaciones que le hacen atractivo: conocimiento, oratoria, dialéctica, mística profesional, entre muchas que se pudieran citar. La mayoría de las veces simplemente nos quedamos en la función técnica del rol (ya que también es la que suele disfrutarse más) pero no por ello se pierden las otras. Pero lo importante en la arquitectura de software, es que el front-end que presentemos a los clientes y nuestra habilidad de transformar sus requerimientos en diseños que nuestros equipos puedan emplear efectivamente cambie acorde a los tiempos y las necesidades. Por ejemplo: un sistema operativo ofrece la mayoría de las veces más de un tipo de UI, ya sea gráfico, de consola o híbridos. Con cada necesidad,  y muchas veces gustos, se cambia el front-end aunque el back-end siga siendo el mismo.

Todo front-end, sin importar que tan perfecto y ergonómico esté diseñado, encontrará un individuo (o grupos de individuos) que no sabrán encontrar la forma de interactuar con él, por más que el mismo front-end se adapte. Este tipo de gorilas escudan su inaptitud a través de lo que al final llamaríamos política. Muchas veces se perderán proyectos increíbles y satisfactorios por las políticas internas de la corporación que formarán los obstáculos que a veces, contrario a lo que parezca, terminará con el alivio de la cancelación del proyecto. Pero un arquitecto no se decepciona de la política, sino que aprende de ella y de los restos que quedan del proyecto.

Ciertamente el arquitecto no es el único front-end que tiene una organización para con sus clientes, así como el equipo de desarrollo no es el único back-end. Existen otros actores que estoy seguro tienen en sus propios representantes, con sus respectivos blogs, y que serán muy interesantes de leer, pero en lo que a su servidor compete, este tratará de mis aventuras en el mundo de la arquitectura y una que otra cosa que creo les pueda gustar.

Espero les guste esta introducción y los futuros posts.

Seguir

Get every new post delivered to your Inbox.