martes, 6 de marzo de 2012

Aprendiendo K2BTools






¿Deseas probar K2BTools? ¿Quieres aprender a usarlo? ¿Se agrega un nuevo integrante a tu equipo de desarrollo y no sabes cómo capacitarlo?

Pues simplemente sigue los pasos de este artículo y estarás capacitado para probar y desarrollar con K2BTools.

Instalación
Lo primero que hay que hacer es instalar la versión de K2BTools, ya que para aprender K2BTools hay que usarlo y para usarlo hay que tenerlo instalado :)
Para esto la mejor manera es ir a nuestro sitio  Verás una imagen que dice "K2BTools", seleccionas "Bajar" y en la siguiente página das click en "Descargar".






Te preguntarás: Pero a mi me gustaría usar la versión free edition no la full ¿Dónde la descargo?
Pues la respuesta es que son el mismo setup. La diferencia es como vas a activar la licencia después, que lo veremos en la sección "Autorización".
Cuando tengas la versión descargada lo único que debes hacer es correr el setup. Este preguntará el path del directorio donde está instalado GeneXus. En la mayoría de los casos no necesitas cambiar nada y solo es dar "siguiente". En caso que estes usando una versión trial de GeneXus, deberás ingresar el path manualmente pues el default path va siempre contra la versión liberada.



Autorización
Una vez que se tiene instalada la versión se deberán seguir los pasos para autorizarla y poder usarla. Para esto, la primera vez que se abra GeneXus aparecerá en la barra de menú del Developer Environment la opción "K2BTools". Ahí seleccionando se desplegarán otras opciones, entre ellas "Autorizar K2BTools".



La forma de autorizar K2BTools es similar a la de cualquier producto GeneXus. Se cuenta con un license manager en la cual podrás seleccionar el producto a autorizar.




Existen dos tipos de licencia de K2BTools:


K2BTools Free Edition: Es una edición gratuita que permite mantener hasta 20 instancias de cada patrón. La licencia se otorga ilimitada, o sea no tienes límite de tiempo, puedes usarlo indefinidamente, siempre y cuando mantengas esa cantidad de instancias. Esta cantidad es suficiente para desarrollar una aplicación pequeña o para probar la versión.

K2BTools: La otra licencia es la licencia Full que no tiene ninguna restricción en cantidad de objetos. Si has adquirido licencias y tienes disponibles lo mejor será optar por solicitar esta licencia.

Solicita la licencia online y una vez activada ya puedes entrar a trabajar con K2BTools.

Comenzando con K2BTools
Bien, pues para comenzar con K2BTools tienes que apoyarte en esta guía.
Esta es la guía fundamental que no puede faltarle a ninguna persona que quiera empezar a probar o capacitarse con K2BTools.
Así que sigue los pasos de la guía  y no olvides ver los videos "Comenzando con"  de cada uno de los patrones.

1 - Comenzando con K2BEntityServices

2 - Comenzando con K2BTrnForm

3 -  Comenzando con K2BPrompt


Lo más importante para aprender a usar la versión: desarrollar ustedes mismos con K2BTools y  para eso la forma más simple es hacer el taller guiado que se sigue paso a paso. Los pasos están bien detallados, y no requieres tener conocimientos de GeneXus para poder seguirlo.
El taller lo puedes descargar desde aquí

Para hacer todos los ejercicios del taller vas a tener que usar  una herramienta novedosa que hemos incorporado a K2BTools y que permiten construir web panels genéricos. La herramienta se llama K2B WebPanelDesigner. En este artículo del blog hay buena información sobre ella.  Al ser producto beta deberás solicitar una licencia temporal por 60 días. Esta licencia será otorgada mientras dure el período de beta. Así que si estás probando K2BTools recomendamos instalar y probar esta herramienta ya que es una parte importante y diferencial de K2BTools.
Puedes descargarla desde aquí. Es un setup que se instala de la misma forma que K2BTools.

Para saber más
Para complementar los conocimientos o si de pronto deseas más información puedes recurrir también a videos de las charlas realizadas en el Encuentro de usuarios GeneXus 2011 en Montevideo.

Descubra K2BTools y alcance un nuevo nivel de productividad: 
Parte 1 :


Parte 2:




Si quieres obtener información en un nivel más gerencial recomendamos este video.

