Sobre la palabra reservada “using” en C#

Antes que nada perdón por el título, me dolió muchísimo escribir palabra reservada en lugar de escribir como estamos más acostumbrados keyword en argentina. Pero decidí utilizar su traducción porque después de todo este es un blog en español y mucha gente que lo consulta acostumbra a utilizar únicamente español en sus consultas.

Hecho este descargo, el motivo fue que hice un pequeño programita que escribía en un archivo, para ello me basé en la ayuda de Microsoft que utilizaba el keyword using de la siguiente manera

using(StreamWriter w = new StreamWriter("BuildAll.sql")) {
// hago lo que quiero con el writer
}

Un poco tardíamente (ya que esto existe hace varios años)  me surgió la duda de para que servía realmente using. El saber popular dice que es para asegurarse que se liberan los recursos que podrían haberse reservado, pero esta explicación no era suficiente para mi y quería saber realmente como funcionaba.

Consultando en internet encontré en CodeProject el artículo titulado The “using” Keyword in C# en el cual el autor comenta  su investigación sobre el asunto. Recomiendo a cualquiera que le interese un poco el funcionamiento interno de las cosas que le pegue una leida a ese artículo.

En resumen lo que dice es que lo que hace este keyword es crear un bloque try..finally, en donde como última acción se realiza un dispose del objeto que figura en el parámetro del using. Y que si la clase que se esta intentando limpiar no implementa correctamente la interfaz IDisposable no sirve de mucho.

En fin, esto más que nada me pareció una curiosidad que a otros les parecio interesante que escribiera aquí.



Mockear la misma clase que se esta testeando para realizar pruebas unitarias

En el artículo anterior comenté que es aconsejable aislar en diferentes métodos aquellos fragmentos de código que no pueden ser testeados unitariamente (por ejemplo las consultas con Hibernate Criterias, o Hql) de tal manera que puedan ser mockeados y de esa manera poder testear el resto del código.

Pero cuando intenté llevar a la práctica esto, descubrí que no quería crear una clase nueva para tener estos métodos, sino que quería que estén en la misma clase. Esto me planteaba un problema. Necesitaba mocker el método que no quería que se ejecutara, pero no sabía si podía mockear una clase en la cual había un método que si quería testear.

La respuesta fácil es SI, se puede, pero hay una limitación. El método que se quiere mockear hay que hacerlo utilizando metaClass. No se puede utilizar demand, como con los mocks normales, sino que se debe si o si utilizar metaClass.

Uno puede decir, que para eso no hago ningún mock, y simplemente utilizo metaClass para pisar el método en cuestión, pero lamentablemente, como dicen en muchos otros blogs, hacer eso no es seguro, y puede afectar el resultado de otros tests. (de hecho en mi se veía el error en los test de integración que comenzaron a fallar y no entendía por qué)

Basta con llamar a mockFor sobre la clase que se quiera testear, y luego se puede utilizar metaClass tranquilamente para cambiar esa clase, que cuando se termine el test los cambios se revertirán normalmente.

Se que mucho tal vez no se entienda, asi que dejaré un pequeño ejemplo comentado aquí

Quiero testear el método agregar de la clase DestacadoService. Este método internamente llama al método buscarDestacado el cual utiliza bastante hql para realizar su función, el cual no funciona en pruebas unitarias, entonces para realizar el test de agregar se necesita hacer algo similar a lo siguiente:

mockFor(DestacadoService)
DestacadoService.metaClass.buscarDestacado = { pais, tipo, id -> return null; }

def service = new DestacadoService()
def r = service.agregar(pais.argentina, tipo.principal, 'mi destacado')

Como se puede apreciar, en la línea 1 llamamos a mockFor sobre la clase que queremos mockear
En la línea 2, utilizamos metaClass para cambiar el método (y retornar algo estático que no use hql ni nada)
En la siguiente línea de código instanciamos la clase que contiene el método que queremos testar
Y finalmente, en la última lo ejecutamos

Haciendo esto nos aseguramos que luego del test el cambio sobre la clase causado por la modificación del metaClass sea revertido y no afecte al resto de los tests.

Exactamente lo mismo se debe hacer cuando se quieren modificar métodos que estén en clases de dominio. Solo que en lugar de utilizar mockFor se puede utilizar mockDomain

Como hacer pruebas unitarias con Grails que tienen método que acceden a la base de datos

Una de las tareas mas importantes, y a la vez que más esquivamos hacer son los famosos tests, tan necesarios para las metodologías ágiles que nos gusta seguir.

En grails hay principalmente dos tipos de tests. Unitarios y de Integración. Los primeros se ejecutan muy rápido pero no cuentan con todo el entorno de grails especialmente hibernate, y los segundos demoran mucho más en su ejecución, pero contamos con todas las funcionalidades de grails.

