domingo, noviembre 01, 2009

Tecnillusions estrena nueva web

Ya está disponible la nueva web de Tecnillusions, una compañía especializada en soluciones tecnológicas a medida. Su nueva web está basada en tecnología Flex y Flash, en donde se presenta la compañía y su apuesta por las nuevas tecnologías en base a la sencillez y el diseño. La nueva web está tanto en castellano como en inglés, y en ella se ha plasmado el espíritu y la filosofía de la misma.

Algunas de las pantallas de esta nueva Web son las siguientes:

























Enlace a la página web: http://www.tecnillusions.com

sábado, octubre 31, 2009

Trazalogic: Software para trazabilidad de alimentos

Trazalogic es un proyecto actualmente en desarrollo para dar cobertura a la trazabilidad de alimentos para empresas de elaboración y manipulación de alimentos. Las principales características de Trazalogic con respecto a otros productos similares son las siguientes:

  • Costes mínimos:


    • Desarrollado bajo estándares de software libre:


      • Servidor de aplicaciones Apache Tomcat

      • Procesos de negocio servidos mediante Java

      • Base de datos PostgreSQL

      • Front-end basado en Adobe AIR/Flash

      • Mínimo mantenimiento


    • Libertad de licencias:


      • Sin restricciones en cuanto a equipos instalados

      • Sin restricciones en cuanto a tiempo

      • El soporte es opcional, y sólo se paga por el plan deseado acorde al uso del mismo



  • Sencillez y productividad optimizadas:


    • Interfaces de usuario ricas

    • Sistema de inteligencia que anticipa los procesos

    • Menos operaciones manuales y más procesos automatizados

    • Entorno muy intuitivo que apenas requiere aprendizaje

    • Pensado también para pantallas táctiles


  • Arquitectura web:


    • Instale un único servidor, acceda desde múltiples puestos en cualquier lugar

    • Versatilidad en configuraciones de acceso

    • Acceso restringido a usuarios previamente configurados

    • Sistema abierto para acceso mediante servicios web, de cara a que otras aplicaciones se puedan integrar con Trazalogic (con requerimiento de firma)


  • Múltiples idiomas: Inicialmente en castellano y en inglés, pero sería fácil agregar cualquier otro idioma con sistema de caracteres latinos

  • Múltiples plataformas: Puede ser utilizado en Windows y en Linux



Las principales características funcionales de Trazalogic son las siguientes:

  • Sistema de administración:


    • Gestión de usuarios

    • Gestión de clientes

    • Gestión de proveedores

    • Gestión de inventario

    • Gestión de puntos de control y almacenes

    • Gestión de recetas o preparación de alimentos

    • Trazabilidad de actividad del sistema

    • Trazabilidad de los alimentos

    • Estadísticas y cuadros de mando

    • Informes


  • Sistema de operación:


    • Gestión de lotes (entrada y salida)

    • Gestión de productos

    • Recepción de alimentos primarios

    • Gestión de almacenamiento de alimentos (entrada y salida)

    • Elaboración de alimentos

    • Gestión del envasado

    • Gestión de salida de productos elaborados




A continuación algunas pantallas de Trazalogic en acción:



















Puede solicitar información sin compromiso sobre Trazalogic, a través del correo electrónico: info@tecnillusions.com

Tecnillusions: http://www.tecnillusions.com

domingo, octubre 25, 2009

Firma de libros en la Conferencia de SPI en Pontevedra

El pasado viernes, 23 de Octubre de 2009, se celebró en Pontevedra una conferencia sobre SPI, a la que fui invitado por la presidenta de la AESPI, Esperanza López Maquieira. El acto fue presidido, además de por la presidenta de la AESPI, por la vicepresidenta Teresa Pinto, la tesorera Mª Jesús Catalán, el doctor Diego García-Borreguero y el vicepresidente de la diputación de Pontevedra D. José Juan Durán.

En el acto se presentó mi libro "SPI: el demonio que me despierta mientras duermo", que se entregó al final de la conferencia entre los asistentes, y a los que, gustosamente, firmé.

A los interesados, podéis conseguir información sobre el SPI y descargaros mi libro, desde la página de la AESPI: http://www.aespi.net

Existe un foro donde podrás encontrar información de todo tipo (asociaciones, médicos, consultas, tratamientos, noticias, etc.): http://groups.google.com/group/sindrome-de-piernas-inquietas





martes, octubre 20, 2009

Flex/AIR: Error de conversión a ArrayCollection de ObjectProxy en llamadas HTTPService

