RSS 2.0 Atom 1.0 CDF  
JASoft.org - February, 2010
El blog de José Manuel Alarcón Aguín. Programación .NET y mucho más...
 

Por si teníamos ya pocas distracciones en este mundillo digital, ahora va Google y nos saca una nueva, y además sin habérselo pedido siquiera: Google Buzz. Se supone que es un mix entre Twitter, Facebook, LinkedIn... y cualquier otra red social que quieras. Te aparece en un lateral de GMail como una carpeta de correo más, pero en realidad es un flujo de información constante de chorradas dichas por cualquiera. Por que esa es otra: es el propio Google el que, según su criterio, te hace "amigo" en Buzz de otra gente, y viceversa. Vale, puedes cambiar tú de amigos si quieres pero ¿quién lo ha hecho?

Hasta hay un chiste con muy mala baba que circula por Internet que dice que Google va a batir todos los records de ingresos en 2010: cobrará 20 dólares a cada usuario de GMail para quitarle Buzz ;-)

A mi me parece una cosa muy poco útil y con Twitter y Facebook ya tengo más que de sobra. Además, esto es como el "double opt-in vs opt-it" en el email: que siempre debería pedirse una doble confirmación para hacer estas cosas y no plantártela por narices. sí, lo sé, te preguntaba si querías activarlo cada vez que entrabas en GMail. Un rollo.

Total, que desactivarlo y deshacerte de él para siempre es muy fácil. Vas a "Ajustes" y dentro de ahí a la pestaña "Buzz":

Una vez ahí puedes escoger simplemente no verlo, o bien pulsar el enlace rojo y desactivarlo para siempre. Al hacerlo te sale esta ventana de advertencia:

No te dejes amilanar por él: no te afectará para nada a tu cuenta de GMail, Google reader o cualquier otro servicio de Google que uses, así que no te cortes y dile que sí ;-)

 

Por: José Manuel Alarcon | Tuesday, February 23, 2010 10:34:18 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Mundo TIC


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

He de confesarlo: me encanta el iPhone de Apple. A la espera del nuevo Windows Phone 7, del que tengo muchas dudas y hasta que lo vea en la mano y sepa que hay muchas y buenas aplicaciones, mi favorito sin duda sigue siendo el iPhone 3Gs. Intenté volver a un HTC Touch hace unos meses cuando me cargué el anterior iPhone y no lo soporté ni un día. Sólo de pensar en volver al stylus me dan escalofríos. Una de las cosas que más me gusta es el navegador Safari que lleva embebido. Ahora empieza a ser algo más normal que los navegadores móviles visualicen las páginas Web como en un navegador de escritorio, pero no era así ni mucho menos hasta que apareció el iPhone 2G (el primero que tuve) hace ya 3 años. Este teléfono de hecho fue el que sirvió de revulsivo para que el mercado de los Smartphone haya explotado, y ahora todos siguen la estela a ver si lo imitan. En eso, he de reconocerlo, Windows Phone 7 (al contrario del 6.5), parece que va a ser innovador escapando de las pantallitas de iconos propias del "ayfon".

El caso es que cada vez más gente navega desde el móvil y además, según Market Share, el informe de diciembre de 2009 de Admob, el iPhone arrasa entre los dispositivos móviles a la hora de navegar por Internet, sobre todo en Europa y Oceanía:

por lo que es importante ser lo más amigable posible con estos chismes. Dado que la página se visualiza perfectamente al tener tanto este aparato como los móviles con Android o -últimamente muchos otros incluyendo Windows Mobile- Opera Mobile, una cosa que podemos hacer es facilitar que los visitantes nos coloquen como favoritos.

Cuando navegas a una página con Safari para iPhone, al pulsar el botón "+" de la parte de abajo te salen estas opciones:

la segunda de ellas te permite añadir la página como un acceso directo desde el "escritorio" del teléfono, como un programa más de los disponibles, lo cual es muy útil si accedes a menudo. Por defecto el aparato hace una captura de pantalla de la página y la usa como icono a la hora de añadirlo:

