.NET Remoting y Servicios Web

Antes de nada comienzo como muchas veces dejando primero unos links a definiciones algo más concretas para luego pasar a desarrollar un poco el tema, que en este caso trata de Remoting y Servicios Web
https://en.wikipedia.org/wiki/.NET_Remoting
https://es.wikipedia.org/wiki/Servicio_Web
Es curioso porque lo de los servicios web se oye hoy en dí­a por todas partes. Está en boca de todo el mundo, y la verdad es que hay motivos de sobra para esto ya que ha supuesto una revolución en cuanto a la arquitectura y ante la intercomunicación de sistemas desarrollados en diferentes plataformas y tecnologí­as. Al rey lo que es del rey, y bajo mi punto de vista los servicios web no son una moda, si no algo que realmente tiene potencia y valor. No estoy diciendo que sea la solución para todo y que después de esto no vaya a haber nada más (eso nunca pasa, al final siempre sale algo mejor), pero insisto en el hecho de que ha supuesto una verdadera revolución en la intercomunicación de sistemas.
Cuando nos ponemos a hablar de Remoting para .NET entonces la cosa ya cambia. No todo el mundo sabe muy bien para qué funciona, o tal vez ni lo hayan oido nombrar nunca. La verdad es que en parte sus razones hay, sobre todo por el hecho de que Remoting es algo que pertenece íºnicamente a la plataforma .NET y que está desarrollado por Microsoft y para plataformas Microsoft. Puedes hacer un servicio web en una plantaforma Java, PHP, Ruby on Rails, .NET y consumirlo desde cualquier otra plataforma, pero un servicio de Remoting vas a tener que pasar por el tubo para ponerlo en marcha tanto en la creación como en la consumición.
¿Y esto quiere decir que es mejor solución optar por los servicios web que por un servicio de remoting? Pues no, como siempre la mejor solución va a depender del problema.
A la hora de decidirse lo primero que hay que tener claro es que tanto remoting como los servicios web vienen a resolver parte de la misma problemática, es decir, encapsulan el modelo de negocio en un servidor de aplicaciones, el cual puede ser accesible desde otras aplicaciones. La lógica de la aplicación no está en la aplicación, si no en el servidor de servicios web o el de remoting. Además, mira tíº por donde, podemos levantar un servicio web y un servicio de remoting en un mismo servidor web (Internet Information Server). Y encima, los dos trabajan sobre http, por lo que nos quitamos de encima todo el problema de puertos, firewall y toda la pesca. ¿Sobre la seguridad? IIS nos solventa el problema en ambos casos.
¿Entonces que les diferencia? Paso a enumerar:
1) Un servicio de remoting es más eficiente que un servicio web si serialiamos los mensajes de remoting en formato binario.
2) Un servicio web es totalmente independiente de la plataforma que lo consume ya que utiliza SOAP como estándar de comunicación.
3) Un servicio de remoting debe ser creado y consumido por aplicaciones .NET.
4) Es más sencillo crear y mantener un servicio web que un servicio de remoting.
5) Un servicio web puede utilizar íºnicamente http como canal de comunicación, en cambio un servicio de remoting puede trabajar también mediante TCP. Si unimos TCP+Serialización binaria es cuando conseguimos la mayor eficiencia trabajando con remoting.
6) Si utilizamos remoting mediante TCP vamos a tener que trabajarnos por nuestras cuenta todo lo referente a seguridad y autenticación, mientras que si lo montamos sobre un IIS y http, IIS nos va a resolver toda la papeleta.
Para terminar os dejo una captura de pantalla de un ejemplo de arquitectura donde Remoting y Servicios Web conviven. Como podréis observar los clientes .NET internos consumen servicios de remoting, mientras que los usuarios que acceden a través de internet consumen servicios web. Como tenemos completamente separado el modelo de negocio todo esto es posible, ¿qué bonito verdad? ¿A que mola la capa de fachada de negocio? Hablaremos un dí­a de estos del patron de diseño Faí§ade. ¿No os suena un poco la cosa? A simple vista parece un modelo de factorí­a como el que podrí­amo usar para diferentes bases de datos, pero aplicado a diferentes tipos de servicios.
Remoting y Servicios Web Trabajando Juntos
Saludos.
Miguel.

Kumbia, un framework PHP que quiere ser como Ruby on Rails

