Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

lunes, 31 de marzo de 2008

“Cuéntame…

...cómo te ha ido, si has conocido la felicidad."


Así comenzaba la canción Cuéntame, de Formula V, y también es la música de la conocida y premiada serie de televisión que lleva el mismo nombre. En Cuéntame se nos lleva al pasado, a la posguerra (de la Guerra Civil, en España), donde vemos cómo viven sus protagonistas durante la dictadura de Franco y la transición a la democracia.


Si en lugar de España en los años 60 nos trasladamos a Silicon Valley, a inicios de los 80, podríamos ver cómo se producía el nacimiento de algunas de las compañías de hardware y software más importantes de todos los tiempos; por citar a las dos más conocidas, Apple y Microsoft.


Steve Jobs y Bill Atkinson


De la compañía de la manzana he encontrado una galería de fotos que muestra a jóvenes con rostros en los que se refleja la ilusión por el proyecto que está naciendo. Sin querer aventurar demasiado, diría en cualquier caso que parecen felices más por la aventura que por el dinero que, posteriormente, les reportaría este negocio. Las fotografías no tienen desperdicio, como la que traemos de Steve Jobs y Bill Atkinson, y pueden verse en Folklore.org.


En este sitio web pueden encontrarse todo tipo de historias interesantes, como aquella en la que Apple demandaba a Microsoft por haber copiado su sistema de ventanas, plagiado a su vez del de Xerox.

Cheat Sheets

CheatSheets


Aunque el cerebro humano alberga un potencial que no podemos llegar ni a imaginar, lo cierto es que hoy día, con las prisas, las agendas más que apretadas, oprimidas, y el ritmo incesante de avance, crecimiento y renovación, no podemos confiar a la memoria cuanto desearíamos saber. En los casos en que ni la escritura predictiva de los IDEs sea suficiente, no está de más contar con alguna Cheat Sheet (Hoja de trucos o “chuleta”) que nos recuerde la sintaxis o el uso de alguno de nuestros lenguajes de programación o programas preferidos. Las hay para todos los gustos y de todos los colores, elaboradas hasta extremos de obra maestra. Hace unas semanas hablaba de este tema con Pedro, y hoy he querido traerlo al blog, pues considero que las cheat sheets son una idea práctica y sencilla que nos puede hacer la vida más fácil.


Para saber más:




Actualización (8 de abril de 2008): 

El blog registra una nueva entrada el 3 de abril de 2008 sobre Cheat Sheets, en concreto recogiendo una "hoja de trucos" o guía de Test-Driven Development, disponible para su descarga en formato PDF.

Pruebas unitarias en la interfaz de usuario

La dificultad de automatizar las pruebas en la interfaz de usuario (UI) es uno de los problemas conocidos de los desarrollos orientados según Test-Driven Development (TDD). Por ello, es muy importante la separación de la lógica de negocio y acceso a datos de la UI ya que, de este modo, dotamos a nuestra aplicación de una mayor independencia respecto a la plataforma en la que deba visualizarla el usuario, y podemos tener una mayor cobertura de código durante las pruebas.


Sin embargo, hay herramientas que pueden facilitarnos la tarea, como Selenium, destinada a probar la UI de aplicaciones web directamente desde el navegador, ya que se instala como un plugin para Firefox, resultando tan útil como lo fue en su día FireBug, el famoso depurador web. También es posible usarlo con Explorer, Safari y Mozilla, aunque para las pruebas de hoy he usado la versión plugin que comentaba antes.


Selenium incorpora dos modos de operación: Núcleo (Core) y Control Remoto (RC). El modo de Control Remoto también proporciona la posibilidad de realizar pruebas en paralelo desde diferentes equipos usando Selenium Grid.


Si instalamos el plugin para Firefox, podemos acceder al mismo a través del menú Herramientas -> Selenium IDE. Desde el mismo podemos crear Suites y Casos de prueba automatizados. Permite simular la interacción del usuario con el sistema, recuperar eventos y objetos; en suma, llevar TDD a uno de los campos de los que había sido excluido sistemáticamente.




Selenium IDE 1
Creación de un caso de prueba mediante el IDE de Selenium

 




Selenium IDE 2
Resultado de la ejecución de la prueba anterior. Vemos cómo falla una de las condiciones.

 


Es posible también acceder a una web a través de la cual podemos ejecutar las pruebas incluidas en las distintas suites que creemos en el IDE.



Selenium en web


 


Así pues, estamos ante una interesante aplicación que podemos descargar desde su web en OpenQA, http://selenium.openqa.org/


 


Selenium IDE

Software y religión

Lo siento, pero no he podido resistirme, tras leerlo en Microsiervos, a traerlo aquí. Es genial.



El software y las catedrales se parecen mucho. Primero lo construimos, después rezamos.



Anónimo en Mundo Geek


(Vía tweet de Acido, visto en Microsiervos)

domingo, 30 de marzo de 2008

Las malas artes de Microsoft

 


OOXML


Que Microsoft hace gala de unas políticas francamente feroces a la hora de imponer sus productos no es algo que en estos días sorprenda a nadie. Son muchos años junto a la compañía de Redmond y, por verle algún aspecto positivo, siempre se les ha visto venir de frente. El proceso de estandarización de OpenXML no está siendo una excepción, ya que viene de la mano de una fuerte polémica y, como se sabe, las aguas revueltas suelen bajar turbias.

Los domingos suelen ser días en los que relajarse y recuperar fuerzas para el embite de una nueva semana laboral, por lo que he aprovechado para leer noticias de diversos medios, que parecen coincidir en que el lado comercial Microsoft no está jugando demasiado limpio con OXML. Financial Times nos advierte sobre la Comisión Europea, que se encuentra investigando a Microsoft por las numerosas denuncias de irregularidades en la votacion ISO de OOXML. Alertada por los intentos de Microsoft de manipular el voto, se ha puesto en contacto con los organismos de estandarizacion de varios países para investigar las denuncias. Sin la aprobación como estándar ISO, Microsoft se arriesga a perder un gran numero de clientes, especialmente gobiernos y grandes empresas, cuyas políticas de utilizar sólo software certificado ISO les pone contra las cuerdas.


Veremos en qué queda todo este asunto. Entretanto, OpenOffice ha lanzado su versión estable 2.4, que puede ser descargada gratuitamente en español. A ver qué dejan para la versión 3.0, ya muy próxima, además del reemplazo de Outlook mediante la ampliación de Thunderbird.


Para saber más:

Actualización:

31-03-2008. Parece que el proceso sigue su curso. En Noruega, pese a la negativa (19 votos contra 5), el Comité decide apoyar OOXML, alegando que "si OOXML es declarado estándar, ya será mejorado después para adaptarse a las necesidades de los usuarios". Vergonzoso. La fuente, en Kriptópolis.

¡Bravo, David!