¿Ves algo en el icono anterior? Yo tampoco. Está bien el intento pero no suele servir de mucho, al menos en los blogs y similares. Tal vez en las páginas corporativas que tengan algo destacado que se vea en la mini-captura.

Lo ideal sería que tuviésemos nosotros control sobre el icono que se utiliza. Para ello hay una forma muy sencilla: crear un gráfico en formato PNG de tamaño 60x60 pixeles, y colocarlo en la raíz de nuestro sitio web con el nombre especial: "apple-touch-icon.png".

Con esto, ahora, a la hora de añadir el acceso directo obtenemos el icono adornado por el iPhone con un bonito efecto de reflejo 3D y también bordes redondeados:

Para que te hagas una idea de la diferencia, el icono original es este:

Y así es como queda una vez colocado en el escritorio del teléfono para un fácil acceso directo (abajo a la derecha):

Mola ¿eh?

Si el gráfico se llama "apple-touch-icon-precomposed.png" en lugar del nombre anterior, el teléfono no le añadirá ninguno de estos efectos dejándolo como está.

Si no puedes copiar el icono en el raiz de tu web o si quieres darle un nombre diferente puedes usar una cabecera META en tu página Web para indicar qué icono quieres usar, así:

<link rel="apple-touch-icon" href="mi_icono.png"/>

De manera similar, si se trata de una aplicación, puedes especificar la imagen que quieres que el iPhone muestre mientras se inicia y se conecta (algo asícomo una Splash Screen para el chisme) usando una cabecera parecida:

<link rel="apple-touch-startup-image" href="splash.png">

La imagen tiene que ser de 320x460 píxeles de tamaño. Si no la especificas usará la captura de pantalla de cómo estaba la última vez que la usaste.

<meta name="apple-mobile-web-app-capable" content="yes" />

Si quieres que además la aplicación se muestre a pantalla completa (sin los elementos propios del navegador) añade esto:

<meta name="apple-mobile-web-app-capable" content="yes" />

Espero que te sea útil si vas a hacer algo para este teléfono.

Por: José Manuel Alarcon | Saturday, February 20, 2010 1:17:17 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Desarrollo Web


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

El próximo miércoles día 24 a las 18:30 de la tarde, estaré en la Universidad Autónoma de Madrid hablando con los estudiantes de informática acerca de muchas cosas interesantes de la vida tecnológica :-)

Esta charla/encuentro coincide con el OMExpo (antiguo Online Marketing España) y con Expo e-learning, por lo que habrá mucha gente por la zona.

Si estás cerca, ¡Apùntate!

Ah!, y por cierto, si vas a estar en OMExpo, pásate por nuestro stand (el 92) y sólo por hacerlo te regalaremos nuestro último libro lleno de consejos prácticos para desarrollar campañas de email marketing exitosas. Toda la info aquí.

Por: José Manuel Alarcon | Wednesday, February 17, 2010 10:37:04 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Eventos


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Hoy en día si no apareces en las primeras posiciones en los resultados de las principales búsquedas relacionadas con tu actividad, es como si no existieras. Si analizas los logs del servidor puedes comprobar que un altísimo porcentaje del tráfico que entra en tu Web es directamente procedente de buscadores. En España, además, el cuasi-monopolio en esto lo tiene Google, por lo que casi se puede afirmar que si no apareces en Google no existes. Hay gente que no se da cuenta del verdadero poder que tienen estas herramientas de búsqueda y lo que podrían hacer si decidieran sesgar un poco sus resultados.

En los últimos años se ha desarrollado ampliamente el concepto y las técnicas de SEO: Search Engine Optimization, u Optimización para Motores de Búsqueda. Existen técnicas SEO lícitas y por lo tanto aprobadas por los buscadores, y también técnicas ilícitas que pueden funcionar una temporada pero que cuand te pille el buscador te penalizará tanto que tu web se verá relegada al olvido. Aparte de estas técnicas más o menos elaboradas, hay muchas otras cuestiones que nuestro código HTML y la estructura de la página pueden cumplir para mejorar la consideración que de la misma tienen Google, Bing, Yahoo! y compañía. Por ello es muy importante que nuestro código HTML generado cumpla con multitud de normas, que no haya enlaces rotos, que tengamos un archivo sitemap.xml, etc... Son multitud de factores los que debemos tener en cuenta, y si aunque seamos expertos SEO puede ser una tarea imposible tener todo controlado.