Hola a todos,
El otro dí­a, un compañero de trabajo me comentó que estaba a empezar a trabajar con Kumbia (https://www.kumbiaphp.com), un framework de PHP del cual le habí­an dado buenas referencias.
La curiosidad me hizo entrar en la web y echarle un ojo, y me sorprendió bastante el comprobar que incorpora algunas de las bases de Ruby on Rails, tales como Active Record y el Andamiaje, además de generar automáticamente una estructura de directorios para cada proyecto que creas.
¿Qué quiere decir esto, que las buenas ideas que ha arrojado Ruby on Rails están empezando a asentarse en la comunidad web? Por ahora parece que lenguajes como PHP se hacen eco de estas técnicas, pero, esto va a quedar íºnicamente para lenguajes de código libre como PHP, y Ruby o lo vamos a poder ver pronto en otros como J2EE y .NET.
Os dejo una URL de un proyecto de ActiveRecord para .NET https://www.castleproject.org/ 🙂
Saludos.
Miguel.

Eligiendo tecnologí­a web

Una conversación en la noche de ayer con un amigo ha inspirado este post, ¿cuál es la tecnologí­a web más adecuada para mi proyecto?
Uf, ¡qué difí­cil pregunta! Como siempre una respuesta genérica a esta pregunta es, PUES DEPENDE. Y es que la verdad es cierto, va a depender de muchos factores. No pretendo sacar ningíºn tipo de conclusión al respecto después de haber terminado este post, pero sí­ almenos aproximar un poco los factores que bajo mi punto de vista afectan a nuestra decisión.
Antes de nada empezar diciendo que no existe una tecnologí­a absolutamente mejor que las otras, habrá una tecnologí­a que para los factores que rodean tu proyecto será mejor que las otras en un momento dado. Y digo en un momento dado porque ese es el primer problema a la hora de elegir, que contamos con las circunstancias y las previsiones del momento. Las previsiones y las planificaciones, pueden fallar, quedarse cortas o pasarse de largo… y si esto puede ser crí­tico a la hora de definir un requerimiento funcional imagí­nate al decidir la plataforma tecnológica sobre la que tu aplicación se va a asentar.
Pero bueno, vayamos al grano y pasemos a hablar un poco de los factores que pueden influenciarnos. Empiezo con los más tí­picos para luego ir dándole vueltas a otros algo más rebuscados.
Multi-Plataforma
Si tu proyecto tiene entre sus restricciones que sea publicable a través varias plataformas del mercado estás de suerte, almenos a la hora de tachar algunas de las opciones que estés barajando. De todas maneras, un humilde consejo en este aspecto es recapacitar realmente si es realmente necesario que sea multi-plataforma, porque muchos veces lo ponemos de restricción cuando luego al final trabajamos con una y listo. El concepto de multi-plataforma vende mucho, es un cartel muy bueno de marketing, ¿pero realmente lo necesitas?
Sin Coste Económico o de Coste Bajo
¿Puedes pagar licencias? ¿Quieres pagar licencias? Tal vez tengas presupuesto para ello, o tal vez no.
Alta Productividad
Cuidadí­n con este aspecto, existen plataformas tecnológicas que están directamente orientadas a la productividad, si este es uno de nuestro requerimientos principales, adelante con ellas.
Tamaño del Proyecto
No es lo mismo un proyecto de dos meses que uno de seis que uno de un año. Y aquí­ no juega sólo lo que tienes pensado hacer ahora, si no la previsión de crecimiento que crees que vas a tener. No es lo mismo estar convencido que vas a desarrollar un componente web que saber que si la cosa va bien vas a tener que empezar a agregar más módulos a la aplicación.
Formación de tus Recursos
Tal vez en tu equipo de trabajo cuentes con personas que tengan experiencia en una plataforma en concreto. Y aprovecho aquí­ para hacer un inciso: el llevar a cabo una formación de dos, tres semanas en una determinada tecnologí­a para luego acometer un proyecto nada más salir no suele traer buenos resultados (retrasos sobre todo) si no acompañas el grupo de trabajo de algíºn recurso que ya tenga experiencia contrastada en ella.
IDE
.NET tiene Visual Studio, Java tiene Eclipse/NetBeans/Java Studio Creator, PHP tiene Zend Studio, Ruby on Rails tiene Aptana…
Seguridad
¿Te preocupa especialmente la seguridad? ¿La información que provee o captura tu web debe tratarse de forma especialmente segura?
Servicios Web, Ajax…
Existe plataformas que aportan más facilidades que otras para crear Servicios Web o trabajar con Ajax. Y vuelvo a aprovechar la ocasión para hacer otro inciso, cuidadí­n con el uso de Ajax, si queréis que vuestra aplicación web funcione como una aplicación de escritorio, no construyáis una aplicación web, construid una de escritorio. Ajax es una herramienta que nos puede ayudar puntualmente para resolver ciertos problemas, pero no se debe abusar, o se volverá contra vosotros.
Integración con el Sistema Gestor de Bases de Datos
Me explico, .NET está especialmente diseñado preparado para trabajar contra SQL Server, Java contra Oracle, PHP contra MySQL… Combinaciones del tipo .NET + Oracle o PHP + SQL Server pueden traeros problemas.
Comunidad, Soporte
Algunas plataformas tienen una empresa detrás que te puede dar soporte ante los problemas que puedan surgir, o una comunidad de usuarios más o menos amplia que te ayude a resolver las dudas.

Y aquí­ me paro, creo que por ahora ya quedan presentes algunos de los factores para echarles un ojo y darles alguna vuelta… pero antes de terminar quisiera comentar cuatro cosas sueltas más a la hora de encarar el desarrollo de una aplicación web.
1) Existen tecnologí­as satélite a las diversas plataformas del mercado y que son comunes a todas ellas. Estas tecnologí­as conviene conocerlas, saber cual es su función, para qué las podemos usar y para qué no. Me estoy refiriendo a Javascript, CSS, HTML, XHTML, XML, XSL, JQuery, JSON, AJAX, SOAP, WSDL… No me refiero a empollármelas todas, pero sí­ saber para qué son cada una de ellas y dónde les puedo sacar partido.
2) Desarrollar una aplicación de escritorio no es lo mismo que desarrollar una aplicación web. La gente que trabaja en web tiene muy fácil pasar a trabajar con aplicaciones de escritorio, cuando la historia es alrevés la penalización es más grande (pero no imposible claro está, estoy hablando de que se necesita algo más de tiempo para ubicarse).
3) Intentad definir un íºnico navegador y una versión del mismo para vuestro proyecto, o seguramente os volváis locos. Si trabajáis con una intranet o algo más cerrado os será viable definirlo así­, si tenéis como requisito que vuestra web funcione con varios navegadores del mercado, almenos intentad marcar la versión de cada uno. No es lo mismo desarrollar para un Internet Explorer 6 que para un 7.
Fuf, cada vez me enrollo más en los post, voy a tener que empezar a recortar 🙂
Saludos.
Miguel.

