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.

Ruby On Rails

íšltima adquisición a la biblioteca.
Tí­tulo: Ruby On Rails
Autores: Bruce A. Tate y Curt Hibbs
Editorial: Anaya Multimedia (O’Reilly)
ISBN: 978-84-415-2182-7
Idioma: Castellano
Estos 15 dí­as de vacaciones estoy decidido a, por fin, tener un poco de tiempo para empaparme de Ruby On Rails. La verdad es que ya habí­a leido algo anteriormente, pero estos dí­as que he tenido algo más de tiempo la verdad es que lo que he podido ir viendo con algo más de profundidad me ha llamado bastante la atención, así­ que me fui a la Librerí­a General aquí­ en Zaragoza en bíºsca de algo más profundo. Y hubo suerte!
La verdad es que me ha llamado tanto la atención que me da que el gestor de curriculums en lugar de estar hecho con PHP5 + Zend Framework voy a probar con Ruby On Rails. Me apetece bastante más, sobre todo estos dí­as al tener más tiempo y la cabeza mucho más despejada.
Saludos!

Resolución de Errores de Software.

De todos es sabido que los errores en el software son el pan nuestro de cada dí­a. Alguna de las aplicaciones con las que nos toca trabajar dan más problemas que otras, y lo más normal es que si una aplicación se mantiene viva, con constantes actualizaciones y mejoras, los problemas vayan surgiendo a medida que se añaden nuevas funcionalidades. Por no hablar por supuesto de nuevas aplicaciones, recien salidas del horno, en las que tras una arquitectura moderna y robusta, puede esconderse una falta de testeo de algunos módulos o funcionalidades, o simplemente algunos descuidos de programación que aíºn no ha degenerado en error ya que para explotar necesitan verse inmersas bajo una serie de condicionantes que en entornos de desarrollo es difí­cil simular.
Y estoy hablando de errores, de errores de programación, tí­picos mensajes de alerta, con nuesto querido sí­mbolo de admiración, o su triangulito… no de errores provenientes de una mala toma de requerimientos (modulos que no fallan pero no hacen lo que se supone que tení­an que hacer). Petadas, reventadas, bugs… ya sabéis de lo que hablo.
Sobre prevención de errores hablaremos otro dí­a, pero… ¿cómo resolvemos los errores de software una vez se han producido?
Si tenemos suerte y nuestro Proyecto cuenta con un Plan de Riesgos en el cual se ha contemplado el riesgo de errores en el software y se ha documentado cuales son los pasos que debemos seguir en caso de que se produzca un error… tendremos bastante ganado. Vamos a suponer que no es así­, para hacer el “más difí­cil todaví­a”.
La posibilidad de resolver un error comienza cuando este se produce (obvio), lo que no es tan obvio es que debemos disponer de medios para detectar el error lo antes posible, cosa de la que a veces nos olvidamos. “Bueno, si falla ya llamarán”. “No ha llamado nadie en toda la mañana, eso es que va bien”. ¿Por qué debemos esperar a la llamada de un usuario para ponernos en marcha? ¿No serí­a mucho mejor que una vez se ha producido un error, la propia aplicación sea capaz de enviarnos una alarma al equipo de trabajo, y así­ poder ponernos a investigar prácticamente en el acto? Que bonito serí­a que antes de que llamara el usuario llamarle tíº. Hola buenas tardes señor Fulanito, hemos observado que ha surgido un error en la Aplicación durante el proceso de blablabla, le informamos que tenemos el error controlado, que no ha afectado a la transacción que estaba llevando a cabo, y que tenemos ya a una persona resolviendo la incidencia. O… que te llamara el usuario… Ah si, buenas tardes sr Menganito, somos conocedores del error que se le ha producido en la aplicación, se ha realizado un análisis del mismo, y visto que su nivel de importancia es medio, y no produce ningíºn bloqueo en la aplicación, hemos postpuesto la publicación del parche a la primera hora de mañana, para así­ juntarlo con otras mejoras que tení­amos pendientes.
Qué diferencia eh. Y no es tan difí­cil conseguir que una aplicación mande un SMS o un E-Mail cuando se ha producido una excepción en la aplicación.
Y para finalizar unas cuantas frases.
“Los errores de software desprestigian a la empresa, desprestigian al producto, desprestigian al grupo de trabajo y desprestigian al programador. Además, cabrean.”
“La confianza del usuario en un producto es inversamente proporcional al níºmero de errores generados por la aplicación, multiplicado por la importancia de los mismos (y añadirí­a también por aquí­ algo sobre la media de la distancia de tiempo entre errores)”.
“Esta claro que no se puede tratar igual la gestión de errores de sistemas crí­ticos como el de una central nuclear o un cohete espacial, pero eso no quiere decir que nos tengamos que olvidar de la gestión de errores de un simple editor de texto. Siempre que lo queramos vender, claro.”
Seguimos en la siguiente parte.
Saludos.
Miguel.