Para ayudarnos con esto Microsoft ha sacado una excelente herramienta gratuita llamada SEO Toolkit. En este artículo vamos a analizarla y explicar sus funcionalidades para que puedas sacarle partido enseguida y mejores el posicionamiento de tus Webs.

Antes de nada quiero dejar claro que esta herramienta, aún siendo de Microsoft y con una interfaz bastante liosa de poner a andar, funcionará con cualquier web creada con cualquier lenguaje y en cualquier sistema.

Instalación y puesta en marcha

Instalar el SEO Toolkit es un tanto lioso. Para ello debemos descargarnos antes la herramienta Microsoft Web Platform, que nos permite gestionar desde su interfaz infinidad de herramientas de desarrollo Web y proyectos Open Source. Te descargas el ejecutable e instalas el Microsoft Web Platform. Tendrás que bucarlos en tu menú de inicio y lanzarlo. Esta herramienta te presenta listas de herramientas clasificadas en categorías, las cuales puedes elegir e instalar según tus necesidades. En mi opinión, esta herramienta es un tostón y prefiriría una buena Web con las mismas herramientas clasificadas, pudiendo descargar individualmente cada una de ellas según la necesite. Pero Microsoft tendrá sus razones para haberlo hecho así.

En este caso, para localizar el SEO Toolkit en la herramienta y poder instalarlo, tenemos que ir a la pestaña de "Web Platform", sección "Web Server" y elegir su personalización:

Al hacerlo se nos muestra una lista de herramientas entre las que tenemos la que estamos buscando:

OJO: el SEO Toolkit no es una herramienta individual, sino que trabaja desde dentro de la interfaz de gestión de IIS 7.0 o superior, por lo que tendremos que tener instalado este servidor Web en nuestro equipo antes de poder ponerlo en marcha.

En mi opinión esto es una gran lástima pues a Microsoft le hubiera sido incluso más fácil hacer del SEO Toolkit un programa independiente y no hacerlo depender de IIS, teniendo en cuenta además que funciona con cualquier Web remota o local, de IIS, de Apache o cualquier otro servidor, y no sólo con IIS. Pero bueno, dado que es gratuita habrán pensado que así al menos te hacen ver su propio servidor un poco. En cualquier caso todos los males sean esos :-)

Pulsa "instalar" en la ventana de la figura anterior y ¡Listo!. Eso sí, es un poco desconcertante, ya que cuando termina la instalación, no tenemos mensaje de aviso alguno ni tampoco encontraremos un acceso directo a la herramienta en nuestro menú de inicio. Para utilizarla tendremos que abrir la herramienta de gestión de IIS y localizarlo en la página de gestión del servidor o de cualquiera de las Webs que tengamos definidas:


Pulsa para aumentar

Funcionalidad de la herramienta

Cuando hacemos doble-clic sobre el icono se abre la herramienta, que nos brinda tres opciones:

· Análisis de sitios: Permite analizar sitios existentes y generar completísimos informes orientados al SEO, así como lanzar consultas sobre esos resultados, exportarlos, compararlos, etc... Es en lo que nos vamos a centrar en este artículo.

· Sitemaps: ayuda a generar y gestionar archivos Sitemap para nuestra Web, de forma que ayudemos a los buscadores (especialmente Google) a indexarlos adecuadamente.

· Robots: el archivo robots.txt de una web define qué partes de la misma deben a evitar los robots de búsqueda (o arañas) de los buscadores. Esta característica nos ayuda a crear este tipo de archivos.

Análisis de sitios con SEO Toolkit

Si creamos un nuevo análisis nos aparecerá una ventana en la que se nos pide que ajustemos unos parámetros básicos a partir de los cuales el software empezará a actuar:

Lo único que es necedsario introducir es un nombre para el análisis así como la URL de la que queremos partir para comenzar el análisis (en este caso he usado nuestra página de www.campusmvp.com). En los ajustes avanzados podemos decidir el máximod de recursos a descargar, el tamaño máximo a descargar de un determinado archivo (para evitar descargar archivos pesados innecesariamente), si seguimos o no los enlaces que están marcados con el atributo "nofollow", y si debemos hacer caso omiso o no de la etiqueta meta "noindex". Mirecomendación sería marcar estas dos últimas casillas, pues es cómo se comportará la araña de Google. 

La lista desplegable de enlaces externos sirve para decidir qué tipo de URL vamos a considerar como tales, es decir, cuáles están fuera de la web actual y cuáles no.

Es posible establecer usuario y clave para que el sistema funcione con sitios web no públicos, protegidos con credenciales de acceso.

Una vez que pulsamos el botón de "OK" se lanza un proceso que tardará más o menos en función del tamaño de la web analizada y que, a todos los efectos, simula el proceso que llevaría a cabo la araña de un buscador cuando está indexando el sitio web en cuestión. Nuestro particular robot de búsqueda analiza todo lo que va descargando y lo compara contra una base de datos de normas SEO para generar finalmente un informe.

Lo primero que vemos al terminar es el resumen del análisis:

No te agobies si te salen muchas violaciones de buenas prácticas SEO. Es de lo más normal. Es casi imposible que no se te escape algo, y muchas cosas, si bien son recomendables, no son imprescindibles ni mucho menos. Otras sí ;-)

Como vemos en la figura anterior se nos muestra un resumen de todas las buenas prácticas que estamos incumpliendo, y cuántas veces. Si hacemos doble-clic sobre cualquiera de los elementos de esa lista se abre una ventana de detalle, que nos indicará muchísima información sobre cada violación: en qué lugar se produce, por qué es importante, cómo está formado el código, qué podemos hacer para solucionarlo, etc...

Encontrarás la mayoría de las normas de lo más útil, así que repásalas con calma.

En los otros apartados del lateral puededs profundizar en otra información relacionada. El primero, "Violations", tenemos la lista completa de problemas detectados que veíamos de manera resumida en la figura anterior.

El apartado "Content" se nos muestran los contenidos del sitio Web agrupados por tipos de archivo, carpetas, y otros criterios. Nos sirve para darnos cuenta de cómo está organizado el sitio.

El apartado "Performance" se nos muestra una visión del rendimiento de descarga de la Web en el momento en que fue capturada. Así podemos ver los tiempos y tamaños de descarga y nos puede ayudar a indetificar páginas con problemas, o archivos muy pesados que pueden interferir en el buen trabajo de la aplicación o sitio. La herramienta ya nos apunta de entrada los archivos problemáticos or que se descargan lentamente. Podemos ver la información por carpetas, tipos de archivo, páginas demasiado saturadas de elementos.

Finalmente el apartado "Links" es muy interesante porque nada como los enlaces influye más en el posicionamiento de las páginas. Así podemos ver las relaciones existentes entre nuestras páginas, cuáles son las más enlazadas, la profundidad de los enlaces, las redirecciones (las arñas no suelen pasar de la segunda redirección, por lo que tienen especial importancia), lo enlaces rotos (también importantísimos), etc...

Consultas

Todos estos apartados nos ayudarán a solucionar multitud de fallos y a mejorar el código del sitio Web de forma que se posicione mejor ante los ojos de los todo poderosos buscadores. No obstante para empezar a veces puede resultar difícil si tenemos muchas cosas a las que atender. Qué duda cabe que la vista por defecto, la de resumen, nos ayudará mucho, pero si queremos profundizar o si necesitamos localizar recursos concretos las herramientas de consulta integradas en SEO Toolkit nos van a resultar de gran ayuda.