Me he encontrado con un problema habitual, y ocurre cuando uno hace una llamada a un HTTPService, y en la función que gestiona (handle) la llamada, al asignar el resultado del XML a un ArrayCollection, se encuentra con que no puede asignarse un objeto ObjectProxy al ArrayCollection. Este tipo de operaciones son habituales cuando hay que cargar una lista o un ComboBox. Este problema ocurre cuando solamente se tiene un elemento en la lista, mientras que si hay más de uno, este problema no ocurre. Asimismo, si no hay resultado, también puede dar un error de null. Creo que se trata de un bug de Flex, ya que en estos casos, automáticamente debería dar un ArrayCollection de todas maneras, con cero, uno o más de un item.

Antes de continuar, indicar que este post no contiene un ejemplo completo para poder probar, si no que explica detalladamente como resolver esta situación.

Tras dar vueltas y vueltas al problema, he realizado una pequeña "ñapa" o "parche" para que la carga del ArrayCollection se realice sin problemas.

En primer lugar voy a presentar el XML que devuelve el HTTPService:




<?xml version="1.0" encoding="ISO-8859-1" ?>

<products_providers_in_use>
  <product_provider_in_use>
    <data>6</data>
    <label>Bill Gates</label>
    <id_product>21</id_product>
    <name_product>Escalope de ternera</name_product>
    <total>0</total>
  </product_provider_in_use>
  ...
<products_providers_in_use>




La definición del HTTPService permite definir en qué funciones delegar la ejecución en caso de error (fault) o de éxito (result), así como la URL al HTTPService (url).



<!-- Call to srvGetProductsProvidersInUse service -->
<mx:HTTPService 
  result="handleProductsProvidersInUse(event);"
  fault="handleFault(event);" 
  id="nombre_del_servicio" resultFormat="object"
  url="url_al_httpservice"
  useProxy="false">
</mx:HTTPService>



Es necesario definir el ArrayCollection como una variable de ámbito local, que pueda ser accedida por todas funciones del módulo, componente, etc.



[Bindable]
import mx.collections.ArrayCollection;

private var acInUse:ArrayCollection;



La llamada al HTTPService se realiza mediante el objeto HTTPService (referenciando el nombre indicado en la propiedad id) y al método "send" en el momento que sea necesario (en el creationComplete, al pulsar un botón, etc.):



nombre_del_servicio.send();



Una vez se ejecuta el HTTPService, éste accederá a dicho servicio para obtener un XML. En el caso de que no se haya producido ningún problema en la comunicación, se delegará la ejecución en la función definida en "result". El código para leer correctamente este XML en todos los casos (ya corregido el bug) es el siguiente:



private function handleProductsProvidersInUse(event:ResultEvent):void {
  try {
    acInUse = 
      event.result.products_providers_in_use.product_provider_in_use
        as ArrayCollection;
  }
  catch (err:Error) {
    acInUse=new ArrayCollection();
  }
  if (acInUse==null) {
    var o:Object;
    o=event.result.products_providers_in_use.product_provider_in_use;
    acInUse = new ArrayCollection(
      [{data:o.data,label:o.label,id_product:o.id_product,
      name_product:o.name_product,total:o.total}]);
  }
}



Para controlar las excepciones se abre un bloque try...catch para intentar acceder al XML recogido. Lo normal es asignar al ArrayCollection la colección de datos del XML que se repite. El XML está contenido dentro del parámetro de evento, y en la propiedad "result". El primer elemento del XML ("products_providers_in_use") no se repite, y marca el principio y fin del grupo de datos. Por ello hay que llegar hasta el siguiente nivel del XML: "product_provider_in_use". En teoría, este nivel retornaría un ArrayCollection. En el caso de que tenga más de un elemento no hay problema, pero si hay un sólo elemento, no produce ninguna excepción, pero, inexplicablemente, nos retorna un null. Por ello, tras el catch se hace una comprobación de si es nulo, en cuyo caso se crea un ArrayCollection nuevo, se recoge el único elemento del resultado en un objeto genérico, y se crea un elemento con la información recogida en el XML. En el caso de que el XML estuviera vacío o tuviera algún problema, saltaría una excepción, la cual es recogida por el bloque "catch" y crea un ArrayCollection nuevo, pero vacío, pero no null.

Espero que este ejemplo corte definitivamente el tiempo que os haya hecho perder esta singular situación.

Flex/AIR: Listas personalizadas con ItemRenderer