Arquitectura Orientada a Servicios

Arquitectura Orientada a Servicios, o lo que es lo mismo Service Oriented Architecture (SOA).
Como siempre, tiro de Wikipedia para mostraros la definición “oficial” https://es.wikipedia.org/wiki/Arquitectura_orientada_a_servicios
 ¿Aplicaciones? Puf.
Un ejemplo simple de la potencia que desprende esta arquitectura. Imaginaros una aplicación encargada de capturar las tomas de los contadores de agua de una comunidad. La aplicación consta de dos partes, una web, que emplean en una oficina central, y otra en una PDA, que utiliza el técnico que realiza la toma. En la aplicación web se encargan de hacer estadí­sticas, realizar los cobros… la aplicación del técnico se encarga de mostrarle las direcciones de las comunidades de vecinos a las que debe acudir… seleccionar el abonado y asignarle la toma del contador. Ambas aplicaciones tienen una capa de presentación bastante distina, una es web, y otra es una aplicación de escritorio para pda. Pero ambas necesitan en un momento dado obtener los datos de un abonado en concreto. ¿Realizamos la misma consulta para ambas aplicaciones? No, llamamos al mismo servicio web, que nos devolverá los mismos datos, y ya será la propia capa de presentación de cada aplicación la que se encargar de mostrarlo de la manera que deba.
Añadidle a esto la transparencia que supone, las aplicaciones no tienen ni idea de cómo va el modelo y el controlador, sólo tienen la vista, les da igual cómo está programado, la vista recibe XML y punto.
Saludos.
Miguel.

Benditos TableAdapter

Recuerdo la primera vez (y no tan primera), en la que empecé a trabajar con aplicaciones cliente-servidor, donde el cliente realizaba consultas a la base de datos. En concreto fue una aplicación en un entorno WAMP (Windows-Apache-MySQL-PHP). En aquel momento el problema de realizar consultas se realizaba de manera algo rudimentaria, vamos, la select a piñón en el código, mezclado además entre el propio diseño de la página, y poquito más. La cosa fue mejorando cuando a partir de alguna pequeña técnica y concatenando strings la cosa tomaba mejor forma. Eso sí­, el gran salto vino cuando conocí­ cómo resolver el problema a través de clases de manejo de SQL, las cuales te ayudaban a realizar selects, updates, inserts y deletes, abstrayéndote un poco de lo que es el SQL en sí­. Es más, realmente podí­as hacer una consulta en una base de datos sin tener ni idea de qué era el SQL.
A medida que pasó el tiempo, y con algo más de experiencia, apareció la necesidad clara de relacionar las interacciones contra la base de datos directamente con cada uno de los objetos del modelo de negocio. Es decir, ya no sólo crear las consultas ayudado por una jerarquí­a de objetos, si no que dichas consultas tuvieran sólo sentido embebidas en las clases que te ayudaban a gestionar el negocio. Ejemplo simple: cuando tengo que realizar una select que me retorna todos los usuarios de mi aplicación, voy a utilizar métodos de mi propia clase de Usuarios que son los que van a tener incorporados por debajo las clases de interacción con la base de datos.
Normalmente se puede hacer una relación 1 a 1 entre las tablas de base de datos maestras de una aplicación y las clases (hablando en términos de programación orientada a objetos). Qué bonito serí­a, pensaba yo, que cada vez que creo una tabla en mi base de datos, inmediatamente tuviera un objeto que me ayudara a manejarla. Poder acceder directamente a los campos, conocer su tamaño, su tipo, poder añadir métodos para realizar inserts, updates, selects… Es más, era algo que preparaba manualmente. Creaba la tabla, luego un objeto para manejarla, donde cada campo de la tabla era una propiedad de la clase, creaba métodos para realizar inserts, selects… Vamos, para mi una maravilla, era algo laborioso, pero a mi parecer bastante elegante.
Qué bonito, seguí­a pensando yo, que llegue un momento que este se pudiera crear automáticamente. Y… entonces salió Visual Studio 2005 y los TableAdapter. Madre mia, alguien habí­a escuchado mis plegarias y habí­a hecho exactamente lo que necesitaba. La verdad es que hací­a ya tiempo que conocí­a la existencia de los TableAdapter, pero hasta hace poco no habí­a tenido la ocasión de trabajar directamente con ellos.
Soy totalmente conocedor de que aíºn me queda bastante tiempo para dominarlos, pero por lo que conozco ahora, realmente me parecen una auténtica maravilla. Para quien desee conocerlos, dejo un link, https://msdn2.microsoft.com/es-es/library/bz9tthwx(VS.80).aspx
Saludos a todos!