Buenas Prácticas: Legibilidad y Mantenibilidad del Código

Y es que muchas veces nos olvidamos de que nuestro código va a tener que ser interpretado, leí­do y mantenido por otras personas, o incluso por nosotros mismos en un futuro.
Mantener estructuras similares a la hora de programar, un estilo de programación, un orden determinado y un código claro, harán que la mantenibilidad de nuestras aplicaciones se dispare. Este aspecto se ve aíºn más potenciado en grupos de trabajo de alta volatilidad, donde la estabilidad del níºmero de profesionales que forman el grupo es alta. Me refiero tanto a la baja de miembros del equipo como a la rápida incorporación de nuevos profesionales para aumentar el tamaño del grupo.
Quisiera dejar patente la diferencia de legibilidad y mantenibilidad entre dos fragmentos de código que llevan a cabo exactamente la misma funcionalidad
Ejemplo de baja legibilidad y mantenibilidad (código C#):
public bool NumPuerMayorQue(int t)
{
    int n = 0;
    coche[] lista = DameListaCoches();
    for(int i=0;i<lista.lenght;i++)
        n = n + (coche)lista[i].NumPuertas;
    if (n>t)
        return true;
    else
        return false;
}
Ejemplo de mejor legibilidad y mantenibilidad
/// <summary>
/// Añade un nuevo parámetro a la lista
/// </summary>
/// <param name=”numPuertas”>Níºmero de puertas a comparar</param>
/// <param name=”lista”>Lista genérica de coches sobre la que hacer el cálculo</param>
/// <returns>Retorna verdadero en el caso de que la variable numPuertas pasada por parámetro sea mayor que el resultado de sumar todas las puertas de los coches pasados por parámetro en la variable lista. Retorna falso en caso contrario, es decir cuando es menor o igual.</returns>
public bool IsNumeroPuertasMayorQue(int numPuertas, List<coche> lista)
{
    int total = 0;
    foreach (coche unCoche in lista)
    {
        total += unCoche.NumPuertas;
    }
    return (total > numPuertas);
}
Aspectos que hacen notar la mejora de la mantenibilidad y la legibilidad de ambas funciones
1) Se dispone de un comentario sobre qué labor va a realizar la función, qué papel juega cada uno de sus parámetros y qué valores se esperan retornar y en qué condiciones.
2) El nombre de la función, al marcar el prefijo “Is” ya nos da la pista de que va a devolvernos un booleano. IsNumeroPuertasMayorQue da más pistas al desarrollador que NumPuerMayorQue.
3) La lista de coches es pasada por parámetro a la función, siendo además una lista genérica. Sabemos exactamente de dónde nos llega la lista.
4) Uso de foreach en lugar de for. Usando foreach aumentamos la legibilidad y la elegancia de nuestro código.
5) Uso de lista genérica en lugar de arrays. Nos estamos evitando hacer el cast “(coche)lista[i]”, que además no nos asegura que lo que realmente tenga la lista sean objetos de tipo coche, puede darse un error de casting.
6) El nombre de las variables utilizadas es mucho más descriptivo.
7) Llaves en sentencias de una sóla lí­nea. Realmente funcionan igual, pero si a las sentencias for, foreach, if y else le añadimos llaves de apertura y cierre aunque incluyan una íºnica sentencia, lo leeremos mejor.
8) Creo que queda bastante claro que se lee mejor “return (total > numPuertas)”
9) Una linea en blanco entre bloques. ¿La vista lo agradece, no?
Saludos.
Miguel.