Acabo de descubrir la existencia de David Bravo, y he de decir que es todo un crack. Durante la pasada EBE07 (Evento Blog España '07), celebrado a finales del pasado noviembre, este abogado dió una charla sobre la polémica surgida en torno al canon digital, el apoyo del Gobierno a la SGAE, incluidos triunfitos y Ramoncín, donde entró en la polémica sobre la legalidad de las descargas de Internet, el derecho de expresión o la confusa publicidad que se ha estado programando en algunas cadenas de televisión. Pero el video no tiene desperdicio, así que disfrutadlo (está dividido en 6 partes, por su extensión).


[youtube]http://www.youtube.com/watch?v=501dc4q3z5A[/youtube]


[youtube]http://www.youtube.com/watch?v=4ccPxyz_B50[/youtube]


[youtube]http://www.youtube.com/watch?v=qnB5eVp57rQ[/youtube]


[youtube]http://www.youtube.com/watch?v=KzuEVa9doZ8[/youtube]


[youtube]http://www.youtube.com/watch?v=sZlZ8h67_ks[/youtube]


[youtube]http://www.youtube.com/watch?v=18qhGPmWoRw[/youtube]


También podéis oírlo en el blog de Tomlabs. Para saber más sobre este tema, visitad su blog personal.

sábado, 29 de marzo de 2008

La implantación de TDD en nuestra empresa

red_2dgreen_2drefactor.png


Que el desarrollo guiado por pruebas, o Test-Driven Development (TDD) es beneficioso para la calidad de nuestro software es algo innegable. Nos permite desarrollar sin basarnos en el depurador para verifica que nuestro software sigue cumpliendo con los requisitos, y facilita la tarea de refactorización del mismo, precisamente gracias a ello, posibilitando así que el código quede más limpio y optimizado. El uso de las pruebas unitarias o de desarrollador no involucra mayor problema pero, ¿cómo incorporamos el proceso de desarrollo guiado por pruebas a nuestro equipo o empresa?


Si nuestra empresa nunca ha realizado un desarrollo basado en pruebas, lo primero que deberemos hacer es formar a los miembros de nuestro equipo adecuadamente. En este sentido, el conocimiento de las herramientas disponibles para la creación y automatización de las pruebas será indispensable, por lo que habrá que enseñar a nuestro equipo cómo usar estas nuevas herramientas y descubrir qué características y metodologías encajan mejor en nuestro propio entorno de trabajo.


Desde el comienzo se hará necesario un seguimiento de la aceptación del proceso por parte del equipo, ya que será vital conocer cómo interiorizan la filosofía de TDD y en qué modo es puesta en práctica. Para conseguirlo, estableceremos pequeños objetivos fácilmente alcanzables, tal vez limitando el alcance de las pruebas a determinados elementos de las aplicaciones, permitiendo así que los programadores se familiaricen lo suficiente con la metodología de TDD antes de abarcar metas más ambiciosas. De esta forma, conseguiremos una mayor interiorización de la misma más rápidamente y, mediante estos pequeños logros, también conseguiremos que el equipo se sienta motivado ante el cambio, reduciendo así una posible resistencia al mismo ya que, como cualquier otro cambio, TDD requiere por parte de nuestro equipo un cambio en los comportamientos adquiridos y el desarrollo de nuevos hábitos, como puede ser el desarrollar código SÓLO cuando existe una prueba que validar. Conviene recordar que tan del equipo son los programadores como los analistas o jefes de proyecto, que deberán, en su totalidad, amoldarse a las nuevas condiciones de trabajo impuestas por la metodología de desarrollo que hemos decidido adoptar.


Una posible hoja de ruta para la adopción de TDD en nuestra empresa podría ser la siguiente:




  1. Formar al equipo.

  2. Estudiar los requerimientos y limitaciones de nuestra organización.

  3. Identificar los parámetros que nos ayuden a comprobar en qué medida se va desarrollando la implantación de TDD.

  4. Establecer pequeñas metas que puedan ser fácilmente alcanzables, para ir incrementando el alcance y dificultad de las mismas de forma progresiva. Por ejemplo, establecer en qué partes del código se establecerán los métodos de prueba, e ir ampliando su alcance.

  5. Delimitar un lapso de tiempo en el que se evaluará la adopción de TDD.

  6. Usar TDD, escribiendo las pruebas siempre antes que el código que deba superarlas.

  7. Comprobar la validez de las pruebas, y la adecuación de las mismas a lo definido en TDD.

  8. Realizar ajustes, en base a la evaluación anterior.

  9. Continuar ampliando el ámbito de actuación de nuestro equipo, abarcando cada vez más código.

  10. Proseguir con la investigación y adopción de las mejores prácticas de desarrollo, y las herramientas más óptimas. Esto implica un reciclaje continuo del equipo, lo que hace que se sienta motivado y proactivo.


Para saber más:

Actualización (8 de abril de 2008): El blog registra una nueva entrada el 3 de abril de 2008 sobre Cheat Sheets, en concreto recogiendo una "hoja de trucos" o guía de Test-Driven Development, disponible para su descarga en formato PDF.

viernes, 28 de marzo de 2008

Correo electrónico con C# y Gmail

Intentando "hermanar" las tecnologías de dos de los titanes del software mundial, Google y Microsoft, he encontrado en Google Code una biblioteca para desarrollar en .NET aplicaciones que hagan uso de las diversas APIs de Google. Se trata de la .NET Client Library Developer, bastante obsoleta ya que se requiere el .NET Framework 1.1, que actualmente carece de soporte por parte de Microsoft. Sin embargo, poder gozar de toda la potencia de las herramientas de Google (Google Maps, GMail, GTalk, Calendar...) desde una aplicación .NET, gracias a la interoperabilidad de estas tecnologías puede ser un aspecto a tener en cuenta.


Dejo hoy un pequeño código en el que he estado trabajando. Permite enviar correos a través de GMail (aunque el código es extensible a cualquier servidor de correo con soporte SMTP). Aunque relacionado con lo que comentaba anteriormente, realmente no hace uso de la API de Google, sino de System.Net.Mail del .NET Framework 2.0. El código es realmente simple, limitándose a establecer una conexión con el servidor SMTP (en Gmail, a través de los puertos 587 ó 465, en lugar del típico puerto 25), y realizar un envío usando la clase System.Net.Mail.MailMessage. En próximos días, más :)


[csharp]
public void SendMail(string destinationAddress, string subject, string body)
{
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
msg.To.Add(destinationAddress);
msg.From = new MailAddress("tudireccion@gmail.com", "TuNombreYApellidos", System.Text.Encoding.UTF8);
msg.Subject = subject;
msg.SubjectEncoding = System.Text.Encoding.UTF8;
msg.Body = body;
msg.BodyEncoding = System.Text.Encoding.UTF8;
msg.IsBodyHtml = false;

// Configuración SMTP
SmtpClient mailSmtp = new SmtpClient();
mailSmtp.Host = "smtp.gmail.com";
mailSmtp.Credentials = new System.Net.NetworkCredential("tudireccion@gmail.com", "tucontraseña");
mailSmtp.EnableSsl = true;
mailSmtp.Port = 587;

try
{
mailSmtp.Send(msg);
}
catch (SmtpException ex)
{
throw ex;
}
}
[/csharp]

miércoles, 26 de marzo de 2008

Salvad a los Desarrolladores

Save the Developers


Sólo los que hemos sufrido el infierno del desarrollo web para distintos navegadores sabemos que, en la noche, nos sigue atormentando la nula compatibilidad existente entre todas las plataformas disponibles: Internet Explorer, Firefox, Mozilla, Opera, Safari, Flock... Esta situación, permanente desde la no tan lejana Guerra de los Navegadores, se agrava cuando los usuarios no actualizan sus navegadores. Hace unos días mostraba unas estadísticas de los accesos a www.lobosoft.es, y veíamos cómo gran parte de los accesos se producían a través de Internet Explorer en su versión 6.x, ya obsoleta. Si bien es cierto que parte de la reticencia de los usuarios a las actualizaciones viene determinada por la escasa calidad inicial de las mismas, con navegadores plagados de errores y agujeros de seguridad que ponen en peligro nuestros sistemas no lo es menos que, pasado un tiempo prudencial, deberíamos actualizar el software que utilizamos, ya que irá incorporando además de mejoras funcionales, correcciones de errores existentes en las versiones precedentes.


En el ámbito de los navegadores , el desarrollador web ha de vérselas con las más diversas tecnologías (HTML, DTHML, Javascript, Silverlight, Flash, JavaFX...)y con más de cinco navegadores distintos, con sus respectivas versiones "operativas", todo para permitir que los usuarios puedan acceder y disfrutar de los contenidos de la web sea cual sea su procedencia, necesidades y gustos personales.


Para concienciar a los usuarios de la necesidad de actualizar sus navegadores se ha emprendido una campaña denominada Salvad a los Desarrolladores (Save the Developers), mediante la que podemos informar a los usuarios que visiten nuestro sitio web usando navegadores obsoletos que deberían ir pensando en actualizarlos.

El día por la libertad en los documentos

Como ya anunciaba hace unos días, hoy es el primer Día por la Libertad de los Documentos (Document Freedom Day). Lobosoft, junto a sus blogs "hermanos", Albloguera y Malvicio, ha querido sumarse a la celebración de este día inscribiéndose como un equipo más, y reivindicando documentos basados en estándares y en el código abierto.


Document Freedom Day


http://www.documentfreedom.org/Lobosoft

El Panóptico

Imaginemos la cárcel perfecta, donde todos los presos sean vigilados sin que ellos lo sepan. Donde, con solamente un vigilante podamos controlar todo el edificio. Los presos, al no saber si les están vigilando o no, tenderían a comportarse correctamente, ya que interiorizarían "la mirada", y se convertirían en sus propios guardianes, pues el castigo podría llegar en el momento más insospechado. Este fue el razonamiento que Jeremy Bentham utilizó en el diseño de su Panopticón, un modelo penitenciario que, aunque criticado en su época, fue ampliamente utilizado en cárceles, fábricas y escuelas. El vigilante invisible, existente o no, tenía el suficiente peso como para que las personas auto-regulasen su comportamiento y lo adaptasen a lo que se esperaba de ellas.


Panóptico


El Panóptico


Pasemos a la época actual. El "ojo de Sauron", que Tolkien plasmara en su obra más conocida, El Señor de los Anillos, tomó forma hace unos pocos lustros. Podríamos llamarlo metafóricamente "El oído de ECHELON", lo que describiría con bastante acierto la función que cumple la red de espionaje más grande de todos los tiempos. ECHELON, con nombre de novela de Le Carré, si seguimos con los símiles literarios, es la mayor red de escucha y análisis de comunicaciones de la historia. Aunque durante años se negó su existencia, relegando cualquier rumor sobre la misma al nivel de una leyenda urbana, lo cierto es que, poco a poco, han ido revelándose documentos (confidenciales, inicialmente), donde se hace mención a dicha red.


ECHELON nació en los años 70 con el fin de controlar las comunicaciones militares y diplomáticas de la URSS, aunque en la actualidad, caído el telón de acero, la red sigue funcionando y es usada para filtrar información sobre terroristas y narcotraficantes. Nada se debería alegar a esto, si no fuese porque ECHELON intercepta diariamente más de tres millones de comunicaciones de radio, satélite, teléfono, fax y correo electrónico; presumiblemente, es usada para el espionaje económico y político, e invade la privacidad de miles de millones de ciudadanos en todo el mundo.


