January 2009

Atributos en .NET

.NET incorpora el concepto de Atributo qué, junto con lo mecanismos de .NET Reflection como iremos viendo en esta serie de artículos nos va a permitir añadir una enorme flexibilidad a nuestros programas.

Los atributos nos permiten la definición de metadatos asociados al código y su posterior lectura y uso para dar forma a nuestros programas. En la siguiente serie de artículos vamos a ver como podemos crearlos y utilizarlos así como los patrones de diseño que podemos utilizar con ellos.

El primer artículo va a consistir en una introducción a los atributos y a la forma de crearlos y declararlos.

En el segundo artículo veremos como leer dichos atributos usando .NET reflection y como obtener la informacion relevante de ellos, adaptando el comportamiento de nuestro código a lo que esté definido.

En un tercer artículo veremos en detalle algunos de los atributos que proporciona el propio framework de .NET, como funcionan y para que podemos utilizarlos.

Por último daremos una introducción a la programación orientada a aspectos y su implementación mediante .NET así como a algunos conceptos de uso de atributos algo más avanzados.

Tutorial de SQL. SELECT Parte II

Introducción

En el artículo anterior vimos el uso más básico de la clausula SELECT de SQL, sin embargo apenas arañamos la superficie en cuanto a la cantidad de tipos de selecciones que podemos hacer.

En este segundo artículo vamos a explorar las posibilidades de los comandos de conjunto que nos permiten realizar operaciones sobre las filas que devolvemos (como devolver una suma, o el número de filas) así como el uso de la orden GROUP BY que está íntimamente relacionado con lo anterior. Por otro lado exploraremos las intersecciones que se pueden realizar entre consultas (JOIN).

Funcions de conjunto y Group By

Las funciones de conjunto (aggregate functions en inglés) son una serie de funciones aplicables a cada columna devuelta por un SELECT que nos permiten realizar determinadas acciones sobre ellas. Ejemplo de dichas funciones son obtener la media de una columna, obtener el número de columnas devueltas u obtener el valor máximo de entre los resultados de una columna.

La sintaxis genérica podríamos definirla así

SELECT func1(col1), func2(col2), col3 FROM Tabla WHERE Condicion GROUP BY col3

Como vemos el uso de las funciones de conjunto va asociado al uso de la palabra GROUP BY. Más adelante veremos algunos usos de esta palabra reservada, de momento vamos a ver algunos ejemplos:

  • Count: Probablemente la función de agrupación más usada, devuelve el número de ocurrencias de la columna en cuestión.

SELECT Count(*) FROM Personas;

Nos devolverá el número de filas que hay en la tabla Personas, es completamente equivalente a, por ejemplo

Patrones de diseño. Introducción

¿Qué es un patrón de software?

En software un patrón de diseño se refiere a una determinada forma de crear software, una forma de fabricarlo, por decirlo de alguna forma para crearlo de forma correcta.

En determinados marcos de trabajo, cuando nos enfrentamos a determinados problemas en el diseño de software hay formas determinadas de enfocalos que permiten adaptar mejor los posibles cambios de dichos problemas y las distintas evoluciones que pueda sufrir el software en un futuro.

Un buen dominio de los patrones más comunes nos puede servir para no tener que reinventar la rueda a cada paso que damos sino que podemos hacer uso de lo que otros pensaron por nosotros (y que descubriremos en multiples situaciones).

Patrones de diseño. Strategy

Introducción

El patrón strategy (estrategia) esta orientado a resolver situaciones en las que nos encontramos con un problema base pero existen diversas estrategias para abordar el problema. En este sentido nuestro problema define un interface que será (o podrá ser) implementado de diversas formas.

Problema

El patrón Strategy aborda problemas que pueden (o se prevee que puedan) ser implementados o afrontados de distintas formas y cuyo interfaz esta bien definido y es común para dichas formas, pudiendo ser cualquiera de ellas valida o más desable en determinadas situaciones y permitiendo el cambio entre las distintas estrategias en tiempo de ejecución.

Estructura

main.php?g2_view=core.DownloadItem&g2_itemId=825&g2_serialNumber=1

Check in early, check in offen

Acabo de leer el artículo Check in Early, Check in offen de Jeff Atwood acerca de la metodología de uso del control de versiones para el desarrollo de proyectos.

Aunque coincido con los artículos de Jeff en muchas ocasiones, esta es una de las situaciones en las que no lo hago.

En primer lugar, como por otro lado suele pasar con este tipo de artículos, las reflexiones que hace son demasiado genéricas y sobre caso demasiado simples como para poder extraer verdaderas conclusiones sobre ellos.

Hacer check in pronto y a menudo. Suena bonito, parece un concepto adecuado pero hay muchas cosas que quedan fuera del análisis, cosas que en un proyecto pequeño con dos o tres desarrolladores no tienen importancia pero que en grandes proyectos pueden dar verdaderos dolores de cabeza.

Uno de los ejemplos que cita es empezar con un código pequeño, que no haga nada y que tenga pocos, por tanto, pocos bug... de esta forma, según razona, podemos probarlo y subirlo al control de versiones. Entonces desarrollamos una nueva funcionalidad, la probamos y la subimos al control de versiones. Todo claro y sencillo...

Sistema de plugins con C#. Parte II. El código explicado

Antes de empezar

