Entradas recientes:
Identificación de imagenes mediante código de barras
Este artículo informa sobre una solución de reconocimiento de códigos de barras en imágenes escaneadas.
Situación:
Un cliente necesita añadir la gestión de documentos recibidos en papel de sus clientes, a una aplicación nuestra en Java. La solución que nos presentan es identificar los documentos recibidos generando y pegando una etiqueta con un código de barras y depositándolos en una bandeja para su escaneo y reconocimiento posterior.
La dificultad mayor era reconocer cada imagen escaneada leyendo el código de barras, para poder identificar el documento asociado e incorporar su contenido en la BDD, para que esté disponible para el resto de las operaciones a realizar con él (archivo, consulta, envío, etc.).
Desarrollo:
Existen varias librerías en Java para el reconocimiento de códigos de barras en imágenes. Las de pago, se descartan en primera instancia, dado su elevado coste para la versión de desarrollo, y se decide estudiar las librerías de código abierto, en concreto ZXING.
Tras instalar la librería y enlazar en el proyecto se comienzan las pruebas y se estudia el funcionamiento. Cabe destacar
- Se opta por imágenes en B/N en un formato sin perdida, que funciona mejor que los formatos con compresión.
- Se elige el formato .TIFF a 300ppp, único del scanner sin compresión.
- Como Java no soporta TIFF hasta la versión 9, y estábamos en la 8 (sin intención de migrar el entorno), es necesario añadir alguna extensión, tras probar varias sin éxito, se adopta TwelveMonkeys con éxito.
- Se añade la funcionalidad necesaria en la aplicación, para crear los documentos, asociarlos a sus destinos e imprimir la o las etiquetas identificativas de documento a pegar.
- Se añade la tarea que lee las imágenes, reconoce el código, e incorpora las imágenes convertidas a pdf en la BDD. En caso de ser multi página, se van añadiendo paginas al pdf existente.
Curiosidades:
El procedimiento empleado por el reconocedor de códigos de barras, busca dicotómicamente por líneas verticales y horizontales hasta encontrar un código, por tanto, es necesario que el código sea leíble en una línea vertical u horizontal. De modo que uno a 45º puede no leerse si por su anchura y altura no lo cruza íntegramente líneas verticales ni horizontales.
Basta con que encuentre una línea correcta para leerlo, de modo que los fallos en partes del código no afectan, salvo por ejemplo manchas en el scanner que provoquen rayas en la misma dirección que las barras.
Se puede configurar el reconocedor para distintos formatos, incluidos códigos QR, ciertas orientaciones, todos los códigos o solo el primero, etc.
Migración de MySql a SQL Server
Este post pretende informar de posibles cambios a realizar en una migración de MySQL a SQL Server
Situación:
Recientemente un cliente quería actualizar el hardware y el software de una aplicación nuestra a las últimas versiones de todo, tras 10 años de servicio mantenimiento y mejoras, considerando además la intención de ampliarla para abarcar nuevas líneas de negocio.
Desarrollo:
La migración del S.O, .net y del entorno de desarrollo en VisualStudio a la última versión fue sencilla con pocos cambios (configuración, nueva aplicación para los test, diferente gestión de direcciones IP).
El cambio de versión de MySql empezó a dar problemas, y se optó por migrar de la BDD de MySql a SQL Server que es su motor estándar actual. Se pensó que iba a ser fácil, cambiando la cadena de conexión y algún query peculiar, pero no fue así, y la cosa se complicó.
Hubo que hacer algunas modificaciones:
- La migración de los datos no fue directa, fallaron las utilidades de exportación e importación cruzada, y hubo que usar una herramienta genérica (con varias limitaciones) y revisarla.
- Cambiar las referencias del proyecto, los Import y algunas clases específicas de cada una.
- Cambiar las cadenas de conexión
- En SqlServer no se puede obtener el nombre de la tabla de cada columna en los queries (cosa que se usaba sistemáticamente)
- La sintaxis de los INSERT es distinta, rehacer
- Cambiar los parámetros de ‘?’ a ‘@’ en todos los queries
- Diferente gestión de las conexiones, transacciones y cursores
- Existen diferencias en algunos tipos de columna: enteros con distinta longitud, boleanos
- Distinta gestión de columnas ‘Identity’
- Cambian algunas funciones (por ejemplo, de fechas y cadenas)
- MySql permite hacer un ‘Group by’ por sólo algunas columnas no agregadas (por ejemplo, la Pk), mientras que SqlServer obliga a agrupar por todas las no agregadas
- SqlServer no tiene ‘TRIGGER BEFORE …’
Conclusión:
La migración se completó, las diferencias en las BDD convirtieron una migración de unas horas, a varios días de cambios, pruebas y depuración.
No obstante, ahora todo funciona estupendamente, incluso apreciablemente más rápido.