viernes, 28 de febrero de 2020

Spring JDBC Template

Por una migración y actualización de una aplicación que tengo que hacer me he encontrado con la necesidad de tener que ejecutar consultas nativas en SQL, he pensado en integrarlo con JPA pero resulta mucho trabajo como para hacer solo algunas consultas, por lo que encontré una extensión más que provee SpringBoot para hacerlo de forma más fácil.

La configuración del jdbcTemplate es la siguiente:


@Bean(name = namedParameterJdbcTemplate")
public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource") 
                                                             DataSource dataSource) {

   return new NamedParameterJdbcTemplate(dataSource);
}


Usar NamedParameterJdbcTemplate nos permite manejar parámetros con los nombres que quisieramos, mas adelante se mostrara en el siguiente ejemplo:

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("name", name);


Así se definen los parámetros que se van a pasar a la query, utilizando nombres (:nombre) así se identifican de una mejor forma dentro de la propia query, en este caso la consulta a la base de datos es sencilla, sera muy útil cuando tengamos consultas grandes a la base de datos.

    List users = namedParameterJdbcTemplate.query(
                      "SELECT * FROM USERS WHERE NAME = :nombre ", params, new UserRowMapper());

Se puede ver que se ejecuta una consulta a la base directamente con SQL y luego utiliza un objeto mapper para hacer la transformación al objeto que quisiéramos.
public class UserRowMapper implements RowMapper {

  @Override
  public UserRow mapRow(ResultSet resultSet, int rowNum) throws SQLException {

    UserRow row = new UserRow ();

    row.setName(resultSet.getLong("NAME"));
    row.setLastName(resultSet.getLong("LAST_NAME"));
    row.setId(resultSet.getString("USER_ID"));

    return row;

  }
}

Así se define el mapper, haciendo las conversiones correspondientes y hasta con la posibilidad de personalizar las transformaciones que prefieramos.






martes, 21 de enero de 2020

Visual Basic 6 en Windows 10

Me he encontrado con la suerte de tener que hacer una reingeniería de una aplicación que está en Visual Basic 6 y el principal problema con el que me encontré es el de poder leer el código fuente, por lo que primero probé con la utilización de un editor de textos, como Sublime Text o Visual Studio Code, pero me fue imposible interpretarlo correctamente. Por lo que se me presentó la inquietud de poder verlo como lo veía él que lo programo o sea con VB6, por lo que procedí a bajarme los instaladores de Microsoft Visual Basic 6, los mismos los encontré en los siguientes links:

https://winworldpc.com/product/microsoft-visual-bas/60

https://winworldpc.com/product/msdn/vs-60

También es necesario descargar el Service Pack 6 de VB6 desde el siguiente link:

https://www.microsoft.com/es-ar/download/details.aspx?id=9183


Primero instalar el VB6

  1. Copiar el contenido del CD de Visual Basic en una carpeta del disco local. Por ejemplo C:\VB6.
  2. Copiar el contenido de toda la carpeta c:\VB6\Setup en c:\VB6
  3. Renombrar el archivo ‘vb98ent.stf’ o ‘vs98ent.stf’ (Según sea el caso debido a que hay Visual Basic 6.0 y Visual Studio 6.0) por ‘acmsetup.stf’.
  4. Ejecutar ACMSETUP.EXE (como administrador), introducir la clave de VB6 y proceder con la instalación.Se recomienda desmarcar todo lo que está relacionado con el acceso a datos (entrar dentro y desmarcarlo todo). De esta forma no se cuelga la instalación, podrá terminar y registrase en como aplicación instalada en el panel de control.
  5. Completar la instalación. Al final nos pide reiniciar Windows.

Las opciones que seleccionó yo son: Visual Basic, ActiveX, Herramientas y características empresariales, Gráficos y herramientas.
El Sourcesafe los desmarco porque para el control de versiones ya uso Git.


Instalación del MSDN

  1. Lo mismo que la instalación de VB6. Copiamos el contenido del MSDN en una carpeta del disco. Por ejemplo c:\Temp\MSDN.
  2. Copiamos el contenido de la carpeta c:\Temp\MSDN\Setup a c:\Temp\MSDN.
  3. Renombrar ‘msdn98.stf’ que se encuentra en la carpeta donde copiamos todo por ‘acmsetup.stf’.
  4. Ejecutamos como administrador el archivo acmsetup.exe. Seleccionamos las opciones que necesitamos y listo, otra cosa instalada.