Según mi humilde opinión, debemos intentar hacer la mayor cantidad de tests posibles utilizando pruebas unitarias, ya que en mi experiencia por ser tan lentos los tests de integración, terminamos sin usarlos.

Pero nuestra intención de usar test unitarios lo más posible, se golpea contra un muro de concreto cuando intentamos testear métodos que utilizan Criterias o Hql, ya que al depender de hibernate, el cual no está disponible durante las pruebas unitarias no hay forma de hacerlos funcionar.

Un “tip” es intentar utilizar tan poco estas funciones como sea posible, y cuando no queda otro remedio que usarlas, intentar centralizar todo el código en algunos métodos que únicamente se encarguen de realizar estas consultas, los cuales serán probados con test de integración.

Si todo este código lo ponemos en una clase diferente, entonces podremos mockearla para las pruebas unitarias y el resto de nuestros métodos que no dependen de hql ni criterias, podrán ser testeados ya que se limitarán a invocar los métodos problemáticos sobre un mock, y problema resuelto.

Sin embargo a veces no queremos poner estos métodos en otra clase, sino que deseamos que sean métodos de la misma clase que estoy estoy testeando, o los métodos se encuentran en clases de dominio, y ahí se producen algunos otros problemillas que trataré en el siguiente post.

HTML5 – Custom Data

Seguramente llegamos tarde,  pero siempre es bueno reconocer las cosas buenas, o al menos que nos resultan beneficiosas. En este caso estoy haciendo un sitio dinamico, donde necesitaba agregar información extra a los tags html para luego ser utilizada desde javascript.

Hasta hoy, no habia una forma que realmente me gustara de realizar esto, ya que o eran muy complejas, o no pasan la prueba de XHTML válido. Estas eran a pesar de la especificación agregar los atributos a los tags html directamente y luego recuperarlos utilizando getAttribute, o utilizando alguna librería de javassscript (o javascript puro) para realizar la misma tarea, pero 100% en el lado de javascript y asi pasar las validaciones de html.

Pero hoy investigando sobre HTML5 encontré que finalmente definieron una manera estructurada de lograr este objetivo. Así que a diseñar paginas HTML5 se ha dicho ;)

Rápidamente, todos los atributos que se definan con el prefijo data- se conciderarán validos y como datos costumizados, que no afectan la renderizacion del sitio. Justo lo que quería !

Mas información pueden encontrar en los sitios que me base los cuales fueron JavaScript Kit, el blog de John Resig y también en la pagina de referencia formal, o sea la especificación HTML5 (que aun se encuentra en draft)

Aunque me parecen maravillosas noticias, concuerdo igualmente que esta especificación, en el futuro y cuando se popularize su uso va a llevar a un caos de colision de nombres, como indican en la página html5Doctor

Al margen de custom-data, otra cosa que estoy investigando y espero pronto usar para poder comentarla en este blog (aunque aun no he tenido la necesidad de hacerlo) es la especificación sobre microdata.

Ejecutar un webservice en tomcat 6 con jdk 1.6 y jax-ws

Se que muchos deben haber andado buscando una forma sencilla de resolver el típico problema: ¿Cómo hago un webservice de java tan fácil como lo hago con .NET? Se dice, la nueva arquitectura de java, es muy buena. Se que es posible, se que gente que la usa, pero en ningún lado encontré una forma concreta y práctica que garantice su funcionamiento. Bueno, no estoy seguro que sea eso lo que piensen, lo que si estoy seguro es que eso fue lo que me pasó a mi… y no es poca cosa, debo agregar. Me costó un poco encontrar una respuesta coherente que sea fácil de transmitir, de ahí, este post.
Intentaré describir en dos niveles, el primero con un ejemplo práctico y el segundo detallando cada función usada. ¿Por qué? porque prefiero que la gente que lea esto entienda el por qué de las cosas que se están haciendo.

  1. Crear un proyecto Web (no importa la herramienta, son siempre iguales)
  2. Configurar el web.xml indicándole que direcciones los pedidos (de alguna url) al servlet de jax-ws
  3. <listener>
    	<listener-class>
    		com.sun.xml.ws.transport.http.servlet.WSServletContextListener
    	</listener-class>
    </listener>
    <servlet>
    	<description>## descripción del Servlet ##</description>
    	<display-name>## nombre a mostrar entre los servicios ejecutándose en el servidor ##</display-name>
    	<servlet-name>## nombre de referencia dentro del xml para el Servlet ##</servlet-name>
    	<servlet-class>
    		com.sun.xml.ws.transport.http.servlet.WSServlet
    	</servlet-class>
    	<load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    	<servlet-name>## nombre de referencia dentro del xml para el Servlet ##</servlet-name>
    	<url-pattern>/##url_dentro_de_la_aplicacion_para_el_servlet##</url-pattern>
    </servlet-mapping>
    
  4. Crear un WEB-INF/sun-jaxws.xml que contenga:
  5. <?xml version="1.0" encoding="UTF-8"?>
    <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
    	<endpoint name='##nombre_de_la_aplicacion##' implementation='paquete.ClaseConAnotacionWebService' url-pattern='/url_asignada_al_servlet_del_webservice' />
    </endpoints>
    
  6. Configurar las clases que se desea publicar como WebService, con un @WebService
  7. Descargar el jax-ws (la descarga es un jar, que al clickear muestra una licencia y al aceptar descomprime muchos archivos). Hay que copiar todos los *.jar dentro del directorio $CATALINA/lib
  8. Al desplegar la aplicación web, dentro de un WAR, en el tomcat, el jax generará automáticamente los wsdl y todo archivo necesario para publicar el webservice.