ECHELON se encuentra bajo el control de UKUSA (la United States-United Kingdom-Agreement, que tiene por miembros a EEUU, Gran Bretaña, Canadá, Australia y Nueva Zelanda), encontrándose en todos estos países centros de proceso y transmisión de la información. Si es cierta la información de algunas fuentes, ECHELON tendría más de un centenar de estaciones base y satélites geoestacionarios mediante los cuales se llegaría a filtrar más del 90% del tráfico de Internet, recogiéndolo aleatoriamente y filtrando por determinadas palabras clave. Se rumorea que correos con palabras tales como "bomba", "terrorismo", "presidente" o "Bin Laden" disparan las alarmas de ECHELON.


menwith-hill-1.PNG


El centro militar de Menwith Hill, en Inglaterra. Existen indicios de que se trata de una de las bases de ECHELON. Curiosamente, no escapa a la mirada de Live Maps, pero no existe "vista de pájaro" para esta localización...

El Parlamento Europeo declaró el 5 de septiembre de 2001 que conocía la existencia de "un sistema de interceptación mundial de las comunicaciones, resultado de una cooperación entre los Estados Unidos, el Reino Unido, Canadá, Australia y Nueva Zelanda". Y, por supuesto, dado que en Europa no podíamos ser menos y, tras la aprobación por el Parlamento Europeo en 2002 de la Resolución del Consejo sobre la interceptación legal de comunicaciones, se puso en marcha ENFOPOL (ENFOrcement POLice), un sistema de escucha similar a ECHELON aunque con toda probabilidad de menor potencial que éste.


Echelon, documento


Uy, el nombre de la inexistente red ECHELON aparece en un documento oficial...


Así pues, nos encontramos "protegidos" por una inmensa red de telecomunicaciones que vigila nuestras acciones, cuanto decimos y cómo lo decimos. El vigilante de nuestro Panóptico tecnológico está aquí desde hace años, y parece dispuesto a quedarse. Terminando la entrada como la empezamos, con símiles literarios, os desearemos una agradable estancia en casa de nuestro Gran Hermano.


Echelon


Miniatura descriptiva de ECHELON. Pulsar para maximizar.


Para saber más:

Test Driven Development, una introducción

En los días pasados he estado poniendo a prueba un par de plugins para Wordpress que me permitiesen incluir en las entradas presentaciones como la que muestro hoy. Sin embargo, ni el de ThinkFree, que permite mostrar varios tipos de contenido (documentos de Word, de PowerPoint o Excel) en las páginas, pero abriéndolos a pantalla completa, ni el propio de SlideShare (el que han dado en llamar el "Youtube de los Powerpoint"), que si bien es bastante adecuado para lo que pretendía, tiene como problema la tardanza en la conversión de las presentaciones al propio formato de Slideshare (subí ayer, a las 8 de la tarde, una presentación con sólo 12 diapositivas, y hoy, a las 7 de la mañana sigue sin actualizarse).



Así pues, decidido a no dar mi brazo a torcer, he optado por una solución propia. Por un lado, he usado la aplicación gratuita
Authorpoint Lite para convertir la presentación a Flash y, posteriormente, la incluyo en la entrada incrustada dentro de un iframe. Actualización: por motivos de seguridad, no es posible abrir la presentación en el iframe, pero puede descargarse al pie de la entrada y en la zona de descargas del blog.



Como hemos podido ver, muestro una pequeña presentación introductoria al material sobre TDD que estoy preparando. Es algo escueta, pero puede dar una idea aproximada de mis pretensiones a la hora de incluir presentaciones en el blog.

Actualización (8 de abril de 2008):

El blog registra una nueva entrada el 3 de abril de 2008 sobre Cheat Sheets, en concreto recogiendo una "hoja de trucos" o guía de Test-Driven Development, disponible para su descarga en formato PDF.

Actualización (noviembre de 2008):

Tras algunos problemas de acceso a la presentación, habilito el siguiente enlace para descargarla en ZIP.

martes, 25 de marzo de 2008

Visual Studio Gallery

Para los que desarrollamos con Visual Studio, la facilidad de extensión del IDE mediante la incorporación de plugins y add-ins varios ha sido, hasta la fecha, una interesante opción a la hora de incorporar al mismo funcionalidades que no le eran propias en origen, pero que lo complementaban dotándole de una mayor potencia. Así ocurría con herramientas de control de código (como plugins para CVS o Subversion) o de gestión de las pruebas  (TestDriven.Net), por poner sólo dos ejemplos.


Ahora, mediante el uso de Visual Studio 2008 Shell, no sólo podemos aprovecharnos de esta flexibilidad, sino que podemos usar Visual Studio para crear nuestro propio entorno de desarrollo personalizado y adaptado a nuestras necesidades. Sin embargo, no cabe duda que seguiremos usando el Visual Studio original para tareas de programación más genéricas, por lo que nunca está de más contar con una buena biblioteca de extensiones que poder usar. Codeplex ya era un repositorio de código en el que podíamos encontrar muchas de estas herramientas. A pesar de ello, Microsoft ha lanzado recientemente un sitio web, la Visual Studio Gallery, donde descargar todo tipo de extensiones y productos para este entorno de programación. Los hay gratuitos, de evaluación y de pago, para todos los gustos y de todos los colores (para codificación, documentación, modelado, seguridad...). Sin duda, todo un acierto, y una web que se constituirá como de referencia a la hora de buscar ese "poquito más" que pedimos a nuestro IDE preferido.

lunes, 24 de marzo de 2008

ASP.NET MVC Framework

Para todos aquellos que en su día trabajamos con ASP, la llegada de ASP.Net con su clara separación del código de visualización (HTML) respecto al de ejecución (code-behind, escrito en el lenguaje soportado por el CLR que más nos guste) nos supo a verdadera gloria. Sin embargo, después de trabajar durante bastante tiempo con esta arquitectura (versiones 1.1 y 2.0 del .Net Framework), lo que en su día nos pareció la panacea realmente se reveló como un sistema plagado de problemas de desarrollo y mantenimiento. El uso constante del refresco de la página (postbacks) para recuperar datos del servidor, que no llegaba a solucionarse con el uso de AJAX (o ATLAS) y de servicios web, no era el súmmum de la eficiencia. Para dar solución a estos problemas, Microsoft lanzó el pasado diciembre el ASP.NET 3.5 Extensions Preview, destinado al desarrollo web, que incluye entre sus características el soporte para ADO.NET Entity Framework, ADO.NET Data Services, ASP.NET Dynamic Data y ASP.NET MVC. Con este último nos quedaremos en la entrada de hoy.


ASP.NET MVC Framework permite agilizar los desarrollos basados en el patrón de diseño Modelo Vista Controlador, cuyo diagrama de clases sería el siguiente.


MVC


En este patrón, el Modelo constituye la capa de persistencia de la aplicación, es decir, la capa más cercana a dónde y cómo se almacena la información. La Vista, como su nombre indica, es la encargada de la presentación de la aplicación al usuario, brindando al mismo la interfaz de uso correspondiente. Por último, el Controlador es el responsable de determinar la lógica de ejecución a partir de las acciones que se producen en la aplicación.


Entre otras, el uso del ASP.NET MVC aporta las siguientes ventajas:




  • URLs amigables.

  • Control sobre el código de presentación (XHTML puro).

  • Separación de lógica, presentación y control.

  • Como consecuencia de lo anterior, una mayor flexibilidad para la implantación de pruebas unitarias en el software (y facilita las técnicas de desarrollo TDD).

  • Facilita las técnicas de Inversión de Control (IoC).

  • Los componentes existentes pueden ser reemplazados por componentes de terceros.

  • Uso de ASP.NET "clásico" (eliminando postbacks).

  • Integración con VS2008.


Al crear un proyecto ASP.NET MVC, el asistente creará una estructura organizada para el trabajo, basada en la plantilla de proyecto "ASP.NET MVC Web Application" de Visual Studio. Esta plantilla genera una serie de carpetas para almacenar las clases del Modelo (/Models), de la Vista (/Views) y del Controlador (/Controllers).

Una de las características más llamativas del Framework MVC es el mapeo que realiza de las URL a las diversas clases del controlador. Sin efectuar configuración alguna, las direcciones del tipo /xxx/ serán asociadas con la clase del controlador xxxControler. La conversión de los parámetros de la URL a parámetros de entrada del método de la clase del controlador es automática.


Esta extensión del Framework, como ya ocurría, por ejemplo, con la Web Client Sofware Factory, nos permite desarrollar aplicaciones .Net de una forma más cómoda, segura y eficiente.

domingo, 23 de marzo de 2008

Document Freedom Day

Document Freedom Day


El próximo 26 de marzo se celebrará el Día para la Libertad de los Documentos (Document Freedom Day, en la lengua de Sir Clive Sinclair), en reivindicación del formato abierto y estándar en los documentos, independientemente de la plataforma y la aplicación con la que han sido generados. Recordemos que Microsoft estaba gestionando la solicitud para que su formato OpenXML fuese declarado un estándar ISO, aunque lo cierto es que no conseguía obtener todo el apoyo deseado en los resultados de las votaciones de buena parte de los países en los que debía decidirse la declaración del formato como un estándar. Ya que existe un estándar como es el ODF (Open Document Format), lo cierto es que tendría mayor sentido que Microsoft hubiese adoptado en su día el mismo, mejorándolo en su caso (sin perder la compatibilidad con el mismo y haciendo públicos los cambios). Sin embargo, el empecinamiento de Microsoft, del que ya ha hecho alarde en demasiadas numerosas ocasiones, hace que la compañía de Redmond no dé su brazo a torcer aunque la comunidad de usuarios demande unicidad en la especificación de los formatos de documento, y una mayor claridad en la gestión y uso de los mismos.