A vueltas con las WCL (Windows Control Library) y los Controles de Usuario .NET

Hola a todos,
Qué bonito serí­a poder desarrollar en web con la misma facilidad que se hace con una aplicación de escritorio, ¿verdad? Pues si es ese el problema que os desespera, tal vez sean las WCL la solución a vuestro problema. Y digo tal vez porque el marco donde puede ser (a mi parecer) viable su uso, es bastante reducido, aunque en caso de que tus necesidades se ajusten a sus requerimientos y restricciones, sea la solución a parte de tus dolores de cabeza.
Voy a ser algo Práctico, y en lugar de ponerme a explicar lo que es una WCL, voy a tirar de metodologí­a, en concreto con el término reusabilidad, y os voy a dejar un link con una explicación bastante buena al respecto… https://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art94.asp
 Tal vez os suena la cosa un poco a ActiveX, y hablando de ActiveX puede que os venga a la cabeza “problemas de seguridad”. Las WCL usadas como controles embebidos en el navegador parece que quieren dejar de lado ese problema y me parece a mi que Microsoft ha tirado de forma bastante clara en ese sentido. Basta que abramos el Visual Studio 2005 e intentemos hacer un ActiveX en VB.NET o C#, para comprobar que es imposible. O lo hacemos en C++ o nada de nada. O eso, o tiramos de WCL.
En cuanto a seguridad, efectivamente, se ha mejorado. Para poder ejecutar una WCL embebida en el navegador vamos a necesitar ajustar la configuración de nuestro .NET Framework para permitir ejecutar aplicaciones que provengan de una determinada dirección web. Estoy puede resultar hasta un engorro, pero es la parte que nos queda poner a nosotros para que todo esto funcione.
¿Y la viabilidad? Pues teniendo en cuenta las restricciones, juzguen ustedes mismos. Para poder ejecutar una WCL embebida en el navegador vamos a necesitar primeramente que el navegador sea Internet Explorer, y, además, por lo que parece deberá ser servida desde el servidor de aplicaciones de Microsoft, Internet Information Server (almenos por ahora no he podido demostrar lo contrario). Por supuesto, deberemos tener instalado el .NET Framework con el que se haya desarrollado la WCL instalado en nuestra máquina. Vamos, todo Microsoft. ¿No supone todo esto un problema para vosotros? Entonces, tal vez sí­ que sea esta la solución para vuestro problema 🙂
 ¡Ventajas! Una vez superadas las barreras de entrada, tenemos bastantes. Una de las que más me llama la atención que es la WCL que generemos podrá ser llamada desde una aplicación web, pero al mismo tiempo ser incluida en una aplicación de escritorio. Basta añadir la referencia a la dll que se genera en el proyecto y… voila. Por supuesto tenemos la posibilidad de utilizar todos los controles windows de una aplicación de escritorio, y que desde una aplicación web se nos hace realmente complicado o imposible ejecutarlos en la máquina cliente, por ejemplo: aplicaciones multi-hilos, acceso al sistema de archivos, recursos compartidos… ListViews, DataGrids, ImageList, Meníºs… Todo lo que podemos utilizar en una aplicación de escritorio.
¿Tiene sentido crear una aplicación web completa con esta solución? Tal vez no, pero puede ayudarnos a solventar problemas puntuales, de forma algo más cómoda, rápida y elegante. Por ejemplo, poder seleccionar fácilmente imágenes a transferir del equipo local para luego enviarlas al servidor remoto, controlar un escáner, una impresora,  tratar gráficos con GDI o imágenes en general.
 Con un poco de imaginación y algo de práctica… se pueden conseguir cosas bastante interesantes 🙂
Saludos!