Espero que con esto se entienda, links de referencia:

Instalación de Toad for Oracle 10 en Windows 7 – 64 Bits

Después de un día de lucha y varias batallas intentando hacer funcionar Toad para Oracle 10, logramos hacer que la conexión con InstantClient tenga éxito.

El problema estaba en el Oracle Client que estabamos usando, nos habiamos instalado el InstantClient de Oracle de 64 bits y si bien lo estabamos haciendo sobre Windows 7 de 64 bits, el problema de que la conexión entre Toad y el Client era fallida se debía a que por alguna razón Toad for Oracle 10 es compatible solo con InstantClient de 32 bits.

A continuación paso a detallar los pasos que seguimos para hacer que la conexión sea exitosa:

- En primero creamos una carpeta con el nombre “oracle” en el C:\.  Allí creamos dos carpetas mas, una con el nombre “bin” y la otra “network”.

- Una vez hecho esto lo que hicimos fue crear, en la carpeta “network”, la carpeta “admin” (tal como se muestra en la imagen anterior) y dentro de esta última los siguientes archivos: tnsnames.ora y sqlnet.ora.

Ahora les paso el detalle del contenido de cada archivo:

tnsnames.ora

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.33.7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )
ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

————

sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES = (NTS)

———–

- Por último, lo que nos quedó por hacer fue agregar las variables de entorno que les detallo a continuación:

  • ORACLE_HOME = C:\oracle
  • ORACLE_HOME_NAME = C:\oracle
  • SQL_PATH = C:\oracle
  • TNS_ADMIN = C:\oracle\network\admin
  • LD_LIBRARY_PATH = C:\oracle\bin

Y luego agregamos en el PATH:

  • C:\oracle\bin

Bueno, una vez hecho todo esto la conexión fue un rotundo éxito.

Aquí les dejo el la URL de donde sacamos la info para poder seguir todos los pasos detallados antes, tambiés les paso el link para la descarga del InstantClient 32 Bits.

- Blog XP-RIENCE

- IstantClient (descargar el archivo: instantclient-basiclite-win32-11.2.0.1.0.zip)

Esta fué mi primer publicación, espero que les sirva y se entienda, ante cualquier reclamo comunicarse con defensa al consumidor.

Saludos!!

Fernando M. S. Garrido.-

Soluciones 3f audita exitosamente para certificar ISO 9001

Ayer, después de varios meses de preparación y entrenamiento. Con la ayuda de Sofía Holder, Nicolás Censsi y Juan Carlos Masoero de Axintia. Realizamos la primera auditoria externa en ISO 9001, realizada por Ana y Eric del ente certificador SGS.

Esta acción nos pone más cerca de la calidad que queremos y sabemos nos da ventaja competitiva en el mercado de software.

Hemos de confesar que la Guía 90003, creada por la ISO/IEC avalada por IRAM que aunque parece estar orientada al software también está un poco desactualizada dando valor y haciendo requerimientos que van en contra de algunas de nuestras filosofías: ser ágiles. Uno de los auditores no podía entender nuestra dinámica… si, somos raros, ¿y qué? (Gracias Ana por la paciencia)

Este proyecto se inicio a partir de un subsidio de tipo ANR (aporte no retribuible) de la Agencia Nacional de Promoción, Ciencia y Tecnología. Que brinda el 50% del costo total del proyecto sin necesidad de devolverlo. Subsidio que, además, aprovechan muchas empresas de software.

La certificación de calidad también nos permite entrar dentro del marco de la ley de promoción de la industria de software. Permitiéndonos mantener nuestros precios competitivos a la par de nuestro crecimiento.

Fue un día largo, todos terminamos agotados pero afortunadamente se creó un excelente clima con los auditores, asesores y todo el equipo de la empresa quienes hicieron de eslabón esencial para llegar a este logro. Estamos orgullosos de haber dado este paso y nos entusiasma el futuro. Pero, principalmente, estamos muy contentos.