Por todo ello, como ya anunciaba, el 26 de marzo de 2008 tendremos el Día para la Libertad de los Documentos, al que se están adscribiendo multitud de equipos de trabajo de todo el mundo.


Más información en la web oficial, ODF-Document Freedom Day.

viernes, 21 de marzo de 2008

Tipos anónimos

Los tipos anónimos constituyen otra de las novedades de C# 3.0, estando fuertemente ligados a la aparición de LINQ. Realmente, los tipos anónimos son tipos class dotados de propiedades públicas de sólo lectura (por ello se les conoce también como tipos anónimos inmutables), no permitiendo ningún otro miembro de clase, como pudieran ser métodos o eventos.


Estos tipos anónimos, que son declarados mediante la palabra reservada ‘var', se inicializan justo en el momento de su creación, ya que el CLR deberá inferir, a partir de esta inicialización, la clase que será asociada a dicho tipo, y usada durante la ejecución del programa. Al ser un tipo class, la inicialización vendrá de la mano de un ‘new', ya que deberemos construir el objeto perteneciente a dicha clase. Como ya apuntábamos, los tipos anónimos tienen su máximo poder de expresión junto a LINQ, permitiéndonos ahorrar código y hacer más claro el que escribamos.



Tipos anónimos


En el código precedente, podemos observar que tras declarar un objeto ‘mitipo' mediante un tipo anónimo, Visual Studio nos permite trabajar con él como si un objeto instancia de cualquier otra clase se tratara incluyendo, mediante reflexión, acceso a las propiedades del objeto, y mostrando información sobre el mismo en el IDE, mediante Intellisense.


Como vemos, el uso de los tipos anónimos nos facilita el desarrollo, evitando la declaración explícita y formal de la clase correspondiente al tipo. La inicialización conjunta a la declaración es necesaria ya que el uso de ‘var' producirá un objeto fuertemente tipado.


Por último, adaptamos uno de los ejemplos del libro C# 3.0 in a Nutshell incorporados a LINQPad para recuperar los valores de la tabla Productos de la base de datos Northwind, incorporada como ejemplo en los productos SQL Server, para mostrar la potencia de los tipos anónimos. En esta tabla se almacena información sobre los productos de nuestra empresa, como su nombre, categoría o precio. Vamos a recuperar en concreto estos tres campos para los pedidos efectuados desde España, y el resultado lo almacenaremos en un objeto denominado ‘spanishProducts'. El código quedaría como:


[csharp]var spanishProducts = from p in Products
let spanishOrders = p.OrderDetails.Where(o => o.Order.ShipCountry == "Spain")
where spanishOrders.Any()
orderby p.ProductName
select new
{
p.ProductName,
p.Category.CategoryName,
TotalValue = spanishOrders.Sum(o => o.UnitPrice * o.Quantity)
};[/csharp]

jueves, 20 de marzo de 2008

Cómo saber si me tienen bloqueado en el Messenger…

Oh, me han bloqueado en el Messenger


"La ingeniería social es la práctica de obtener información confidencial a través de la manipulación de usuarios legítimos. Un ingeniero social usará comúnmente el teléfono o Internet para engañar a la gente y llevarla a revelar información sensible, o bien a violar las políticas de seguridad típicas. Con este método, los ingenieros sociales aprovechan la tendencia natural de la gente a confiar en su palabra, antes que aprovechar agujeros de seguridad en los sistemas informáticos. Generalmente se está de acuerdo en que los usuarios son el eslabón débil en seguridad; éste es el principio por el que se rige la ingeniería social."


(Fuente: Wikipedia)

Dadme vuestra dirección y contraseña de Messenger, y os diré quién os tiene bloqueados. Así rezan decenas de servicios en la web, tanto en páginas como aplicaciones de escritorio, que prometen proporcionarnos la información necesaria para discernir cuáles de nuestros contactos merecen nuestra amistad o no, en función de si han cometido la desfachatez de bloquearnos en un determinado momento. Y, en nuestro afán de controlar si nos controlan, no tenemos el menor reparo en proporcionar información tan sensible como nuestra contraseña de Messenger (que es la de Microsoft Passport, y puede brindar acceso a nuestro espacio personal, a nuestra cuenta de correo, a nuestros documentos en Office Live, así como a muchos otros servicios).


Lo peor es que la gente sigue cayendo ante este tipo de acciones regalando, por así decirlo, sus contraseñas. Hoy podemos perder nuestra cuenta de correo, y mañana podría ser el dinero de nuestra cuenta ante un ataque de phishing. Acciones que en el cine pueden parecernos risibles (como ya hablaba anteriormente frente al trato que en el cine se da a la Informática y a los informáticos) palidecen ante las que se llevan a cabo en la vida real, por estos excesos de confianza. Cuidado, por tanto, ante estos falsos profetas y, sobre todo, ante nosotros mismos. Somos, sin lugar a dudas, nuestro peor enemigo.


Actualizo 03/06/2008:



Incluyo entrada en el blog sobre cómo saber si nos han ELIMINADO del Messenger.

Navegadores

La diversidad de los usuarios de Internet debe ir ligada a una amplia oferta en las herramientas que puedan usar aquellos para disfrutar de los servicios de la misma. Hace años, cuando Microsoft lanzaba Windows 95 incluyendo en el mismo el navegador Internet Explorer 1.0 (basado en el código de Mosaic) daba comienzo una guerra de navegadores entre Explorer y Netscape (basado en Mozilla), que perjudicó sin duda alguna al desarrollo homogéneo de Internet. Cada navegador comenzó a ofrecer funcionalidades propias e implementaciones personales alejadas de los estándares, lo que obligó a los desarrolladores web a duplicar código en sus páginas para no dejar de lado a la mitad de sus usuarios. En cuanto queríamos ofrecer “algo más” que simple HTML, nos encontrábamos con versiones distintas de Javascript, DHTML, CSS incompatibles… y el trabajo se volvía un infierno. Aunque en las versiones más modernas de los navegadores (ahora, Explorer y Firefox, fundamentalmente) se han atenuado un poco estas diferencias, no cabe duda que el trabajo, cuando queremos ofrecer una RIA, crece de una forma insostenible. Si alguien duda de esto, que pregunte en Albloguera, que por este motivo se ha hecho un acérrimo fan de Silverlight ;)


En cualquier caso, hoy quería comentar simplemente que, en las estadísticas de Lobosoft, he encontrado una persona que ha accedido usando Flock. Este navegador está orientado al uso “social” de la web (la Web 2.0, de la que tanto se viene hablando), integrando en la aplicación todo tipo de herramientas que permiten al usuario mantener su red de contactos, recibir y leer el correo en el navegador, escribir en su s blogs a través del mismo o mantener un repositorio de fotos -mediante Flicker-, marcadores de navegación –usando del.icio.us-, e integrando en una única herramienta todo tipo de recursos. Flock está basado en Mozilla, al igual que Firefox, por lo que ambos navegadores son igualmente compatibles con los estándares del W3C. Cabría preguntarse por qué usar Flock si a Firefox, mediante el uso de plugins, podemos incorporarle todas esas funciones. Hace un par de años llegué a probar Flock en una versión beta y, aunque me gustó, no llegó a superar a Firefox. Además, me gusta poder elegir dónde guardo mis fotos, mis marcadores o la forma en que leo mi correo o escribo en este u otro blog. Pero no cabe duda que, como apuntaba en un principio, cada usuario es un mundo, y habrá muchos que se encuentren a gusto y agradezcan que todo venga “de serie” en su navegador. En cualquier caso, dos años dan para mucho, y tras ver un poco la página de Flock, estoy pensando volver a darle una oportunidad… Si lo hago, aquí quedará constancia de ello.


¿Y tú, de quién eres?


 


P.S.: En cuanto a los lectores de Lobosoft, hay una significativa ventaja de usuarios de Internet Explorer. Si te preguntas cuánta, aquí dejo un par de enlaces. Por un lado, las estadísticas de porcentaje de uso de navegadores:



Visitas, por navegador, a Lobosoft.


Y el detalle de las versiones de los navegadores usados:



Visitas, por navegador, a Lobosoft. Vista extendida por versión de navegador.


 

miércoles, 19 de marzo de 2008

La informática y el cine

Juegos de Guerra. WOPR.


Tras comentar brevemente en la entrada de ayer la defunción de Arthur C. Clarke, estuve pensando acerca del (mal) uso que, en general, se ha venido haciendo de la informática en el mundo del cine. Dado que estamos en Semana Santa, y es festivo, me voy a permitir el lujo de desvariar un poco en torno a este tema aquí mismo, sin llevarme el artículo a ninguno de mis otros blogs.