Dentro del menú desplegable de laparte superior tenemos el apartado "Query", que nos permite crear nuevas consultas de los recursos descargados por nuestra araña y también de las reglas que se han transgredido en el sitio. Así, podremos elegir uno entre múltiples campos de filtrado (dependiendo del tipo de consulta que hagamos), el tipo de comparación a realizar, y el parámetroa comparar, combinando varias condiciones simultáneamente:

Por ejemplo, si tenemos un enlace roto y queremos averiguar todas las páginas apuntan a éste, podemos hacer una consulta gráfica como esta:

Es posible agrupar los resultados. Tenemos la posibilidad de exportar los resultados de la consulta o guardarla para su reutilización posterior. Como vemos de lo más útil.

Exportar

Todos los resultados de la actividad de la araña y el correspondiente informe total es posible exportarlo a formato CSV (archivo de texto con valores separados por comas), para abrirlocómodamente en Excel y poder procesar por nosotros mismos los resultados, generar informes para clientes, filtrar con las características de Excel, etc... Algo que personalmente encuentro muy útil.

Comparar

Dado que la herramienta nos dará muchas indicaciones y que seguramente vamos a hacerle caso a muchas de ellas, cambiando la Web, resulta de especial interés la herramienta de comparación que trae:

De esta forma, tras haber aplicado los consejos SEO obtenidos por el análisis anterior, podemos pasar de nuevo la araña sobre la misma web y generar otro nuevo informe. Si los comparamos obtendremos un análisis de las mejoras introducidas que nos servirá para darnos cuenta de la influencia de las medidas introducidas.

En resumen

El SEO Toolkit es una herramienta gratuita de Microsoft que nos ayudará a mejorar mucho la posición de nuestra web en los buscadores, ahorrándonos muchas horas de estudio propias de un SEO. A pesar de su dificultad para ponerla en marcha para los no técnicos (necesitarás IIS 7.0 o superior) merece la pena instalar y pasar su araña a nuestros sitios para que los analice.

Aunque nunca va a sustituir los servicios de un buen SEO y además la posición en los resultados de búsqeuda no dependen únicamente (ni mucho menos) de la calidad de nuestro código sino que es más un factor relacionado con la relevancia de nuestro sitio, desde luego nos ayudará a partir de una buena base, y puede sustituir (y mejorar) a la mayoría de los SEO aficionados que nos vamos a encontrar por ahí: desconfía de las empresas o "expertos" que tanto te optimizan la página para SEO, como te diseñan la Web, te la programan y te dan el hosting si se tercia ;-)

¡Espero que te resulte útil!

Por: José Manuel Alarcon | Sunday, February 14, 2010 7:23:28 PM (Hora estándar romance, UTC+01:00)  #    Comments [1] - Trackback
Tags: Herramientas


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

.NET 4.0 dispone de soporte para tiempo de ejecución de lenguajes dinámicos, el DLR (Dynamic Language Runtime). El propósito del DLR es permitir que los lenguajes de tipo dinámico -como PHP, JavaScript, Ruby, Python, Lisp o Groovy, por citar unos cuantos- puedan ejecutarse en la plataforma y además interactuar con código escrito en un lenguaje .NET -como C# o VB.

El DLR introduce en el framework una serie de clases dinámicas de comportamiento dinámico que ayudan mucho a la hora de interactuar con estos lenguajes o acceder a COM, pero que abren la puerta a crear monstruos de código si son mal utilizados. De hecho gurús de la plataforma como mi buen amigo Octavio Hernández, reniegan de esta característica ;-)

Lo cierto es que en general yo no recomendaría el uso de las clases dinámicas, pero sí que pueden llegar a ser útiles en algunas ocasiones. Por ello en este artículo voy a presentar la más útil y fácil de usar de todas, la clase ExpandoObject.

Añadiendo miembros dinámicamente

Este objeto es, en realidad, una colección genérica bien disfrazada con "azucar sintáctico" de manera que en lugar de andar escribiendo .Add y .Remove con el nombre de los miembros, se pueden escribir directamente en el código y el compilador hace caso omiso de ellos, posponiendo la comprobación de su existencia al tiempo de ejecución. Lo entenderemos mejor con un ejemplo:

//Creo el objeto
dynamic Persona1 = new System.Dynamic.ExpandoObject();
//le añado algunas propiedades
Persona1.Nombre = "JM";
Persona1.Apellidos = "Alarcón aguín";
Persona1.Edad = 37;

Fijémonos en lo que hemos hecho aquí: primero hemos declarado una nueva clase de tipo ExpandoObject, la cual está en el espacio de nombres System.Dynamic. Si hubiésemos escrito simplemente el nombre de la clase VS2010 nos da ya la opción de añadir el "using" correspondiente en la parte de arriba del código:

Hay que fijarse también en una cosa importante: en C# debemos declarar el tipo de la variable que va a contener el objeto como dynamic. Fíjate en que lo lleva delante. Este nuevo tipo de C# se puede considerar que es casi idéntico al tipo Object, pero su principal diferencia es que cuando declaramos una variable con dynamic, el compilador se salta la comprobación estática de tipos durante la compilación. De esta forma el compilador no "rompe" cuando compilamos si intentamos utilizar una propiedad o método de la clase dinámica aunque éstos no existan. En VB no es necesario un tipo especial porque este lenguaje soporta el enlazado de tipos postergado.

Bien, una vez creado el objeto dinámico podemos empezar a añadirle propiedades con sólo escribirlas, como se ve en las líneas anteriores, tras la declaración. Así, al nuevo objeto le añadimos una propiedad Nombre, otra Apellidos y otra Edad simplemente poniendo un punto y escribiéndola. Es decir, como si ya existiera de antemano, cosa que no es así. En la práctica lo que conseguimos es que si la propiedad existe que se asigne, pero si no existe se crea dinnámicamente y se asigna, es decir se van creando propiedades sobre la marcha.

Si ahora escribo:

Console.WriteLine("Persona: {0} {1}, Edad: {2}", Persona1.Nombre, Persona1.Apellidos, Persona1.Edad);

Obtendré por pantalla sin problemas el nombre y apellidos, seguidos de la edad anotadas en este nuevo objeto dinámico.

Los tipos apropiados para las propiedades se infieren del valor que se le pasa al asignarla. Así en el ejemplo, para el nombre y apellidos tendremos tipos string, y un int para le Edad. Además el tipo cambia también dinámicamente. Por ejemplo si asigno el valor 37 a la propiedad Edad su tipo será un Int. Sin embargo si acto seguido le asigno, por ejemplo, 10E10 (un número muy grande), automáticamente la propiedad cambia y ahora es de tipo double. Exactamente igual que pasaría en JavaScript u otro lenguaje dinámico tradicional.

Podemos crear propiedades de objetos dinámicos que a su vez son también objetos dinámicos. Por ejemplo:

Persona1.Domicilio = new ExpandoObject();
Persona1.Domicilio.Ciudad = "Vigo";

De este modo acabo de crear una propiedad Domicilio que es dinámica y le he creado a su vez una propiedad Ciudad. Así puede escribir Persona1.Domicilio.Ciudad para obtener el valor "Vigo".

Estos tipos dinámicos, aunque están soportados por el entorno de Visual Studio 2010, no nos ofrecen (al menos en la Beta2) soporte para Intellisense, en el sentido de que una vez definida la propiedad, esta no aparece en la ayuda contextual cuando volvemos a usar el objeto y ponemos un punto:

Como vemos, nos indica que lo que escribamos a continuación del punto será interpretado en tiempo de ejecución, no al compilar, y por tanto no nos muestra ayuda al respecto.

Con esto es muy facil, por ejemplo, crear un nuevo objeto dinámico dinámicamente (valga la redundancia) a partir de datos contenidos en algún lado. El ejemplo típico es cargar un archivo XML e ir recorriendo sus nodos e ir asignando a su vez propiedades alobjeto dinámico. Así podremos acceder más fácilmente a los datos desde el código pudiendo escribir notaciónn común de objetos (nombres y puntos) para acceder a ellas en lugar de estar escribiendo sintaxisd más complejas para leer valores de nodos o atributos XML. También nos valdría de modo similar para interpretar JSON.