Instalación del Service Pack 6 de VB6

Es de forma similar a las instalaciones anteriores:
  1. Se descomprime el archivo Vs6sp6B del SP6 en una carpeta, por ejemplo C:\Temp\SP6.
  2. Se renombra el archivo sp698vbo.stf a acmsetup.stf (o sp698ent.stf si el SP6 que tienes es el Vs6sp6).
  3. Se ejecuta acmsetup.exe y se instala seleccionando instalación completa.

jueves, 12 de septiembre de 2019

Como instalar las versiones de los SDK y Herramientas de Android

El siguiente comando muestra la lista de versiones de SDK y distintas herramientas para instalar.


android list sdk --all


Para poder instalar una de las opciones que mostro el comando anterior se debe ejecutar el siguiente comando junto con los números que muestra el listado:

android update sdk -u -a -t <package no.>

Ejemplo:

android update sdk -u -a -t 1,2,3,4,..,n 

miércoles, 11 de septiembre de 2019

Locks en Informix

Uno de los problemas con que me encontré  en la bases de datos Informix fueron bloqueos de las tablas completos y las consultas que se realizan a la misma tabla termine como error por que expiró el tiempo de espera. Había procesos que corrían a la vez, las tablas se bloqueaban y las consultas no tenían un tiempo de espera para que termine el bloqueo a la tabla y continue con la consulta.

En resumen existían dos problemas:
- El bloqueo completo a la tabla.
- No había timeout para el bloqueo.

El bloqueo completo a la tabla

Cada tabla tiene configurado como es el nivel de lockeo de la misma o sea si es a nivel Registro (ROW) o a nivel conjunto de registros (PAGE).
La forma de saber que tipo de lockeo tiene una tabla, se puede ver con la siguiente consulta:

select tabname, locklevel from systables;

R = row
P = Page

para modificar el nivel de lock de una tabla se debe usar la siguiente instrucción:

ALTER TABLE customer LOCK MODE(page);

No había timeout para el bloqueo

Se puede configurar para que cada cliente que se conecte a la base de datos pueda tener un tiempo de espera ante bloqueos en las tablas, como para que las consultas que estemos haciendo no lancen errores por no esperar ni un segundo. Para ello se le debe configurar un parámetro dentro del cliente denominado IFX_LOCK_MODE_WAIT donde el valor que se le pasa es la cantidad de segundos de timeout. 

En el caso de que se requiera hacer la configuración por JDBC el parametro se debe llamar ifxIFX_LOCK_MODE_WAIT.




martes, 15 de enero de 2019

El gran Jenkins - automatización

Veremos en términos rápidos y generales algunas características básicas de Jenkins, principalmente lo que debemos saber sobre esta gran herramienta para dar una breve descripción para enseguida ir directo a trabajar con ella, no profundizaremos en su historia y orígenes, simplemente hablaremos de lo principal como cultura general:

  • Jenkins es un software de integración continua muy potente de código abierto escrito en Java, anteriormente conocido como Hudson, con esta herramienta podremos desplegar nuestro código en un servidor donde será compilado y probado.
  • Por medio de Jenkins podemos configurar la forma en la que vamos a obtener el código fuente y en la que queremos analizar el código de nuestro proyecto e integrar la herramienta con otras aplicaciones para hacer un análisis profundo de los resultados obtenidos, tales como generación de reportes, ejecución de distintas pruebas, gráficos o informar de malas prácticas implementadas en las líneas de código entre otros muchos tipos de informe.
  • Jenkins tiene soporte para sistemas de control de versiones, algunas como SVN, CVS, Git y corre en un servidor de aplicaciones como por ejemplo los muy conocidos como Tomcat o Jboss permitiendo la ejecución de proyectos configurados con Ant y/o Maven. También el paquete war de Jenkins contiene un servidor interno Jetty el cual con solo ejecutar el war con Java le da funcionamiento a Jenkins.
  • Con Jenkins basándonos en el concepto de integración continua o continuous delivery, cada vez que un programador del equipo de trabajo realice un cambio sobre el código fuente y lo suba al repositorio de código fuente, el sistema mediante la ejecución de sus tareas automáticas podrá revisar dichas actualizaciones y determinar su correcto funcionamiento mediante compilación, ejecución de pruebas unitarias y/o funcionales. 
  • Facilita el seguimiento a procesos de distintas áreas (Desarrollo, Testing, UAT y demás), encontrar defectos lo antes posible y poder tomar de decisiones sobre bugs o mejoras en la calidad del software.
  • Se integra al equipo de trabajo como una herramienta muy útil, facilita la organización pudiendo mejorar y agilizar los procesos, estabilizar la aplicación y mejorar la calidad del proyecto.