Si lo pensamos un poco, en el cine nos encontramos , fundamentalmente, con dos tipos de ordenadores: aquellos que, dotados de verdadero raciocinio y capacidad de decisión -un clásico dentro de la ciencia ficción, por otro lado-, se dedican a intentar apoderarse del mundo y/o destruir la especie humana (HAL9000 en 2001: Una odisea del Espacio; la red SkyNET, en la saga de Terminator; WOPR, algo más inocentemente, en Juegos de Guerra...), y los que hacen alarde de una capacidad de procesamiento similar a una (antaño, tan deseada) Silicon Graphics, con virus que despliegan todo tipo de artificios antes de invadir el sistema, dando exactamente igual el sistema operativo y arquitectura de los ordenadores sobre los que se instala. El virus, provenga de donde provenga (incluso tratándose de un virus alienígena), llegará irremisiblemente en un disquete de 3,5".


Lo que sí es cierto es que, a lo largo de la historia del cine y desde la irrupción del ordenador en nuestras vidas, la aparición del mismo en todo tipo de filmes nos permite, hoy día, acercarnos a su rapidísima evolución y al tratamiento que, más o menos afortunadamente, se le ha dado en este medio. Los ordenadores del nuevo milenio poco tienen que ver, sin embargo, con los soñados hace más de medio siglo por los escritores y guionistas de series de televisión y cine. Ante esto, ¿cómo imaginamos ese ordenador del futuro? ¿Tomará Google consciencia de su existencia?


Para saber más:



Descanse en paz, Arthur C. Clarke

Arthur C. Clarke


Aunque algo apartado de la temática habitual del blog, no quería dejar de rendir un pequeño homenaje al escritor británico Arthur C. Clarke, que ha fallecido en el día de hoy a los 90 años de edad en Sri Lanka. Sin duda, fue uno de los padres de la ciencia ficción actual y de uno de los ordenadores más carismático de la ficción: HAL 9000, de su 2001: Una odisea del espacio, libro basado en su propio cuento El centinela tras el éxito de la adaptación cinematográfica que, sobre el mismo, llevó a cabo el genial Stanley Kubrick en 1968.


Autor prolífico, la extensa obra de Clarke supuso un continuo cuestionarse de quiénes somos, y cuál es nuestro lugar en el universo. Nos legó además, las Leyes de Clarke, a saber:




  1. Cuando un anciano y distinguido científico afirma que algo es posible, probablemente está en lo correcto. Cuando afirma que algo es imposible, probablemente está equivocado.

  2. La única manera de descubrir los límites de lo posible es aventurarse hacia lo imposible.

  3. Cualquier tecnología lo suficientemente avanzada es indistinguible de la magia.


Descanse en paz.

martes, 18 de marzo de 2008

El juego de la vida de Conway

Preparando material para una introducción a Test-Driven Development , y aficionado como soy desde siempre al aspecto más lúdico del software, pensé en realizar una versión del Juego de la vida basando el desarrollo en la especificación de las reglas de juego mediante las pruebas unitarias. En el Juego de la vida, concebido por el matemático británico J. H. Conway, el jugador se convierte en mero espectador de la evolución que se desarrolla ante sus ojos. Las reglas son muy simples y el resultado apasionante, de ahí mi interés en convertirlo en un ejemplo para el curso. El tablero de juego es una malla de celdas en las que puede haber o no células. Básicamente, el juego se sustenta en lo siguiente:




  • Una célula muerta con exactamente 3 células vecinas vivas "nace" (al turno siguiente estará viva).

  • Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por "soledad" o "superpoblación").


En las referencias, a pie de artículo, se pueden encontrar enlaces a la Wikipedia y otros sitios de internet con más información sobre el juego.


Juego de la vida de Conway


Mi sorpresa fue mayúscula cuando, al buscar referencias a otras implementaciones del juego (como versiones en 3D, o con tableros de características distintas al del juego original), encontré con la versión que recomiendo ahora. Una implementación muy reciente del juego, en .Net 3.5, usando la potencia de LINQ para el manejo de colecciones, y con el código de pruebas unitarias implementado. Y si ya existe la rueda, ¿para qué reinventarla? Tras estudiarlo brevemente, creo que lo usaré para mi curso y, de paso, os lo recomiendo desde el blog, pues siempre me pareció un tema apasionante, tanto desde el punto de vista de la informática como base para la simulación de ecosistemas y evolución de poblaciones.


Ya que también existe una versión en F# y Silverlight (otra de las posibilidades que me planteaba, contando con el conocimiento que respecto a esta última tecnología posee mi amigo Fernando), se me ocurre ahora una versión del juego en 3D, con toda la potencia que ofrece XNA... y es que a este último le tengo, de momento, algo abandonado. A ver si los compañeros de Malvicio se apuntan a esta aventura de la vida.


Para saber más:

Office Live WorkSpace, el Google Docs de Microsoft

olwlogo.PNG


Recuerdo con agrado cuando, tiempo atrás, toda innovación en el software era recibida con agrado y las esperanzas se depositaban en los nuevos productos que lazaban las compañías. Desde los sistemas operativos, que dejaban de lado la arcaica consola de comandos en aras de un mayor control visual del trabajo, a los videojuegos, con interfaces de usuario cada vez más avanzados y motores gráficos más complejos, pasando por completas suites ofimáticas cuyos productos interactuaban entre ellos y los de los competidores para incrementar nuestra productividad. La competencia, sin duda, era y es un buen motor para la mejora de los productos. No sólo se trata de superarnos a nosotros mismos, sino “al enemigo”, por lo que no cabe dormirse en los laureles, y el software se beneficiaba de ello.


Sin embargo, a día de hoy, tras unas semanas de continuos lanzamientos, cual si se arrojasen piedras los unos a los otros, de las compañías de software más grandes del planeta (léase Google, Microsoft y compañía), me planteo si nos estamos beneficiando de la durísima competitividad existente entre ellas. Los productos se asemejan tanto como los programas de televisión actuales, donde basta que una cadena televisiva tenga éxito con un determinado programa para que el resto calquen hasta la saciedad el modelo, hastiando al personal. Si Firefox tiene pestañas, Explorer 7 también deberá tenerlas, y la versión 8 de la “e azul” la lanzamos sin ton ni son, y sin aportar nada nuevo respecto a la tercera –igualmente actual– del navegador del zorro. Si Adobe lanza Flex para la creación de RIAs (Rich Internet Applications), Sun promueve JavaFX y Microsoft su Silverlight, todos buscando lo mismo por diversos caminos, incompatibles además.


MS Office (con todo lo que tiene Microsoft, y aun existiendo la alternativa libre de OpenOffice, que siempre he defendido) era un software ofimático robusto y completo sobre el que Google innovó llevándolo a la web con su Google Docs, que ofrecía una funcionalidad algo más reducida, pero muy interesante sin duda para el trabajo en grupo, y favoreciendo la movilidad. Hoy se produce la noticia del lanzamiento de su equivalente, el Office Live WorkSpace de Microsoft. Con similitudes tremendas en su interfaz, la única novedad que incluye es la integración de Office 2007 con ese espacio de trabajo, mediante el Office Live Add-in, permitiendo usarlo a modo de repositorio de documentos, ya que en la actualidad permite incluir documentos de nuestro equipo en el espacio de trabajo y modificarlos desde la aplicación que los creó, pero no trabajar en modo on-line sobre ellos, algo que sí hacía Google Docs, y que aquí se echa en falta.



Office Live WorkSpace, screenshot


Ante este bombardeo de lanzamientos, y a la vista de los resultados, cabría preguntarse si la cantidad no merma la calidad y la originalidad de los productos.

lunes, 17 de marzo de 2008

Una aproximación a Visual Studio Tools for Office (VSTO).

Entre los proyectos de desarrollo software que nos brinda la versión 2008 de Visual Studio nos encontramos con un viejo conocido: las Visual Studio Tools for Office (VSTO), que ya venían incluidas "de serie" en VS 2005, y que permiten la interoperabilidad de Office con nuestra plataforma de desarrollo preferida. En VS 2008 podemos desarrollar herramientas para Office en sus versiones 2003 y 2007, integrándolas en las diversas aplicaciones del paquete ofimático de Microsoft. Hoy veremos cómo crear una sencilla herramienta que quedará integrada en Excel.


vsto001.PNG


En primer lugar, creamos un nuevo proyecto en Visual Studio 2008, de tipo Office 2007 - Excel Add-In, al que daremos un nombre de ejemplo.


vsto002.PNG


La estructura del proyecto generado por Visual Studio será similar a la que presentamos:


vsto003.PNG


Añadimos ahora un nuevo elemento al proyecto, de tipo Ribbon. Los ribbons constituyen parte del interfaz gráfico sensible al contexto de Office a partir de su última versión y, en cierto modo, constituyen una extensión de los entornos gráficos con múltiples pestañas (tabs), como los conocidos Dreamweaver o Flash, actualmente de la empresa Adobe. Al crear un ribbon podemos optar por trabajar con su definición en XML, o mediante el diseñador. En nuestro ejemplo, optamos por esta última opción.


vsto004.PNG