Una aplicación especialmente interesante es a la hora de definir vistas de ASP.NET MVC 2.0 de manera dinámica, como explica Phil Haack en este post (inglés).

Además de propiedades es posible definir también métodos dinámicamente, si bien éstos son de menor utilidad ya que deberán ser estáticos y por lo tanto no pueden acceder al resto de propiedades del objeto.

Por ejemplo:

Persona1.Saludar = new Func<STRING, bool>((sSaludo) =>
{
    Console.WriteLine(sSaludo);
    return true;
});

Con esto creamos un nuevo método Saludar, y podemos escribir: Persona1.Saludar("Hola") para obtener ese mensaje por pantalla en este caso simple. El método se crea con una expresión Lambda por lo que siempre deve devolver algo. En este caso como no nos interesa para nada el valor devuelto he optado por devolver un booleano sin más. Ya digo que no tienen demasiada utilidad.

Si llamamos a la función sin pasarle el número de parámetros apropiado no se nos quejará el compilador y podremos generar el ejecutale. Sin embargo a la hora de ejecutar la aplicación romperá miserablemente:

Enumeración y eliminación de miembros

Hasta ahora hemos visto lo fácil que es crear un miembro, pero claro, nos será útil solamente si sabemos de antemano qué miembros están disponibles. ¿Cómo podemos averiguarlo?. Esto puede ser útil para, en el caso de crearlo a partir de un origen de datos arbitrario, poder enumerarlos y comprobar que existen un mínimo determinado de ellos, o simplemente para poder hacer introspección de los objetos. Siempre podríamos usar reflexión pero sin embargo no habríamos ganado demasiado ¿verdad?.