Lo anteriormente dicho son algunas de las características básicas de Jenkins, como vemos esta es una pequeña y rápida introducción de la Herramienta, tal vez un poco confusa pero con muchas mas aplicaciones, desde la página oficial de Jenkins se puede consultar más información, acceder a su wiki, comunidad, foros y herramientas ingresando a http://jenkins-ci.org/

viernes, 11 de enero de 2019

Reconstruir el proyecto de Ionic

Me ha pasado varias veces que agrego librerías en Ionic para hacer distintas pruebas y luego cuando ya defino que plugin o librería usar, el proyecto me queda sobrecargado de librerías. Por eso la idea de este post es poder limpiar todas las librerías agregadas y que solo queden las que realmente se van a usar en el proyecto.

Cuando se quiera limpiar el proyecto y volver a construir el proyecto desde los archivos de configuración, se debe seguir los siguientes pasos:

  1. Borrar los directorios node_modules, plugins y platforms
  2. Ejecutar en la raiz del proyecto 
  • npm install -g
  • ionic cordova prepare
  • ionic cordova platform add android

Otra forma mucho mas facil que hace exactamente lo mismo es correr el siguiente comando:


  • ionic repair

viernes, 17 de agosto de 2018

Ataques Web - Exposición de datos sensibles

Muchas aplicaciones Web no protegen adecuadamente los datos sensibles, tales como números de tarjeta de crédito o credenciales de autenticación. Los atacantes pueden robar o modificar tales datos para llevar a cabo fraudes, robos de identidad u otros delitos. Los datos sensibles requieren de métodos de protección adicionales tales como el cifrado de datos, asi como tambien de precauciones especiales en un intercambio de datos con el navegador.


Como detectarlo


Lo primero que debe determinar es el conjunto de datos sensibles que requerirán protección extra. Por ejemplo, contraseñas, números de tarjeta de crédito, registros médicos, e información personal deberían protegerse. Para estos datos:

  1. ¿Se almacenan en texto claro a largo plazo, incluyendo sus respaldos? 
  2. ¿Se transmiten en texto claro, interna o externamente? El tráfico por internet es especialmente peligroso. 
  3. ¿Se utiliza algún algoritmo criptográfico débil o antiguo? 
  4. ¿Se generan claves criptográficas débiles, o falta una adecuada rotación o gestión de claves? 
  5. ¿Se utilizan tanto cabezales como directivas de seguridad del navegador cuando son enviados o provistos por el mismo?

Como prevenirlo


Los riesgos completos de utilizar cifrado de forma no segura, uso de SSL, y protección de datos. Dicho esto para los datos sensibles, se debe realizar como mínimo lo siguiente:

  1. Considere las amenazas de las cuales protegerá los datos (ejemplo atacante interno, usuario externo), asegúrese de cifrar los datos sensibles almacenados o en tráfico de manera de defenderse de estas amenazas. 
  2. No almacene datos sensibles innecesariamente. Descartelos apenas sea posible. Datos que no se poseen no pueden ser robados. 
  3. Asegúrese de aplicar algoritmos de cifrados fuertes y estándar así como claves fuertes o gestionelas de forma segura. Considere utilizar módulos criptográficos validados como FIPS 140. 
  4. Asegúrese que las claves se almacenan con un algoritmo especialmente diseñado para protegerlas como ser bcrypt, PBKDF2 o scrypt. 
  5. Deshabilite el autocompletar en los formularios que recolectan datos sensibles. 
  6. Deshabilite también el cacheado de páginas que contengan datos sensibles.