Al crearlo, veremos que el Ribbon estará compuesto por uno o más RibbonGroups, un agrupador de funcionalidades, en los que iremos incluyendo los controles necesarios de nuestro interfaz. En nuestro caso, agregamos un RibbonToggleButton (un botón que puede estar "ON" u "OFF"), y un RibbonButton, un botón normal, que tras su pulsación "vuelve" a su estado inicial automáticamente. El primero tendrá como objetivo mostrar, en el lateral de Excel, un panel de tareas (Task Pane), y el segundo podría servir para ejecutar una acción. Como nombre les daremos "Cargar ficheros" y "Ejecutar", respetivamente, y el aspecto que tendrá nuestro Ribbon tras esto será el siguiente:


vsto005.PNG


Para el Task Pane, lo más cómodo será agregar un nuevo control de usuario (User Control) al proyecto, e incluir en el mismo un botón y un ListBox. La función de los mismos será, mediante el botón, abrir una ventana de dialogo (OpenFileDialog) desde la que seleccionar los archivos a cargar, que quedarán listados en el ListBox. A la vez, crearemos una nueva hoja de cálculo dentro de nuestro libro Excel, correspondiente al fichero cargado. El ListBox nos servirá para eliminar los archivos abiertos mediante este método. El aspecto del control será:


vsto006.PNG


Y ahora, comenzamos a codificar. En primer lugar, tenemos el fichero ThisAddIn, incluido automáticamente por Visual Studio cuando creamos el proyecto. En el mismo se codificarán los métodos ThisAddIn_Startup y ThisAddIn_Shutdown, correspondientes a los eventos de inicio y finalización de ejecución de la herramienta. En el método de inicio, codificaremos la definición de un Ribbon, del UserControl y el TaskPane.


[csharp]private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
// Create ribbon
myRibbon = new MyFirstRibbon();
// Create user control
LateralViewUC uc = new LateralViewUC();
// Create the task pane
ctp = this.CustomTaskPanes.Add(uc, "Trace Comparer: Files");
ctp.Visible = false;
}[/csharp]

Con esto conseguiremos que al iniciar la aplicación, Excel muestre nuestro Ribbon, y permita mostrar u ocultar un panel de tareas en cuyo interior se encontrará el control de usuario que hemos definido. Para que se muestre u oculte el panel de tareas, deberemos codificar el evento correspondiente para el botón de "Cargar ficheros" del Ribbon. El método lo encadenaremos al manejador de eventos asociado al evento Click del ToggleButton. Con un mero doble click sobre el botón, aparecerá el método método


private void FirstToggleButton_Click(object sender, RibbonControlEventArgs e)

Que realmente se habrá asociado al click del botón a través del siguiente código, en el código del diseñador del Ribbon:


this.FirstToggleButton.Click += new System.EventHandler(this.FirstToggleButton_Click);

La visibilidad del panel de tareas vendrá determinado, dentro del método por el código:


Globals.ThisAddIn.ctp.Visible = isPressed;

El código del control de usuario, por otro lado, es trivial. Se trata simplemente de abrir el cuadro de diálogo que permita seleccionar el archivo. Una vez cargado, se incluye en el ListBox y se crea una hoja Excel para el mismo.



vsto020.PNG
vsto021.PNG

La creación y borrado de las hojas Excel podría hacerse mediante el siguiente código:


[csharp]public void CreateSheet(string sheetName)
{
try
{
Excel.Worksheet mySheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
mySheet.Name = sheetName;
}
catch (Exception ex)
{
throw ex;
}
}[/csharp]

[csharp]public void DeleteSheet(string sheetName)
{
try
{
Excel.Workbook myBook = Globals.ThisAddIn.Application.ActiveWorkbook;
((Excel.Worksheet)(myBook.Sheets[sheetName])).Delete();
}
catch (Exception ex)
{
throw ex;
}
}[/csharp]

De este modo, tendremos lista una simple herramienta de carga de ficheros a Excel mediante Visual Studio Tools for Office.