Fijémonos en la definición de la clase ExpandoObject (en C#):

public sealed class ExpandoObject : IDynamicMetaObjectProvider, 
    IDictionary<string, Object>, 
    ICollection<KeyValuePair<string, Object>>, 
    IEnumerable<KeyValuePair<string, Object>>, 
    IEnumerable, INotifyPropertyChanged

Como vemos implementa una interfaz IDictionary genérica y también una ICollection e IEnumerable. Es decir, en el fondo se trata ni más ni menos de una colección genérica capaz de albergar cualquier cosa. Los miembros que vamos añadiendo se incorporan a una colección interna. Por lo tanto para poder enumerarlos sólo hay que hacer uso del objeto como una colección o un diccionario:

IDictionary<String, Object> miembros = (IDictionary<string, Object>)Persona1;
foreach (System.Collections.Generic.KeyValuePair<String, Object> miembro in miembros)
{
    Console.WriteLine("{0}: {1}", miembro.Key, miembro.Value);
}

O de manera más directa y entendible:

foreach(var miembro in (IDictionary<string, Object>)Persona1)
{
    Console.WriteLine("{0}: {1}", miembro.Key, miembro.Value);
}

Como vemos simplemente hacemos un "cast" a la interfaz IDictionary y a partir de ese momento lo manejamos como cualquier otra colección de objetos cuya clave es de tipo texto. Gracias ello podemos añadir nuevos miembros usando el método Add del diccionario, pero, lo más importante, podemos eliminarlos usando el método Remove, por ejemplo:

((IDictionary)Persona1).Remove("Nombre");

En la que me he cargado la propiedad Nombre.

Detectando cambios en propiedades

Si nos fijamos en la definición de la clase vemos que implementa una interfaz INotifyPropertyChanged. Ésta define un evento llamado PropertyChanged que nos sirve para detectar el momento en que cambia una propiedad o se asigna por primera vez. Así, podemosdefinir una función como esta:

private static void DetectarCambios(object sender, PropertyChangedEventArgs e)
{
    Console.WriteLine("Se ha asignado la propiedad '{0}'", e.PropertyName);
}

y detectar los cambios en miembros simplemente estableciendo esa propiedad de la interfaz, así:

((INotifyPropertyChanged)Persona1).PropertyChanged += new PropertyChangedEventHandler(DetectarCambios);

No acaba de ser del todo útil porque no nos deja averiguar qué valor se ha asignado (aunque es fácil de determinar usando la colección interna como acabamos de ver hace un momento, pero puede ayudarnos en algunos casos. No obstante si queremos crear objetos dinámicos y tener control absoluto sobre cómo se crean sus miembros en lugar de ExpandoObject deberíamos usar la clase DynamicObject.

Colecciones de objetos dinámicos

Para terminar con este interesante tema me gustaría comentar cómo se crean colecciones de objetos dinámicos. Consideremos el siguiente código:

dynamic vecinitos = new List<dynamic>();

vecinitos.Add(new ExpandoObject());
vecinitos[0].Nombre = "Homer";
vecinitos[0].Apellidos = "Simpson";
vecinitos[0].Ropa = "Camisa blanca, pantalones azules";

//No son objetos iguales
vecinitos.Add(new ExpandoObject());
vecinitos[1].Nombre = "Ned";
vecinitos[1].Apellidos = "Flanders";

foreach (var vecinito in vecinitos)
{
    Console.WriteLine("{0} {1}", vecinito.Nombre, vecinito.Apellidos);
}

Vemos que la lista genérica se crea del tipo dynamic, y no del tipo ExpandoObject. Esto es normal ya que de esta forma estamos acogiendo objetos dinámicos de cualquier tipo y no sólo de esta clase particular. Aunque en este ejemplo concreto funcionaría perfectamente haberla definido con ExpandoObject, en general usaremos dynamic (u Object en VB) porque así nos aseguramos que vengan de donde vengan los objetos de la lista ésta funcionará sin problema.

A continuación definimos cada elemento añadido la lista de forma que creamos dinámicamente sus propiedades. Finalmente los recorremos en un bucle para mostrar sus propiedades.

Si en el bucle hubiésemos usado esta línea de código en ugar de la anterior:

Console.WriteLine("{0} {1}", vecinito.Nombre, vecinito.Apellidos, vecinito.Ropa);

Lo que hubiera pasado es que la primera vuelta (la de Homer) hubiera funcionado bien, pero como en el segundo elemento (Flanders) no hemos definido la propiedad ropa hubiésemos obtenido un error en tiempo de ejecución. Con esto quiero dejar claro que aunque se defina una propiedad para uno de los objetos, ésta no queda definida en los demás, ya que son objetos absolutamente independientes, así que hay que tener cuidado y no dar por hecho que una determinada propiedad va a existir para un objeto dinámico concreto.

En resumen

Los objetos dinámicos creados a partir de la clase ExpandoObject están pensados para trabajar con lenguajes dinámicos desde C# y VB. Ello además nos proporciona una nueva herramienta que podemos usar en otro tipo de desarrollos aunque no estén relacionados con los lenguajes dinámicos. Eso sí: debemos usarlos con sumo cuidado y sólo en situaciones que estén muy justificadas, porque de otra manera correremos el riesgo cierto de cometer muchos errores difíciles de detectar. De hecho una de las ventanas de los lenguajes tipados frente a los dinámicos es que es mucho más difícil meter la pata porque debes tener claro todo el rato qué tipo de información estás manejando. Así que ¡cuidado!.

Los objetos ExpandoObject son en realidad una forma fácil de acceder colecciones genéricas, por lo que debemos tener con ellos el mismo cuidado que con las colecciones. Así que cuando escribamos una propiedad con la notación del punto debes recordar que por debajo lo único que estás haciendo es añadir un elemento a una colección. Tenlo en mente todo el rato.

He dejado todo el código de este artículo en un ZIP para que puedas descargarlo y haer tus propios experimentos con estos objetos dinámicos y ver cómo se comportan.

¡Espero que te resulte útil!

Por: José Manuel Alarcon | Saturday, February 06, 2010 8:57:14 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación | Visual Studio


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner
Copyright © 2010 José Manuel Alarcón Aguín. All rights reserved.