Aquí algunas fotos celebrando el momento al final del día. (Habíamos guardado un Champagne por si todo salía bien… y salió tan bien que también abrimos la sidra que estaba en la heladera)

¿Facebook una herramienta de comunicación?

Hace algunos días me encontré con varios links que “critican” la actitud que la gente ha tomado hoy en día con facebook, pareciera que todo pasa por lo que se dice y no se dice dentro de esta red social. Pareciera que ya no tenemos ganas de comunicarnos y encontrarnos, parece que ahora lo importante (e interesante) es hacer cosas del tipo:

  • comentarios en los mensajes personales de nuestros amigos
  • vemos fotos de personas que ni conocemos, ni nunca vimos personalmente pero nos divertimos viendo qué es de su vida (?)
  • “nos gusta” o “no nos gustan” cosas que en realidad no nos interesaron nunca ni mirar
  • relaciones? resulta que ahora mi estado amoroso en facebook es real y muy importante para mi circulo de amigos
  • tengo una granja y necesito que mis amigos la vean y ayuden a cultivarla

Yo tengo en mente que facebook es una genial herramienta para conectarme con gente que no veo diariamente o que está a una distancia tan grande que me es imposible mantener contacto… como gente que conocí de viaje, amigos del secundario (con los que he mantenido contacto y organizamos juntadas de vez en cuando) o personas que están en el exterior. Hasta es bueno para hacer anuncios a tus amigos de forma que se enteren en que andás por estos días… pero, vamos… tampoco vamos a convertirnos en facebook adictos y que todo lo que nos pase sea exclusivamente a través de ahí! De hecho ahora nos encontramos con que tenemos: buzz, twitter, facebook, orkut… uff… Estos videos, a mi parecer, nos muestran un poco en que nos está convirtiendo facebook… ¿queremos terminar así?

Ahí van los links

Alinear imágenes en WordPress

Como algunos saben, una de las cosas que más nos interesan es explorar las diferentes tecnologías: sea esto a través de explorar redes sociales, diferentes blogs, videos, podcasts… google! sin importar de donde venga la información es clave identificar soluciones para poder aplicar a quien sea que lo necesite.
Esta vez, una de las cosas que me pareció útil, fue saber cómo hacer para configurar la apariencia de WordPress (el Template) de forma que las imágenes se alineen de forma correcta. Me di cuenta que, a pesar que en el editor yo indicaba alinear una imagen a derecha o izquierda, esta imagen quedaba mal alineada… a veces centrada, a veces a la derecha y otras… la mayoría en cualquier lado.
¡La solución fue muchísimo más fácil de lo que hubiera pensado! Al parecer WordPress alinea en base a un estilo CSS, este estilo puede estar configurado (o no) por quien haya hecho el estilo… básicamente si el estilo no soporta toda la funcionalidad de WordPress nosotros podemos cargar con las consecuencias.

Aquí un interesante link donde explica las vicisitudes de usar imágenes en WordPress… Espero les sirva.

pd: Si, es un post corto y apunta a uno de los archivos de documentación de WordPress… pero, no por eso, menos interesante!

La TV digital en Argentina

Hace algunos días con Juan y Leo, dos amigos, nos salió el tema de conversación de la TV digital (de nuevo, porque Juan se trajo un LCD de Chile)… al parecer Argentina, Chile y Brasil tendrían la misma norma (así como otros países de Latinoamérica, exceptuando Uruguay) para potenciar la fabricación en la zona del equipamiento decodificador. Esta norma, es una variante de la Japonesa… pero está aprobada por Japón y ayudaron a construirla porque dicen que les interesa “llevar alta tecnología a los países en vías de desarrollo”.

Es interesante que el gobierno nacional Argentino regalaría un millón de decodificadores para casas que no cuenten con tv por cable.

El decreto (publicado en septiembre del 2009) que describe la reglamentación para la TV digital, dispone:
Art. 4º — Establécese un plazo de DIEZ (10) años a fin de realizar el proceso de transición de la televisión analógica al SISTEMA ARGENTINO DE TELEVISION DIGITAL TERRESTRE (SATVD-T).

Lo anterior se refiere exclusivamente a la tecnología para codificar la información digital para transmitir los canales, muchos le llaman señalización.

Debo también agregar que las compañías de televisión por cable tienen su propia norma de transmisión ya que siendo privadas pueden optar por la tecnología que mejor les venga, usando algún tipo de decodificador (DirectTV tiene el suyo, Cablevision tiene otro) que produce el contenido a través de un canal HDMI (de la misma forma que lo transmiten los lectores de bluray o cualquier otro reproductor de contenido en alta definición, PS3 por ejemplo).

Material de referencia:

¿Qué les parece?