K2BTools su alidado en nuevos proyectos con GeneXus
Parte 1:

Parte 2:


Finalmente si deseas saber en qué estamos trabajando, y algo de roadmap, recomiendo esta charla.


K2BTools: actualizad y próximos pasos


Parte 1:

Parte 2:



Soporte
El soporte de la versión K2BTools Free Edition es únicamente a través del foro. Así que si estás probando la versión te recomiendo suscribirte aquí. Para la versión de K2BTools, además del foro, se pueden reportar incidentes usando el sistema de  Issue Tracking . Para esto la forma más fácil es mandar un mail a support@k2btools.com . Para que nosotros sepamos que tienes licencias de K2BTools, debes mandar este mail desde la dirección de correo electrónico que figura en tu usuario de Gxtechnical.



Así que estamos en contacto.

Federico Dominioni.
fdominioni@k2business.com






lunes, 5 de marzo de 2012

¡Atención Brasil! Blog de K2BTools en portugués


Ahora la comunidad brasilera podrá disfrutar de artículos de interés acerca de K2BTools en idioma portugués. Fabricio de los Santos, director de Delfasoft y agente de K2BTools en Brasil, compartirá periódicamente posts acerca de diferentes temáticas. ¡Súmate tu también!

jueves, 19 de enero de 2012

Múltiple selección con K2B WebPanelDesigner

Selecciones múltiples

Muchas veces se tiene la necesidad, de seleccionar determinados elementos de una colección y realizar una acción con todos ellos. La acción a realizar con los items seleccionados varía mucho, pero la complejidad inicial radica en resolver la interfaz que posibilite la selección de estos elementos.

Para esto K2B WebPanelDesigner permite definir grillas de múltiple selección que resuelven toda la operativa de seleccionar elementos de una grilla hacia otra; almacenando los items seleccionados en un sdt, para que el desarrollador en su código pueda realizar cualquier acción con ellos.



A la izquierda la grilla de elementos a seleccionar, a la derecha los elementos seleccionados
Especificación:




Para especificar la múltiple selección en el K2B WebPanel Designer parado en un nodo adecuado (webform, columns, tabs , group, etc) hacer un add de un nodo Multiple Selection.









Debajo de este nodo se deberá especificar la grilla en la que estarán basados los items que se van a seleccionar. La otra grilla será generada automáticamente a partir de la especificación de la primera.


Es posible dar de alta esta grilla basada en una transacción mediante la acción Add Grid From Transaction.








Es posible también especificar un free style grid para mostrar los elementos a seleccionar.


Una vez que se agrega la grilla, se deberá especificar en qué sdt quedarán almacenados los elementos seleccionados.
En el nodo multiple selection se cuenta con una propiedad SDT.


La asignación de este SDT se puede hacer de dos maneras, automática o manual.
Para realizarlo de manera automática, parado en el nodo multiple selection se cuenta con una acción Generate Multiple Selection SDT.


Esto lo que hace es a partir de la especificación de la grilla genera un sdt y lo asigna a la propiedad SDT del nodo multiple selection.
Si ya se tiene creado el SDT, la otra opción es asignarlo manualmente en la propiedad. La única condición que debe cumplir el SDT para poder ser asignado es que por cada variable en la grilla debe haber un campo con el mismo nombre de la variable en el sdt.


Con esta configuración se obtiene en ejecución el comportamiento de múltiple selección de items.






Configuración:


En las propiedades de las variables dentro de la grilla se cuenta con la categoría múltiple selection.




ShowInSelectedGrid: Permite especificar si la variable se va a visualizar en la grilla de items seleccionados o solamente en la grilla de items a seleccionar. Esto permite definir items que no se van a visualizar en la otra grilla.
SelectedKey: Permite establecer si la variable forma parte de la clave de los items. Esta información es la que permite cuando se selecciona un elemento, que dicho elemento no se muestre en la grilla de items a seleccionar.




Customización:


Una vez hecha esta especificación, se pueden utilizar todos los elementos presentes en el K2B WebPanelDesigner. Se pueden definir acciones (combo, botones, imágenes ,texto) y programarlas, iterando sobre el sdt de items seleccionados.