Una de las mayores virtudes de Flex es que es posible personalizar la vista de una lista o de un Datagrid, pudiendo añadir elementos que no son estándares (la típica etiqueta o texto), sino que se pueden añadir también elementos gráficos o incluso elementos de interfaz de usuario.

Para ver una muestra de ello, la siguiente imagen muestra una lista con un icono a la izquierda, dependiendo del estado del item:

Como puede apreciarse, aunque sea un ejemplo sencillo, da alas a multitud de posibilidades, tanto de visualización como de edición.

El poder de ItemRenderer es poder incrustar en lugar de un item un componente. Esto es, en lugar de una fila en una lista, o de una columna en un DataGrid.


Planteamiento
El planteamiento de este componente o, mejor dicho, su utilidad, es poder realizar una lista que nos permita seleccionar un elemento, pero que, dependiendo de su estado, se pueda interactuar de una manera u otra.

Por ejemplo, imaginemos una lista de frutas asociadas a un pedido. Puede haber frutas que han sido ya entregadas (estado false o no disponibles) y otras que aún no han sido entregadas (estado true o disponibles). De esa lista, es posible quitar frutas para que no sean servidas. Obviamente, aquellas que ya han sido entregadas no podrán quitarse del pedido, y sí aquellas aún no han sido entregadas. Además del dato de estado, una ayuda visual se agradece, indicando con un pequeño icono o algún estilo de texto cuáles están disponibles y cuáles no.


Componente de contenido

El componente de contenido será aquel que será renderizado en el item. En nuestro caso será un simple HBox, que contendrá una imagen de 20x20 (en formato png, por las transparencias), y una etiqueta con el texto a visualizar.

El código de este componente es el siguiente:


Es importante señalar que en una lista la interacción de los datos ha de coordinarse, pues al hacer clic sobre el item, éste también debe retornar la información. Si no fuera así, sólamente sería un elemento decorativo y no se podría seleccionar. Es por ello que se haya sobreescrito (override) los método set data y get data. Cuando la lista comienza a dibujar (render) cada item, utiliza este componente que hemos utilizado, y le pasa (set) los datos. Internamente, cuando recibe los datos, llama al método refresh para pintarlos adecuadamente. Por otro lado, cuando el usuario hace clic sobre el item, éste debe devolverle (get) a la lista los datos para que pueda seleccionarse e interactuar con el código.

Otra cosa importante a señalar es el uso de la función loadImage:


// This function loads the image
private function loadImage(imgURL:String):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
function (e:Event):void {
itImage.source=e.currentTarget.content; });

loader.load(new URLRequest(encodeURI(imgURL)));
}


Se le llama con la ruta donde se alojan las imágenes (puede ser en disco duro, o una URL externa, o una referencia desde el directorio raíz). En el ejemplo, se ha creado un directorio "resources" dentro del raíz del código Flex, y por ello se indica en la ruta como "resources/imagen". Esta función es más recomendable que usar simplemente la propiedad source de la imagen, pues además permite recoger la información correspondiente a la imagen si queremos hacer uso de ella.

LISTA

En el ejemplo, se visualizará la lista correspondiente a partir de unos datos almacenados en un ArrayCollection. Estos datos están incrustados en el código, pero podrían ser leídos de un HTTPService o de un servicio Web.

Los campos de información son los siguientes:
- label: etiqueta o texto a visualizar en la lista
- data: código numérico del producto (no se visualiza)
- state: true/false. Indica la disponibilidad del item

El código es el siguiente:

El punto de inflexión está en la propiedad itemRenderer de la lista, en donde se indica qué componente va a dibujarse en el item de la lista.

El resultado será, además del visual, el que cuando un usuario seleccione un item de la lista, se mostrará una alerta con los datos del item seleccionado, tal y como muestra la siguiente imagen:

domingo, octubre 18, 2009

Flex/AIR: Teclado virtual avanzado para pantallas táctiles

Ya está disponible una nueva versión del teclado virtual para pantallas táctiles, con las siguientes mejoras y cambios:

- Posibilidad de elegir entre un texto simple (una línea) o un texto multilínea.
- Se ha evitado los estados para hacer más sencilla la recepción del texto, con tan sólo cerrar la ventana.
- La tecla "Aceptar" se ha sustituito por el "Intro" o retorno de carro.
- Se ha agregado el botón "Anular", con el que se anula por completo el texto actual.
- Se puede interactuar con el teclado tradicional, haciendo editable el display. De esta manera, cuando el texto sea más grande que el display, se hará scrolling, accediendo a la zona de edición (en la versión anterior se cortaba, pues sólo se veía el principio).
- Es posible editar texto para su sustitución por un carácter pulsado en el teclado, o por la tecla borrar.
- Es posible especificar el tamaño máximo del texto (número de caracteres).
- Se ha incluido un status en el que se visualiza cuántos caracteres hay escritos y cuántos caracteres se pueden escribir (tamaño máximo del texto).