ClasesAvanzadas v1.0.0.0

Fruto del anterior post sobre buenas prácticas, se me ha ocurrido la idea de ir añadiendo las clases que os vaya comentando en una dll, para que así­ podáis probar su funcionamiento y aprovecharlas para vuestros desarrollos. La dll está realizada en C# y podréis referenciarlas en vuestros proyectos con la plataforma .NET
En la primera release incluyo la clase Redireccion, que os ayudará a hacer más legibles y mantenibles vuestros response.redirect.
ClasesAvanzadas.dll v1.0.0.0
Se aceptan comentarios, mejoras, errores…
Saludos.
Miguel

Buenas Prácticas: Encapsular Construcciones Complejas

Supongo que estaréis acostumbrados a ver cosas como estas (código C#)
Response.Redirect(“~/home/pepito.aspx?idarticulo=” + idarticulo.toString() + “&idusuario=” + idusuario.toString() + “&idcategoria=” + idcategoria.toString() + “&activo=” + activo);
En el caso del ejemplo tenemos la instrucción response.redirect, la cual muchos de vosotros conoceréis, y que se encarga de redireccionar a nuestro navegador a la url que se le pasa por parámetro. Muchas veces vamos a necesitar pasar valores en la URL para que sean recogidas en la página de destino, y “no nos queda más remedio” que hacerlo de esta manera.
La verdad es que para redirecciones con urls sencillas aíºn es tratable, pero como tengamos que empezar a concatenar parámetros y más parámetros, te puedes volver loco. Por ello, una buena práctica resulta el encapsular todos estos oomportamientos para ayudar en la lectura del código y el posterior mantenimiento de la aplicación.
Os dejo aquí­ el comportamiento de hipotética clase que encapsula esta buena práctica, a ver si qué os parece (código C#)
Redireccion miURL = new Redireccion(“~/home/pepito.aspx”);
miURL.AddParameter(“idarticulo”, idarticulo);
miURL.AddParameter(“idusuario”, idusuario);
miURL.AddParameter(“idcategoria”, idcategoria);
miURL.AddParameter(“activo”, activo);
miURL.Ir();
¿Cómo lo leéis mejor? ¿Os hacéis una idea de lo que hace por dentro la clase, no?
AddParameter es un método sobrecargado donde el primer parámetro es el nombre y el segundo el valor. Podemos pasarle como valor diferentes tipos de datos, ya que está sobrecargado con el tratamiento para cada uno de ellos.
El constructor acepta un parámetro de entrada que es la base de la url a la que vamos a llamar, aunque podrí­amos instanciar la clase sin pasarle ningíºn parámetro, y luego usar la propiedad miURL.URLBase para definirla.
Por supuesto, y siguiendo las buenas prácticas, la clase Redirección deberí­a encapsular también sus excepciones propias que lanzarí­a en los casos necesarios y que podrí­an capturarse desde fuera. Por ejemplo, ¿y si instanciamos la clase sin pasarle la URL base y tampoco la añadimos usando la propiedad? Al lanzar el método Ir() deberí­a saltar una “NoHayURLBaseDefinidaException”, ¿no creéis?
Otro consejo para rematar, serí­a sobreescribir el método toString() de la clase, para que devolviera la URL generada hasta el momento, y así­ poder hacer cosas del tipo:
MostrarMensaje(“Esta es la URL Generada: “+  miURL);
Esta forma de encapsular las construcciones complejas es aplicable a otros campos, como por ejemplo para generar una secuencia SQL. Otro dí­a os dejo un ejemplo.
Saludos.
Miguel.

Desarrollador 5 Estrellas

No sé si conocéis el sistema de Formación/Certificación de Microsoft para Visual Studio 2005, llamado “Desarrollador 5 Estrellas”.
Se trata de una serie de cursos y exámenes que van desde un nivel de dificultad menor (1 estrella) hasta la máxima (5 estrellas). Por cada una de las estrellas existe un temario, con su correspondiente documentación, y unos exámenes tipo test. A medida que te vas viendo preparado tras leer la documentación puedes ir haciendo los test. Por cada test aprobado se abre la posibilidad de hacer los test de las estrellas superiores.
La verdad es que está muy muy bien, ya no sólo por “jugar” un poco y entretenerte si no que sirve bastante para aprender y probarte un poco. Si además añadimos que la documentación que ofrece por cada parte del temario está bastante bien, pues la suma de todo es que como poco váis a salir aprendiendo un montón.
Os dejo la URL
https://www.mslatam.com/latam/msdn/comunidad/dce2005/directory.aspx
Saludos.
Miguel.

Formación .NET

Y siguiendo la formación… ahora le toca el turno a .NET.
Como no, recomiendo otro nuevo libro, que la verdad es que por lo que lo he podido ojear tiene buena pinta. El tí­tulo ya dice bastante de cual es su objetivo “From Novice to Professional”.
Es algo que voy a poder contrastar los próximos dí­as, ya que aunque yo ya llevo casi tres años detrás de .NET, alguno de mis compañeros van a dar sus primeras lecciones, por lo que vamos a poder comprobar de primera mano el valor de la información que aporta el libro (y la que puedo ir dándoles).
Como siempre, os dejo aquí­ las referencias:
Tí­tulo: Beginning ASP.NET 2.0 in VB 2005: From Novice to Professional
Autor: Matthew MacDonald 
Editorial: Apress
ISBN: 1590596218
Idioma: Inglés

Saludos!

Active Record

Buceando un poco por Ruby on Rails y tratando ya de tíº a tíº Active Record, me animo ya un poco a mostraros algíºn link donde conocer un poco su funcionamiento.
Resumiendo un poco, Active Record es el patrón de diseño que utiliza RoR para el acceso a datos. La idea es algo que ya muchos conoceréis, aunque no tal vez como Active Record, y que es una forma de acceder a datos abstrayéndonos de SQL y enfocando el esfuerzo en los objetos que nos permiten acceder a cada una de las tablas del modelo de negocio con las que trabajamos.
De lo mejor que he podido ver en el uso de Active Record bajo RoR, es que a partir de los modelos que se van generando a través de los scripts ruby, y la edición de los mismos, son los que van generando las tablas directamente en la base de datos. Además, cada uno de los cambios en el modelo que se van haciendo desde ruby, van generando migraciones de BBDD las cuales puedes en cualquier momento volver atrás, manteniendo la consistencia de la base de datos hacia delante y hacia atrás. La verdad es que es una maravilla de cara a la productividad y a la limpieza del código.
Link en wikipedia https://es.wikipedia.org/wiki/ActiveRecord
Active Record para RoR: https://wiki.rubyonrails.org/rails/pages/ActiveRecord
Proyecto de Active Record para .NET: https://www.castleproject.org/activerecord/index.html
Un saludo!
Miguel.