En la siguiente imagen se muestra una especificación de una pantalla de selección múltiple que permite seleccionar productos a comprar y generar una factura a partir de ellos.
En la grilla de items a seleccionar se cuenta con una acción para ver el detalle del producto, una variable &Count en la que el usuario puede setear la cantidad de unidades de producto que se van a comprar. 
Además en la medida que el usuario va seleccionando los productos se va actualizando un resumen (nodo Summary) indicando el total a pagar. La acción de confirm permite aceptar la compra de esos productos y cancel es para cancelar la compra. En el tab history se especifica el historial de compras del cliente.














A partir de esa especificación se genera el siguiente web panel.






Puedes descargar K2B WebPanelDesigner desde http://www.k2btools.com/portada/nuevo-web-panel-designer?es 
¿Te animás a construir to web panel de múltiple selección en menos de tres minutos?




Federico Dominioni

lunes, 12 de diciembre de 2011

K2B Audit, la forma más sencilla de auditar su aplicación

Saber qué pasó con los datos es un requerimiento común en las aplicaciones de hoy en día. ¿Quién modificó determinado valor?, ¿cuándo? ¿quiénes fueron los que modificaron la lista de precios de mi producto?


¿Por qué auditar?
Cuando se piensa en habiltiar la auditoría de una aplicación muchas veces se piensa solo con el objetivo de encontrar irregularidades en el uso del sistema. Sin embargo, la auditoría nos da mucho más: al permitir tener un historial completo de las modificaciones que se realizaron sobre los datos de nuestro negocio, nos permite por ejemplo: encontrar errores de operación (y nos da los datos para revertirlos) y nos brinda información valiosa de cómo varían nuestros datos en el tiempo.
 

Una linda tentación
 
Cuando decidimos auditar una aplicación GeneXus, una muy linda tentación es agregar reglas en la transacción para almacenar en una estructura los atributos que se modifican.  ¿Por qué no? La transacción es el objeto en el que GeneXus centraliza todos los cambios en la base de datos.
Para que esta aseveración sea correcta uno se debe asegurar que:


  • Todas las modificaciones de las entidades sean realizadas usando la transacción (ya sea con su interfaz o usada como business component).
  • Solo la aplicación hace modificaciones en la base de datos.
El hecho de utilizar siempre el business component para actualizar la base de datos cuando lo hacemos en forma programática es una muy buena práctica de desarrollo. El problema es que no siempre es posible hacer esto. También puede suceder que la aplicación a auditar ya esté desarrollada y testeada y hacer esos cambios puede ser muy costoso. Haciendo esto tampoco nos aseguramos tener en un 100% los datos auditados, dado que no solo nuestra aplicación puede hacer modificaciones en la base de datos. ¿Hay otra manera?
Sí, hay otra manera.
Las transacciones no solamente centralizan las modificaciones de las entidades sino que definen la estructura de un modelo de datos. Leyendo los modelos de datos podemos saber qué atributos están presente en cada una de las tablas y esa información podemos usarla para generar código propio del DBMS.
Entonces con una herramienta podríamos, a partir de la estructura de la transacción, crear automáticamente los triggers que permitan registrar los cambios en la base, almacenando  valor anterior y posterior de cada cambio.


K2B Audit es una herramienta que hace justamente eso.  Permite generar código de triggers para auditar las tablas.  Para esto cuentan con opciones que permiten:


1. Seleccionar qué transacciones se van a auditar.


2. Crear procedimientos que generan el código  de triggers.


3. Ejecutar el código de creación de triggers (Reorganize).


¿Qué usuario se audita?
Por lo general, desde la aplicación uno se conecta a la base de datos bajo un usuario único, por tanto esto muy pocas veces aporta información para la auditoría.  Lo que se quiere realmente es auditar el usuario que se logueó a la aplicación.
¿Cómo se hace esto? GeneXus brinda la posibilidad de hacer que un procedimiento se ejecute después de que la aplicación se conecte con la base de datos (afterconnect).
K2B Audit hace uso de esta facilidad y provee un procedimiento que se ejecuta en el afterconnect y lo que hace es configurar el usuario en una variable local del DBMS, para que luego sea utilizada por los triggers.


Todo muy lindo, ¿y la performance?

Evidentemente siempre vamos a degradar en algo la performance teniendo auditoría. Aún en la solución de implementarla dentro de la transacción, se genera un overhead importante en la aplicación.   Como forma de minimizar el overhead, lo que hacen los triggers es grabar la información de forma no estructurada, para que el trigger consuma el mínimo de tiempo posible. Luego en los momentos que la carga del sistema es baja, se podrá  ejecutar un procedimiento que se encarga de estructurar esa información para que sea consultable y analizable.