Como indiqué en la parte final del artículo anterior este artículo se ha retrasado tanto que he decidido sacar el código antes de estar acabado. Pese a que la parte fundamental del código es correcta, sobre todo a los efectos de ilustrar este artículo, no debe considerarse en producción y no recomiendo utilizarla para su uso en ninguna aplicación "real", al menos hasta que publique la versión completa.

La web del proyecto y su licencia

El código y otra información adicional está disponible en la página del proyecto Monet Plugins Library y tenéis disponible la última versión del código en el control de versiones de subversion http://svn.thealphasite.org/Monet.

Todo el proyecto responde a la licencia LGPL, lo cual implica, a grandes rasgos que el proyecto es esencialmente GPL (con todas las obligaciones que ello conlleva, como distribuir las modificaciones echas al código y mantener la misma licencia) pero permitiendo que el framework sea utilizado dese una aplicación o librería que no sea GPL. En general esta es una de las licencias que más "libre" me parece. Básicamente, si quieres modificarla y mejorarla tienes que "devolver" lo que has hecho y por tanto la librería va mejorando constantemente, pero si simplemente quieres usarla desde algún otro programa, entonces no encuentras restricciones.

Test Driven Development (Desarrollo dirigido por las pruebas)

Ultimamente, aquí y allá estoy oyendo hablar del llamado Test Driven Development o Desarrollo guiado por las pruebas como nueva metodología de desarrollo.

Dejadme que os explique un poco como funciona el asunto. La metodología se basa en que el desarrollo de los test guie el desarrollo de la aplicación, de esta forma lo primero que hacemos es planear que necesita hacer la aplicación y en función de ello desarrollamos test para cada una de las funciones, de esta forma disponemos de una prueba para cada función (no os entusiasmeis demasiado con esto ...)

El siguiente paso evidentemente es desarrollar la funcionalidad que consigue pasar ese test, y por tanto, funcionalidad hecha y medianamente probada... perfecto.

La descripción de la metodología tiene más pasos y más guías para el desarrollo y como realizar cada paso. La página de la wikipedia tiene más información para los interesados (que espero que después de leer este artículo sean pocos).

SQL Injection explicado

Introducción

La técnica de ataque de SQL Injectión (Inyección de SQL) explota una vulnerabilidad de la capa de acceso a datos de la aplicación. Es genérica a cualquier aplicación, no solo, como mucha gente cree, a aplicaciones web aunque debido al mayor acceso a través de internet así como al "descuido" de los desarrolladores web en muchas ocasiones a la hora de tratar los parametros GET ha hecho que este tipo de ataque se popularice en la web.

Anatomía del ataque

Un ataque basado en inyección de sql responde a una estructura de código en la que vamos a realizar una consulta o comando sobre una base de datos que contiene algunos parametros que nos suministra el usuario.

El problema se plantea cuando no se comprueba que dichos parametros sean válidos sino que el programador se ha limitado a concatenarlos en las partes correspondientes de la consulta, por ejemplo:

string consulta = "SELECT Count(*) FROM Users WHERE Name='" +
                   txtNombre.Text + "' AND Password = '" + txtPassword.Text + "'";

dicha consulta en principio devuelve el número de usuarios cuyo nombre y password coincide con los suministrados en los campos de texto indicados. El problema asociado a un atáque SQL Injection viene dado, no porque el código sea incorrecto sino porque se asume que los parametros de entrada son correctos, es decir, no se tienen en cuenta todas las posibilidades. Así si suponemos los siguientes valores para los campos

Nace stackframe.net

Después de mucho tiempo (más del que pensaba), y bastante esfuerzo en poner todas las cosas en su sitio al fin ha nacido stackframe.net.

Dentro de las cosas nuevas que tiene está un rediseño de la apariencia (básicamente otro tema distinto con algunas modificaciones :D), la actualización a Drupal 6 y el sistema multilenguaje que me permite publicar en español y en inglés.

Además hay un montón de cosas que han mejorado, como la tabla de contenidos, el sistema de votos y alguna cosilla más.

Están prácticamente todos los contenidos de TheAlphasite disponibles y los pocos que quedan por portar lo estarán en pocos días. Actualmente estoy estableciendo las redirecciones desde los artículos de aquí a los de allí y en pocos días estará completamente operativo.

He estado publicando en The Alphasite durante 2 años, mejor o peor, a gusto de cada cual, y ahora quiero seguir por el mismo camino en un nuevo sitio, pero ampliando los contenidos para abarcar dos idiomas (y creedme, el tiempo que lleva traducirlo todo es enoooorme). Espero que os guste la nueva página y que la disfrutéis y os sirva de ayuda.

No olvidéis actualizar vuestros lectores de feed a las nuevas direcciones:

Stackframe en español: http://feeds.feedburner.com/stackframenet

Stackframe en inglés: http://feeds.feedburner.com/stackframeennet

Sistema de Plugins con C# y .NET

Muchos sistemas de plugins están basados en la implementación de interfaces fijos que amplían la definición de un plugin permitiendo realizar una determinada cantidad de operaciones que en cualquier caso siempre es fija, de forma que, por ejemplo si un plugin proporciona un menu se define el interfaz IPluginMenu, si implementa un toolbar la interfaz IPluginToolbar y así sucesivamente para cada una de las funcionalidades que se pretende que un plugin pueda proporcionar.

El enfoque de Monet está orientado a permitir que cada plugin pueda definir servicios, utilizables por otros plugins, en ba