En la segunda demo, se ha incluído un fondo para ver cómo el teclado utiliza las transparencias con el fondo. Hay una caja de texto simple y una TextArea. La edición de ambas cajas de texto se realiza, simplemente, haciendo click sobre cada una de ellas.

Cajas de texto simple y multilínea


Teclado virtual avanzado editando multilínea


El código de la demo es el siguiente:


La explicación del código es muy similar a la del ejemplo anterior (mirar http://rafinguer.blogspot.com/2009/10/flexair-teclado-virtual-para-pantallas.html para el detalle). Tan sólo añadir que se pasa al componente, a través de la función "setTextType()", el tipo de texto a visualizar: TYPE_SINGLE (opcional) o TYPE_MULTILINE (en caso de querer un texto multilínea). Asimismo, también se especifica el tamaño máximo a editar para el texto, mediante la función "setMaxChars()".

Otro detalle a considerar es que ahora, al no tener estados o acciones (sólo el cierre de la ventana del teclado), el evento a gestionar es de tipo "Event.CLOSE", cuya función delegada simplemente ha de obtener el texto (función "getText()") sin necesidad de evaluar estados.

Para ver la demo en directo: http://www.tecnillusions.com/demos/DemoKeyboard2/DemoKeyboard2.html

Para descargarse el código fuente y el ejecutable: http://www.tecnillusions.com/demos/DemoKeyboard2/DemoKeyboard2.zip

sábado, octubre 17, 2009

Flex/AIR: Teclado virtual para pantallas táctiles

En esta ocasión no voy a explicar algún detalle sobre alguna técnica concreta, si no que voy a publicar, íntegramente un componente que muestra un teclado virtual que puede ser utilizado en lugar del teclado físico, ya sea con el ratón o bien en una pantalla táctil.

El teclado es de tipo QWERTY, y tiene tres modos: normal (minúsculas), mayúsculas y símbolos. Incluye también los números.

Otro detalle importante es que posee transparencia con el fondo y posee efectos especiales al utilizar los botones. ¿Qué más se puede pedir?

El aspecto que presenta es el siguiente:

Modo normal


Modo Mayúsculas


Modo Símbolo


El modo de utilizarlo es muy sencillo. El código para el ejemplo es el siguiente:



El ejemplo parte de que el componente está en la misma carpeta que la aplicación. Si no fuese así, habría que hacer el "import" correspondiente.

El ejemplo es muy sencillo: en una caja de texto escribiremos parte de un texto. Cuando se pulse el botón "Teclado" aparecerá el el teclado virtual con el texto escrito. En ese momento se modificará el texto con este teclado. Al darle al botón "Aceptar", el nuevo texto aparecerá en la caja de texto. Si se cerrase la ventana con el botón de cierre, mostrará un texto indicando que el texto no fue aceptado, y no habrá cambio alguno.

El componente KeyboardWindow es un "TitleWindow" o PopUp. Hay que importar la clase PopUpManager y declarar una variable de este tipo KeyboardWindow:


import mx.managers.PopUpManager;
import mx.controls.Alert;

private var wKeyboard:KeyboardWindow;



Cuando el usuario haga click sobre el botón "Aceptar" se ejecutará la función "showKeyboard()":


private function showKeyboard():void {
  wKeyboard = KeyboardWindow(PopUpManager.createPopUp(
    this, KeyboardWindow, true));

  wKeyboard.addEventListener(Event.REMOVED, checkText);
  PopUpManager.centerPopUp(wKeyboard);
  wKeyboard.setText(myText.text);
}


La primera sentencia crea la ventana emergente (PopUp), indicando cual es el contenedor padre (this o la propia aplicación), así como de qué tipo es la ventana hija (KeyboardWindow).

La segunda sentencia agrega el evento Event.REMOVED que permite escuchar cuándo la ventana emergente se cierra, enviando la ejecución del código a la función checkText.

La tercer sentencia se encarga de centrar la ventana emergente dentro del contenedor (en nuestro caso, la aplicación).

La cuarta sentencia le pasa al teclado virtual el texto que tenemos en la caja de texto, para su gestión.

Por último, queda la función checkText(), cuyo código es el siguiente:


private function checkText(e:Event):void {
  if (wKeyboard.action==wKeyboard.ACTION_OK)
    myText.text = wKeyboard.getText();
  else if (wKeyboard.action==wKeyboard.ACTION_CANCEL)
    Alert.show("Texto no aceptado");
}


El componente KeyboardWindow tiene una variable que contiene el estado o acción realizada antes de cerrar la ventana. Si se hizo click sobre el botón "Aceptar", el estado será ACTION_OK. Si se hizo click sobre el botón de cierre de la ventana, la acción o estado será ACTION_CANCEL. En el primer caso, se recogerá el texto gestionado por el teclado virtual mediante el método getText(), y se colocará en la caja de texto principal. En el segundo caso, se mostrará una alerta indicando que el texto no fue aceptado.

El aspecto final de este ejemplo es el siguiente:



Para ejecutar el ejemplo en directo:
http://www.tecnillusions.com/demos/DemoKeyboard/DemoKeyboard.html

Para descargar el componente y el código fuente:
http://www.tecnillusions.com/demos/DemoKeyboard/DemoKeyboard.zip

¿Razones para apostar por la tecnología OLED?

Sólo una:

viernes, octubre 16, 2009

Software por la patilla

OFICINA


MindRaider: Excelente gestor de ideas, a modo de mapa conceptual. Disponible para Windows y Linux.


PDF Creator: Permite convertir cualquier documento en formato PDF. Para ello, imprimir el documento seleccionando PDFCreator como impresora. Para Windows.


MULTIMEDIA


Gom Player: Fantástico reproductor multimedia para Windows, que incluye la mayor parte de codecs para vídeos y música.

Irfanview: Excelente visor de imágenes y reproductor de vídeos, que tiene en su haber el contar con el mayor catálogo de formatos. Para Windows.



PROGRAMACION


Aptana Studio: Increíble entorno (IDE) de desarrollo basado en eClipse, y que permite desarrollar en Java, Ruby on Rails, AIR (Adobe), HTML, CSS, Python, PHP, Ajax y Javascript. Disponible en Windows, Linux y Mac.



UTILIDADES


Defraggler: Una utilidad imprescindible. Permite organizar y ordenar (defragmentar) los datos en el disco duro. A medida que se usa el ordenador, la información se va degradando y haciéndose más lento. Defragmentar el disco permite acceder más rápidamente a la información y realizar menos accesos. Para Windows.


Nexus: Nexus añade un dock al escritorio de Windows. Esto es una herramienta muy útil que permite, entre otras cosas, tener a mano los iconos más utilizados y les permite añadir efectos especiales, o cambiar el aspecto completo del escritorio y de los elementos de ventana (hay varios temas).


FBackup: Potente y sencilla herramienta para realizar copias de seguridad de cualquier unidad de almacenamiento, permitiendo comprimir la copia y protegerla con contraseña. Para Windows.


MBR Wizard: Utilidad para recuperar el Master Boot Record (o gestor de arranque) del disco duro, en el caso de que esté corrupto, permitiendo definir la partición activa.


SEGURIDAD


Avast Antivirus Protection: Completa solución contra virus, rookits, troyanos y P2P. La versión gratuita está disponible para Windows y Linux.


INTERNET


Opera: Para mí, el navegador más innovador de todos, además del más rápido y eficaz, capaz de cargar páginas hechas específicamente para Explorer y para Firefox. Para Windows, Linux, Mac y Mobile.

Digsby: Cliente de mensajería que permite conectar con todas los protocolos y redes existentes, incluyendo correo electrónico y redes sociales. Todo en uno. Para Windows.

miércoles, octubre 14, 2009

TI Facturas v2009 ha sido liberado como Freeware


TI Facturas ahora es completamente funcional, sin limitaciones Y GRATIS. Puede descargarse la versión completa con total libertad, y poder utilizarla en entornos de producción y sin limitaciones de tiempo, máquinas o usuarios. Únicamente, no incluye soporte ni garantía, que puede ser contratado de manera opcional.

TI Facturas es el software imprescindible e ideal para que cualquier PYME o cualquier trabajador autónomo pueda gestionar de forma sencilla y económica sus presupuestos y facturas. Se ha optimizado al máximo la sencillez del programa, para que empezar a trabajar con él no sea un reto, y que el día a día sea algo natural y no consuma mucho tiempo, el cual se requeriría o se aprovecharía para otras actividades más importantes.

Para más información y descarga:

http://www.tecnillusions.com/TIFacturas/principal.html