Explotación
K2B Audit cuenta con una herramienta web (K2BAuditAnalyzer) que permite analizar los datos auditados.

Esta aplicación provee distintos tipos de consultas:  Desde consultas básicas por operación; esto es fecha hora de modificación, usuario que hizo las mismas; hasta consultas más avanzadas filtrando por datos específicos de la aplicación. 





Por ejemplo, estas consultas permiten saber quienes modificaron la factura AKA342, quienes modificaron el atributo Sueldo del Funcionario “Juan Carlos”, etc.  Este tipo de consultas es posible definirlas dinámicamente desde la aplicación de explotación de auditoría.




¿Cómo lo pruebo?
Desde el marketplace http://marketplace.genexus.com/viewproductversion.aspx?189,1,0,0,  o desde el sitio www.k2btools.com  se puede bajar una versión  free edition que permite auditar hasta 5 tablas.  Una vez instalado, se puede seguir el manual  que está en la página para configurar la KB.  No es necesario tener instalado K2BTools para usar K2BAudit.
Links recomendados:
Pueden acceder a las charla “K2BAudit la forma más sencilla de auditar su aplicación”  realizada en el XXI Encuentro Genexus:
Parte 1: http://www.youtube.com/watch?v=bzFs83U2pgA&feature=related
Parte 2: http://www.youtube.com/watch?v=OkX9ViVgLOM&feature=related





viernes, 11 de noviembre de 2011

WebPanel Designer: Una manera innovadora de construir Web Panels


Frecuentemente los desarrolladores intentamos evitar la construcción de web panels por la pérdida de productividad que implica e intentamos  realizar  todas las pantallas con el patrón "trabajar con", lo cual muchas veces no nos da la mejor usabilidad.
Presentamos el nuevo producto K2B WebPanelDesigner que soluciona esta problemática, y no requiere tener otras herramientas de K2BTools para ser utilizado.



Introducción

La construcción de soluciones basadas en patrones es muy útil a la hora de desarrollar una aplicación de forma rápida, homogénea y con las mejores prácticas de desarrollo.

Con el objetivo de poder especificar todos los web panels, incluyendo aquellos que no cumplen con un patrón, se ha sobre utilizado la tecnología de patrones. Si bien esta solución es válida, porque se logra alcanzar mayor productividad, existen mejores soluciones  para resolver determinados escenarios.


Uso de Patrones

Uno de los escenarios por el que surgieron los patrones en GeneXus es para crear todos los componentes de mantenimiento de una entidad de manera automática. A partir de una transacción se genera una instancia por defecto y el usuario, con poca o ninguna modificación, logra generar los objetos que resuelven ese comportamiento.
En general, cuando la realidad a especificar sigue determinado patrón, esta se puede especificar a un alto nivel de abstracción, sin requerir posteriormente demasiada customización por parte del usuario. 



Fig1: Instancia por defecto a la izquierda, a la derecha objetos generados.

¿Qué pasa cuando queremos desarrollar un web panel que no sigue ningún patrón?

En un web panel pueden haber múltiples grillas, acciones, formularios, etc.  Si utilizamos
un patrón GeneXus para crear el web panel, una primer consecuencia que trae es que al crearlo, no se puede inferir su especificación por defecto, ya que no hay patrón a seguir. Por lo  tanto, el usuario deberá especificarlo de forma completa desde cero. Esta es una de las razones por las que se necesita  mayor poder de edición y  mayor libertad para customizar el comportamiento particular que va a tener ese web panel.



Figura 2 : Objeto que no cumple con un patrón específico: posee múltiples grillas, tabs, secciones ,etc.

Hasta ahora la solución que proponía K2BTools era el Pattern K2BWebPanelBuilder mejorando mucho la productividad si lo comparamos con hacer este mismo objeto manualmente.  Continuando con la búsqueda de la mejor solución, cambiamos el K2BWebPanelBuilder para  que la especificación en lugar de hacerse usando la herramienta patterns se pueda realizar dentro del mismo web panel  y en un nivel mayor de abstracción.
Este diseñador de web panels se llama K2BWebPanelDesigner (actualmente en proceso de beta) con el cual creemos es la forma de mejorar la construcción de web panels junto con GeneXus.