[download#3#size]

sábado, 15 de marzo de 2008

Tipos de letra para programadores

Que el hombre es un animal de costumbres es algo innegable. Y afirmar que el programador, como particularización de aquel, suele ser además maniático, no constituye ninguna falsedad. Además del genérico “¡Hola mundo!” que cualquier programador implementa cuando se aproxima a un nuevo lenguaje de programación, el programador posee entre sus señas de identidad la elección de un IDE preferido y la personalización del mismo, acción esta que no siempre tiene porqué estar reñida con el buen gusto.


Entre las opciones que tenemos para la personalización de nuestro IDE se encuentra la elección del tipo de letra. Existen diversos tipos de letra específicamente diseñados para programadores, y entre sus características se cuentan:




  • Facilidad para distinguir caracteres similares (como el cero de la o mayúscula, por ejemplo).

  • Legibilidad, incluso con tamaños de letra pequeños, para maximizar la cantidad de código que podemos presentar en pantalla.

  • Monoespaciado (para que la indentación, por ejemplo, sea adecuada).


Considero que la tipografía es un arte, y que la elección de un buen tipo de letra, legible y adecuado para nuestros textos, no tiene precio. Hace sólo unos días un compañero me recomendaba instalar el tipo de letra Consolas (un ClearType Font que Microsoft lanzó para Visual Studio 2005). La verdad es que me ha gustado mucho, e incluso he encontrado una versión libre llamada Inconsolata en un artículo que el conocido Jeff Atwood dedica a este tema en su imprescindible blog, Coding Horror, donde además dedica otra entrada a disertar sobre el color del código en nuestros entornos de programación. ¡¡Qué lejos queda poder cambiar de 20 a 45 líneas nuestro Turbo Pascal 7 o el Borland C++ 3.1!!


Turbo Pascal 7


Finalmente me quedo con Anonymous, un tipo de letra que apareció inicialmente para Mac, pero que existe también en versión freeware como TrueType Font para Windows.

viernes, 14 de marzo de 2008

Visual Studio 2008 Shell

Visual Studio 2008 Shell Logo pequeño


Desde sus comienzos, Eclipse fue concebido como un SDK (Software Development Kit) especialmente preparado para la creación de IDEs (Integrated Development Environment). Muy usado en entornos de programación Java, la verdad es que Visual Studio (especialmente desde su versión 2003 a la actual, 2008) tomó en sus inicios algunos aspectos fundamentales del mismo pero, como suele ocurrir con Microsoft, los rediseñó en aras de conseguir una mayor productividad en los desarrolladores que lo usasen como IDE de programación para el .Net Framework. En su última versión, Visual Studio 2008, Microsoft ha presentado importantes cambios y mejoras respecto a sus predecesores. Ya no sólo tratamos el lanzamiento del propio Framework 3.5, del que ya hemos hablado en varias ocasiones, sino de la propia interfaz de desarrollo.


Entre las herramientas que incorpora VS2008, nos encontramos con Visual Studio 2008 Shell, un producto que nos permitirá crear entornos de desarrollo personalizados. Es decir, podemos crear IDEs propios, y ofrecerlos a nuestros clientes como entornos de trabajo, ya que el producto es gratuito, formando parte del SDK de Visual Studio. Y, como apunta Microsoft en su web, “Building and deploying applications based on the Visual Studio Shell will be royalty-free”.


Las aplicaciones (los IDEs) desarrolladas con VS2008 Shell podrán distribuirse por dos métodos:




  • Integrado: Por el cual la aplicación es instalada en el entorno de Visual Studio, permitiendo a los desarrolladores usar las herramientas de VS además de las personalizadas.

  • Aislado: La aplicación se distribuye como “un todo”, independiente de Visual Studio, aislada de otras posibles versiones de Visual Studio instaladas en el equipo.



bb510103isolatedmode_large.jpg


La diferencia entre VS2008 Shell y VSTA se encuentra, fundamentalmente, en que el enfoque de Shell es, como ya apuntaba, desarrollar nuestros propios entornos y brindarlos al cliente, mientras que VSTA se diseñó como un método para incluir la funcionalidad del .Net Framework DENTRO DE nuestras aplicaciones (de forma similar a como VSTO lo hace con las aplicaciones de Office).


Para saber más:



jueves, 13 de marzo de 2008

Open Parliament

Ahora que finalizaron las elecciones, podemos hacer balance de la situación actual, y de cómo se ha llegado a este punto. Durante las últimas semanas he venido comentando con amigos y compañeros la omnipresencia de las grandes compañías de software alrededor de los comicios. Por un lado Google, que mediante YouTube ofreció la posibilidad a los ciudadanos de realizar las preguntas que deseasen, en primera persona, a los partidos políticos. También ofreció toda la información sobre el proceso electoral, recuento de votos y resultados en tiempo real. Por otro lado Microsoft, que ha estado presente mediante el bot que preparó el partido gobernante para informar a la ciudadanía de sus propuestas, y que requería el uso de MSN Messenger en su última versión para ofrecer toda su potencia de búsqueda. Los productos de la compañía de Redmond también se hacían imprescindibles en la página del Ministerio del Interior ya que, para poder visualizar los videos de las ruedas de prensa que se fueron ofreciendo a lo largo del día, se requería tener instalado Windows Media Player.


Mi opinión, como ya hablaba con los amigos, es que no se puede (no se debe) tener una doble moral, hablando de promocionar el software libre y los estándares abiertos, y usando software privativo en la administración pública. La dos compañías mencionadas (y tantas otras) poseen un potencial inimaginable para el procesamiento de la información. Potencial que puede volverse contra el ciudadano, por ejemplo, si se tiene acceso a datos tan sensibles como a quién votamos. Ya saben qué instalamos en nuestro equipo, qué blogs leemos, qué compramos… ¿Hasta cuándo seguiremos atados a software cerrado, no por ello más seguro, como ha demostrado la Historia? En Kriptópolis se hacían eco de estos asuntos hace unos días, y la noticia generó un interesante debate, unido a la propuesta de usar el voto electrónico para reducir el consumo de papel (lanzada, curiosamente, desde un diario impreso).


En aras de alcanzar una “democracia electrónica” más real, existen iniciativas como la que presentaba ayer, Día Internacional por la Libertad de Expresión en Internet. O la que recoge hoy Barrapunto, y nos hacemos eco de ella: el Open Parliament, donde se puede firmar solicitando a los gobiernos europeos que se use software libre en todas las instituciones y administraciones. El software libre genera riqueza local, es más seguro y a los contribuyentes nos cuesta menos.


Para saber más:



Editor gráfico de esquemas XML

Una de las herramientas que se echan en falta dentro de la suite de desarrollo de Visual Studio 2008 es un editor visual para archivos, hojas de estilo y esquemas XML. La versión de VS2003 incorporaba un XML Editor, similar al editor de DataSets que mantuvo la edición de 2005, pero su potencia y flexibilidad eran bastante limitadas. Investigando un poco, he encontrado Liquid XML Studio 2008, una aplicación que nos permite trabajar de forma cómoda y ágil con este tipo de documentos, permitiendo además la integración con Visual Studio 2008 como un plugin más. Entre las características que ofrece se encuentran la edición visual de esquemas de definición XML (XSD), la validación de ficheros XML usando estos esquemas, la creación de un XML de ejemplo, siguiendo el esquema, o inferir el XSD a partir de una serie de archivos XML que deberían cumplirlo. Existe una versión freeware que puede descargarse desde la web oficial de Liquid Technologies Limited.


Captura del programa

miércoles, 12 de marzo de 2008

Día Internacional por la Libertad de Expresión en Internet

Reporteros Sin Fronteras


La organización Reporteros Sin Fronteras y la UNESCO promueven el Día Internacional por la Libertad de Expresión en Internet, que se celebra por vez primera hoy, 12 de marzo. Lo hacen para denunciar que, en la fecha actual, hay aún 63 ciberdisidentes encarcelados por expresarse libremente en la red de redes. Se pretende así evitar que se siga persiguiendo la libertad de expresión en Internet, censura ejercida en buena parte por los gobiernos y que, me temo, cada día vendrá más de la mano de grandes corporaciones privadas. Ya Orwell nos prevenía de la existencia de un gran hermano que hoy parece más omnipresente y omnisciente que nunca.


Ante esto, el llamamiento de Reporteros Sin Fronteras y UNESCO me parece una forma más de expresar que no estamos dispuestos a vendernos al mejor postor, ni a subyugar nuestros derechos a la primera de cambio. Aunque a veces lo hagamos de forma inconsciente. Durante 24 horas, desde las 11 horas del miércoles 12 de marzo hasta la misma hora del día 13 podremos crear un avatar, elegir el mensaje para nuestra pancarta y tomar las cibercalles en una de las manifestaciones que tendrán lugar en Birmania, China, Corea del Norte, Cuba, Egipto, Eritrea, Túnez, Turkmenistán y Vietnam.


Para saber más:

martes, 11 de marzo de 2008

.Net Micro Framework

medc-2006-26-370.jpg


¿Hay algo más pequeño dentro de .Net que Compact Framework, especialmente diseñado para la programación de dispositivos móviles como PDAs, GPS, etc.? La respuesta es sí: el .Net Micro Framework, que brinda el núcleo del framework de Microsoft para desarrollar en C# usando Visual Studio 2005 ó 2008 (excepto en sus versiones Express), aplicaciones de código administrador que puedan ser ejecutadas en dispositivos con escasa capacidad de memoria y procesamiento, como, por ejemplo, relojes, pantallas digitales o aparatos de monitorización. Son los conocidos SPOT (Small Personal Object Technology) y, de momento, los únicos procesadores soportados por la versión actual (2.5) del SDK de .Net Micro Framework son los ARM7 y ARM9, aunque previsiblemente se ampliará la gama de CPUs disponibles conforme pase el tiempo.


bb409985arch2en-usmsdn10.jpg


La versión 2.5 del .Net Micro Framework aporta mejoras respecto a las versiones anteriores del producto, basándose fundamentalmente en proporcionar dentro de la plataforma un grupo nativo TCP/IP, facilitando la conectividad en redes, y la implementación de Web Services on Devices, una tecnología que permite a los PCs con Windows descubrir y comunicarse con estos instrumentos, sin necesidad de configuración por parte de los usuarios.



lunes, 3 de marzo de 2008

Propiedades automáticas en C# 3.0

Seguimos con las novedades del .Net Framework 3.5, en concreto con las propiedades automáticas que vienen incluidas desde la versión 3.0 del mismo. Hasta no hace mucho, cuando deseábamos declarar una propiedad que simplemente almacenase o recuperase un valor de un campo privado de nuestra clase, el proceso a seguir era el siguiente:




  1. Declarar la variable privada.

  2. Definir la propiedad que permitía el acceso de lectura (get{}) y escritura (set{}) a la misma.


Con lo que el código podía quedar así:


[csharp]
private string mipropiedad;

public string MiPropiedad
{
get { return mipropiedad; }
set { mipropiedad= value; }
}
[/csharp]

Esto, repetido por ejemplo para una clase con veinte propiedades, conlleva un importante trabajo de copy&paste(TM) ;) .


En C# 3.0 podemos (si lo deseamos) hacerlo así:


[csharp]public string MiPropiedad { get; set; }[/csharp]

Ahorramos la declaración de la variable, y la asignación y recuperación de valores. Claro está, lo único que está haciendo Visual Studio es encargarse de generar, de forma automática, toda la lógica subyacente. Si usamos Reflector para ver la clase generada, nos encontraremos con lo siguiente:


Propiedades automáticas en C# 3.0


Ahora bien, si deseamos declarar una propiedad automática de sólo lectura o sólo escritura, ¿bastará con un public string MiPropiedad { set; } o un public string MiPropiedad { get; }? Sintiéndolo mucho, la respuesta es que no. De intentarlo, se provocará el error de compilación "'NamespaceX.MiPropiedad.set' (o get) must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors."


Para lograrlo debemos declarar como privado el set, en las propiedades de sólo lectura, y el get en las de sólo escritura.
[csharp]
// Propiedad de sólo lectura
public string MiPropiedadSoloLectura
{
get;
private set;
}

// Propiedad de sólo escritura
public string MiPropiedadSoloEscritura
{
private get;
set;
}[/csharp]

Lo que para el CLR se traduce en:


Propiedades automáticas de solo lectura/escritura en C# 3.0

domingo, 2 de marzo de 2008

Asserts en NUnit

En un post anterior introducía los atributos con que podíamos etiquetar nuestras clases y métodos de prueba para que NUnit pudiese así reconocerlos y usarlos. Hoy veremos cómo podemos determinar si una prueba ha sido superada o no.


Las aserciones (asserts) son la parte central de la prueba en todos los frameworks xUnit. NUnit nos proporciona la clase Assert, que consta de una serie de métodos estáticos que nos permitirán validar si una determinada prueba ha sido superada o no. Hay que tener en cuenta que los métodos de Assert provocan una excepción si la prueba no ha sido superada, por lo que si en nuestro método hacemos varias llamadas a validaciones de Assert, aquellas que estén tras una prueba no superada no serán ejecutadas. Por esto, es conveniente no situar demasiadas validaciones en un único método, o estaríamos ocultando, aunque fuese temporalmente, la existencia de otros errores en la codificación.


Los métodos de la clase Assert pueden agruparse según su funcionalidad en:

Aserciones de igualdad: evalúan si dos argumentos son iguales. Los métodos están sobrecargados para mayor comodidad nuestra, de modo que puedan pasársele los valores a comprobar sin tener que llevar a cabo previamente una operación de boxing. Ejemplos de este tipo de aserción son:


[csharp]Assert.AreEqual( int expected, int actual );
Assert.AreEqual( int expected, int actual, string message );
Assert.AreEqual( int expected, int actual, string message, params object[] parms );
// unos pocos métodos más...
Assert.AreNotEqual( decimal expected, decimal actual );
Assert.AreNotEqual( decimal expected, decimal actual, string message );
Assert.AreNotEqual( decimal expected, decimal actual, string message, params object[] parms );[/csharp]

Aserciones de identidad: comprueban si los dos argumentos están referenciando al mismo objeto.

[csharp]Assert.AreSame( object expected, object actual );
Assert.AreSame( object expected, object actual, string message );
Assert.AreSame( object expected, object actual, string message, params object[] parms );

Assert.AreNotSame( object expected, object actual );
Assert.AreNotSame( object expected, object actual, string message );
Assert.AreNotSame( object expected, object actual, string message, params object[] parms );[/csharp]

También tenemos un método para comprobar si un objeto está contenido en un array o lista:

[csharp]Assert.Contains( object anObject, IList collection );
Assert.Contains( object anObject, IList collection, string message );
Assert.Contains( object anObject, IList collection, string message, params object[] parms );[/csharp]

Aserciones de comparación: nos permiten comprobar si el valor de un parámetro es mayor o menor que el del otro.


[csharp]Assert.Greater( float arg1, float arg2 );
Assert.Greater( float arg1, float arg2, string message );
Assert.Greater( float arg1, float arg2, string message, object[] parms );

Assert.Greater( IComparable arg1, IComparable arg2 );
Assert.Greater( IComparable arg1, IComparable arg2, string message );
Assert.Greater( IComparable arg1, IComparable arg2, string message, object[] parms );

Assert.Less( float arg1, float arg2 );
Assert.Less( float arg1, float arg2, string message );
Assert.Less( float arg1, float arg2, string message, object[] parms );

Assert.Less( IComparable arg1, IComparable arg2 );
Assert.Less( IComparable arg1, IComparable arg2, string message );
Assert.Less( IComparable arg1, IComparable arg2, string message, object[] parms );[/csharp]

Aserciones de tipo: nos permitirán validar si el objeto pasado por argumento pertenece a un tipo de dato determinado:


[csharp]Assert.IsInstanceOfType( Type expected, object actual, string message );
Assert.IsNotInstanceOfType( Type expected, object actual, string message );
Assert.IsAssignableFrom( Type expected, object actual, string message );
Assert.IsNotAssignableFrom( Type expected, object actual, string message );[/csharp]

Pruebas de condición: permiten comprobar si se da una determinada condición en el parámetro que le pasamos. Por ejemplo, si su valor es nulo, verdadero o falso, o si está vacío.


[csharp]Assert.IsTrue( bool condition, string message );
Assert.IsFalse( bool condition, string message );
Assert.IsNull( object anObject, string message );
ssert.IsNotNull( object anObject, string message );
Assert.IsNaN( double aDouble, string message );
Assert.IsEmpty( string aString, string message );
Assert.IsEmpty( ICollection collection, string message );
Assert.IsNotEmpty( string aString, string message );
Assert.IsNotEmpty( ICollection collection, string message );[/csharp]

Métodos de utilidad: Los métodos de utilidad permiten extender nuestro framework de pruebas o cambiar su funcionamiento normal. El primero de ellos es Fail(), y nos permitirá generar “fallos controlados” para crear nuestras propios métodos de aserción, personalizados y específicos para nuestros tests.


[csharp]Assert.Fail();
Assert.Fail( string message );
Assert.Fail( string message, object[] parms );[/csharp]

Por ejemplo, en el siguiente código validamos si un string contiene un valor determinado:

[csharp]public void AssertStringContains( string expected, string actual )
{
AssertStringContains( expected, actual, string.Empty );
}

public void AssertStringContains( string expected, string actual, string message )
{
if ( actual.IndexOf( expected ) > 0 )
Assert.Fail( message );
}[/csharp]

Por otro lado tenemos el método Ignore(). Ignore nos permite ignorar una determinada prueba de forma dinámica. Puede usarse en métodos de [Test], [Setup] o [Fixture Setup], pero los propios creadores de NUnit recomiendan usarlo en casos muy determinados, ya que podemos llevar a un comportamiento algo anárquico en las pruebas, haciendo difícil distinguir qué estamos ejecutando en un determinado momento, y qué no.


Por último, indicar que la clase StringAssert proporciona varios métodos extra para la realización de pruebas sobre strings.


[csharp]StringAssert.Contains( string expected, string actual, string message );
StringAssert.StartsWith( string expected, string actual, string message );
StringAssert.EndsWith( string expected, string actual, string message );
StringAssert.AreEqualIgnoringCase( string expected, string actual, string message );[/csharp]

Los ejemplos de esta entrada han sido tomados de la documentación oficial de NUnit 2.4.6.


Actualización (8 de abril de 2008): 

El blog registra una nueva entrada el 3 de abril de 2008 sobre Cheat Sheets, en concreto recogiendo una "hoja de trucos" o guía de Test-Driven Development, disponible para su descarga en formato PDF.

sábado, 1 de marzo de 2008

Portal rojo a Britannia

Llevaba rondándome por la cabeza bastante tiempo, pero tras la afirmación de mi compañero de equipo Piterlouis(*) de que se trata de uno de mis juegos preferidos, no me queda más remedio que hacerlo: escribir sobre la saga Ultima y, más concretamente, sobre su séptima parte.


Inicio de la aventura


Ultima VII, The Black Gate, es uno de los juegos de rol que más me ha impactado. Lo jugué tras su lanzamiento, hace la friolera de 16 años, en un x386 a 25Mhz que apenas conseguía proporcionar la velocidad suficiente para que se moviese con la adecuada fluidez. De hecho, fue uno de los primeros juegos que me engancharon a “velocidad anormalmente reducida”, al menos hasta que pude ampliar la memoria RAM (de 1 a 4 Megabytes), pero su majestuosidad, la profundidad de su historia y su adictivo argumento no daban tregua a la espera por un equipo de mayores prestaciones.


La historia que presentaba ante nosotros el singular Lord British (aka Richard Garriot, en la “saga realidad”) era, a grandes rasgos, la siguiente: Tras vencer a la gárgola, el Avatar -protagonista de la saga desde el primero de los capítulos- retorna a su hogar, fuera del mundo de Britannia. Sin embargo, dos siglos más tarde, una enigmática figura que se autodenomina El Guardián, reta al Avatar diciéndole que ha llegado una nueva era de luz, en la que él dominará Britannia. El Avatar debe regresar a través de un Portal Lunar rojo, y al hacerlo llega a la ciudad de Trinsic, donde su viejo amigo Eolo le espera junto a Spark, un niño que acaba de quedar huérfano al morir su padre, la noche anterior, en un asesinato ritual. Se le pide al Avatar que investigue el crimen y su supuesta relación con La Hermandad, una filosofía religiosa que ha surgido en los últimos tiempos alrededor de Batlin, su guía espiritual.


Esta que describimos será la historia principal de Ultima VII, y resulta prometedora desde que, poco a poco, vamos descubriendo hilos argumentales y situaciones que, como en una buena novela detectivesca, nos encaminan en la dirección adecuada para resolver el misterio. Sin embargo, a lo largo de nuestro deambular por Britannia descubriremos cientos de pequeñas historias que pueden ayudarnos a encajar las piezas del puzle o, simplemente, aportarnos mayor diversión y horas de juego en misiones segundarias que nada tienen que ver, y nada influirán, en el devenir de nuestras investigaciones y la conclusión del juego.


La evolución de Ultima con el paso de los años fue, como es de suponer, acompañada por una mejora técnica que concluyó, en Ultima VII, con un interfaz gráfico mucho más avanzado que el de sus predecesores. La vista del juego desde una perspectiva cenital, el terreno de juego que ocupaba toda la pantalla, sobre la que se superponían los elementos de inventario cuando era necesario, la posibilidad de usar exclusivamente el ratón, un sistema de lucha en tiempo real sustituyendo al basado en turnos de las partes anteriores, personajes dotados de inteligencia artificial y que podían decidir cómo actuar en función de si el Avatar era o no fiel a sus Virtudes… Todo ello acompañaba a la fantástica historia para envolvernos en un mundo ficticio con una profundidad pocas veces vista hasta la fecha.



Ventanas de inventario
Mucha armadura mágica llevamos...

A Ultima VII, The Black Gate, siguió una segunda parte, Ultima VII, The Serpent Isle, que continuaba la historia iniciada con el portal negro pero, a mi parecer, con menor profundidad, lo que le hizo perder puntos. Ultima VIII y Ultima IX dieron un cambio a la saga, restando componentes de rol e incrementando los de aventura e, incluso, de arcade, hecho este por el que fueron ampliamente criticados. Mejor suerte corrió Ultima Online, uno de los primeros MMORPG como los conocemos hoy día, y que se sigue jugando ampliamente entre la comunidad, creciendo en mundos y en jugadores conforme pasa el tiempo, aunque herederos suyos, como WoW le vayan robando terreno a pasos agigantados.



Inicio en Trinsic
Inicio de la aventura, en Trinsic

Inicio en Trinsic, en Exult 3D
El mismo inicio, visto con Exult 3D

Por último, para aquellos jugones que no lo disfrutaron, y para aquellos que sí lo hicieron y desearían volver a hacerlo, me gustaría remarcar la existencia de Exult, un motor de juego de Ultima VII, reescrito por la comunidad de desarrolladores, y disponible de forma gratuita para su descarga. Con Exult es posible jugar a Ultima VII desde diversas plataformas (Linux incluido), siempre que dispongamos del juego original . Es decir, no sustituye al mismo, sino que lo complementa, evitando problemas como el extensor de memoria que se usó en su programación (un incompatible en la actualidad Voodoo Memory Manager). Además, como curiosidad, añadiré que hace unos meses pude comprobar cómo se está desarrollando un Exult 3D, un nuevo motor de juego que toma los componentes del Ultima VII clásico para transportarnos mediante este motor gráfico en tres dimensiones a una Britannia renovada, pero tan apasionante como siempre.


_____


(*) Piterluis, del equipo de Vicious Team.


(Este artículo fue publicado originalmente en Malvicio.com)