Esta forma de especificar Web Panels brinda al usuario una mejor usabilidad, más inteligencia y más potencia respecto al uso anterior del patrón.



Algunas de sus mejoras son las siguientes:

  • Es más fácil acceder a la especificación ya que la misma es parte del propio web panel.  

Figura 3 : K2BDesigner es una parte nueva del web panel.


  • La  especificación integrada como una parte dentro del mismo objeto,  mejora y facilita enormemente su uso, ya que permite:
    • Tener dentro del historial del objeto tanto la especificación  como las demás partes, quedando asi el registro de todos los cambios de forma integrada.
    • Al exportar los web panels no es necesario  exportar el objeto y la instancia (y acordarse); sino es suficiente solo con la exportación del objeto .
    • Facilita el trabajo de GXServer debido a que no es necesario preocuparse en subir la especificación por separado del objeto.
    • Al ser un diseñador que forma parte del objeto  nunca se ejecutarán procesos en background, aumentando la performance y la velocidad del trabajo en la KB.

  • La especificación se realiza mediante  nodos y  propiedades que son dinámicas,  permitendo por ejemplo:
    • Que  nodos y propiedades sean  visibles dependiendo del contexto y de las demás propiedades.
    • Que se eliminen propiedades que no aplican al contexto y dificultan la tarea del programador al especificar.
    Figura 4: Editor dinámico.  Cuando se modifica la propiedad Type de Button a Image aparecen nuevas propiedades. 

    • Se mejoran además  varios  aspectos del trabajo con nodos y propiedades, por ejemplo: 
      • Se mejora la inteligencia de los defaults de las propiedades. El valor por defecto puede ser inferido de varias propiedades, incluso de cualquier dato de la KB.
      • Cada nodo tiene su propio identificador y el diseñador se encarga de que los mismos no se repitan. Esto facilita el copy and paste o el cut and paste desde otra instancia, sin generar inconsistencias.
      • Desde un nodo se puede navegar a los eventos generados por él, agilizando así el acceso a la subrutina para customizarla.


    Figura 6 : Desde cualquier nodo que genere subrutinas (por ejemplo nodo action), se puede ir de forma rápida al evento que la implementa.
    • Se brinda más inteligencia en la generación y mantenimiento del objeto:  Se mantienen sincronizadas las distintas partes con el código agregado por el desarrolladorDe esta forma ante cualquier cambio (ya sea código generado o código agregado por el usuario) se mantiene válido el webpanel. 


    Otras de las ventajas es que  pensando hacia el futuro hemos desarrollado el K2BWebPanelDesigner sobre un framework llamado K2BObjectDesigner (extensión Genexus).  Esto nos brinda la posibilidad de desarrollar diseñadores de webpanels de la misma manera que la tecnología patterns nos permite desarrollar patrones.

    Actualmente el diseñador WebPanelDesigner es un add-on o plug-in de K2BObjectDesigner. Por ahora y durante el proceso de beta contaremos únicamente con WebPanelDesigner pero es factible que en un futuro tengamos otros.


    Pueden ustedes mismos descargar esta herramienta y probar los beneficios que da en la
    construcción de web panels.  Está disponible para la Evolution 1 y para la Evolution 2 cuando se libere una nueva beta de esta plataforma.


    Es importante resaltar que no es necesario tener instalada ninguna de las otras herramientas creadas por K2BTools para trabajar.



    K2BWebPanelDesigner está en proceso de Beta así que las licencias temporales se otorgarán a quienes la soliciten. Pueden descargar la versión para Ev1 desde http://www.k2btools.com/files/setup-web-panel-designer-beta2-for-xev1?es y para Ev2 desde  http://www.k2btools.com/files/setup-web-panel-designer-beta2-for-xev2?es.
    La documentación la 
    pueden obtener desde http://www.k2btools.com/files/Documentacion-K2B-Web-Form-Designer?es

    Los siguientes videos muestran webpanels construidos con WebPanelDesigner y como se construyen:
    El soporte durante el proceso de beta será a través de nuestro foro: Foro K2BTools

    Martin Barreto @mtnBarreto
    K2BTools

    martes, 20 de septiembre de 2011

    Simplicidad, Productividad e Integridad Conceptual

    Simplicidad, productividad e integridad conceptual son los tres pilares de K2B Tools, vamos a abordar el último punto: La integridad conceptual.

    En 1975 Frederick Brooks publicaba la primer edición de su famoso y aún vigente libro,
    The Mythical Man-Month

    Uno de los temas principales del libro es la  “Integridad Conceptual” como uno de los factores más importantes de una aplicación.

    Más de 35 años después, esto sigue más vigente que nunca. Muchos autores (Donald Norman, entre otros) han escrito y siguen escribiendo sobre ello.

    Nosotros, como usuarios y como seres humanos, seguimos buscando la integridad conceptual en todo. 
    Hoy, en la era de los “smart devices”  la integridad conceptual, basada en un conjunto de modelos conceptuales, ya no solo debe ser atributo de una aplicación, sino que debe serlo de todo un dispositivo.

    La vigencia de estos conceptos tantos años después es entendible: esto no tiene que ver con una época o tecnología, sino que está estrechamente relacionado con la forma de percibir, entender y aprender del cerebro humano. Esto no ha cambiado y no va a cambiar en unos cuantos años. ;)

    Una aplicación conceptualmente íntegra

    Una aplicación íntegra conceptualmente se percibe como coherente en toda su extensión, consistente, homogénea, agradable, armónica. Todos estos términos se asocian a la integridad conceptual.  
    Una aplicación íntegra conceptualmente, usa los mismos modelos para representar las mismas cosas: usa las mismas interfaces para realizar los mismos tipos de tareas, muestra de la misma forma los mismos tipos de información, usa la misma navegación para realizar los mismos tipos de flujos o de procesos. A nivel del desarrollo: usa los mismos modelos de datos para modelar una realidad con similares características, usa los mismos mecanismos para resolver los mismos problemas…

    Lindas, fáciles y confiables: las ventajas de la integridad conceptua
    l

    A nuestros cerebros les gustan las cosas que son conceptualmente íntegras, nos resultan agradables, la evolución nos ha diseñado así. Esto es importante y no se trata solo de estética: la belleza nos sitúa en estados emocionales que mejoran nuestros procesos cognitivos, con lo cual mejora nuestra predisposición a entender y aprender. Entendemos mejor las cosas lindas. Las cosas lindas funcionan mejor - así lo percibimos.

    Por otro lado, la integridad conceptual aporta facilidad de  comprensión, facilidad de aprendizaje y facilidad de uso: los principios básicos para tener una buena experiencia de usuario.
    Si cada vez que nos enfrentamos con un tipo de tarea, proceso o información la forma que se hace o que se muestra es la misma, la aplicación será fácil de aprender y de usar. Esto genera confianza y seguridad en la interacción. 

    La integridad conceptual confirma y refuerza nuestras expectativas de cómo funciona la aplicación. Y esto es muy bueno, esta confianza nos motiva a usarla, nos predispone mejor a entenderla. 

    Las aplicaciones modernas, deben ser así: simples, íntegras y lindas. Esto ya no es una opción.

    Construyendo este tipo de aplicaciones

    Para lograr aplicaciones conceptualmente íntegras debemos tener un conjunto de buenos “modelos conceptuales” que apliquen en forma correcta y consistente a lo largo de la aplicación: esto es … patrones. Un patrón es un modelo conceptual que se repite.

    Una aplicación con modelos conceptuales bien aplicados logra aplicaciones íntegras conceptualmente. Si además la aplicación tiene buenos modelos, logra aplicaciones con muy buena experiencia de usuario.
    Si trabajamos solos esto es viable de conseguir. Con un poco de suerte y si somos coherentes con nosotros mismos podemos generar aplicaciones con integridad conceptual. Pero cuando trabajamos en un equipo esto es difícil y costoso, en general se vuelve inviable. ¿Cómo lograrlo entonces? ¡Generemos la integridad conceptual automáticamente! contando con herramientas que nos provean de buenos modelos conceptuales y generen aplicaciones íntegras, basados en esos modelos.

    En K2B Tools apuntamos a brindar un conjunto de buenos modelos conceptuales de forma de  permitir especificar la aplicación a un nivel más alto de abstracción, y en base a esos modelos generar la aplicación implementada en GeneXus en forma automática. 
    Más simple, más productivo y con la integridad conceptual que buscamos.



    by Mayda Kurdián