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.

domingo, 9 de noviembre de 2008

Por fin... ¿domingo?

Este fin de semana ha sido un poco movido, por lo que no es de extrañar que finalmente el pequeño post de lecturas recomendadas que está convirtiéndose en un habitual del blog se aparezca un domingo, y no el viernes como habría sido deseable.


He pasado el fin de semana impartiendo un curso doble: Software de presentaciones, MS-PowerPoint vs OOo Impress, y gestión del CMS Joomla, en una asociación de voluntariado de carácter medioambiental a la que pertenezco desde hace eones :) . De la experiencia saco varias conclusiones, pero una de ellas, no por esperada menos llamativa, es la insistencia de los usuarios en considerar la piratería del software un mal menor. Así, al plantear como alternativa libre y gratuita la suite ofimática Open Office frente a Microsoft Office, tuve que rebatir ideas del tipo de “si el MS-Office me lo instalan gratis en la tienda” o “un amigo me ha dicho que a las ONG’s no les hacen inspecciones de este tipo para ver si se tiene licencia”. Es curioso, sobre todo, porque cualquiera de estas personas se escandalizaría si se les propusiera robar un poco de combustible para el vehículo o hurtar una película en un centro comercial. Como también lo es que se propusiese en su día no comprar productos de Coca Cola, por ejemplo, al tratarse de una multinacional de dudosa reputación respecto a su gestión de recursos en países en crecimiento, pero sin embargo no se vea mal utilizar software privativo. Creo que en este mundo hay lugar para todo, siempre y cuando seamos coherentes con las decisiones que tomamos. Por eso, por ejemplo, creí que resultaba interesante la entrada del otro día sobre el coltan.
Pero bueno, mejor no sigo por este camino, que ya algunos lectores cercanos me han tildado (con motivo) de divagar demasiado en torno a los temas, y de ser un perfecto c0ñ4z0, algo en lo que les doy toda la razón. Vamos con algunas de las lecturas que me han parecido interesantes durante la semana.


Comenzamos con el blog Albloguera, que nos trae una revisión de un antiguo artículo sobre la construcción de menús contextuales en Silverlight. La aún inmadura tecnología de Microsoft que pretende plantar cara a Flash y Java SilverFX tiene de momento bastantes carencias, pero en tanto que los chicos de Redmond van acelerando su desarrollo, resulta interesante comprobar cómo con algo de ingenio podemos sacar mayor partido de la herramienta.


Des nos trae en su blog Informático y Segurata una reflexión sobre la privacidad en las redes sociales, un aspecto que siempre me ha resultado bastante preocupante y que él resume con toda claridad: las medidas de seguridad usadas en estas redes poco o nada tienen que hacer frente al “buenrrollismo” de los usuarios, que dejan de lado cualquier consideración respecto a su privacidad para volcar en la red todo tipo de información sobre ellos. Nunca he sido demasiado amigo de este tipo de redes, la verdad, y de hecho las cuentas están poco usadas y menos actualizadas aún. De este tipo de redes, resultan especialmente interesantes las centradas en las relaciones laborales. Curiosamente estos días Enrique Dans también se hacía eco de este hecho en su post sobre redes sociales profesionales.


Por mi parte, me gustaría extender la reflexión a los propios blogs: ¿hasta qué punto nos conocen más gracias a los blogs? Posiblemente aquellos que tenéis un blog habéis dado su dirección a amigos y compañeros de trabajo. ¿Hasta qué punto conocen vuestros compañeros vuestra forma de pensar más íntima gracias a un blog? Obviamente, quedan de lado los blogs estrictamente técnicos (aunque también de estos puede extraerse información sobre nosotros), pero uno como Lobosoft, que nació con vocación técnica pero del que no he podido (¿o tal vez querido?) dejar de lado aspectos más comprometidos, creo que proporciona a los lectores pequeños esbozos sobre mis pensamientos, ya sea de forma consciente o inconsciente. ¿Pensamos en nuestros lectores, presentes o futuros, potenciales o reales, al publicar?


Una última entrada a este respecto es el corto sobre seguridad y privacidad de Delacrew, que os dejo por aquí para que podáis verlo aunque podréis encontrar más información sobre el mismo en su blog.


http://www.youtube.com/v/GOfRpnzzmVc&hl=es&fs=1;rel=0


Precisamente un amigo que me invitó a una de estas redes de que hablaba, pero que me conoce infinitamente mejor gracias a la “Saga Realidad” que a todos estos cachivaches, me enviaba una entrada referente a la gran noticia polémica de la semana: ¿desaparece la Ingeniería Informática en España? El post de preguntas y respuestas de Bolonia for Dummies puede aclararnos un poco la controversia entre los mensajes que nos llegan de la Administración y aquellos que están enviando los colegios de las diferentes regiones.


En Security Art Work nos traían una visión de la pirámide de Maslow ( que presenta nuestras necesidades en una estructura piramidal por la cual no ascendemos de nivel en tanto las del nivel anterior no quedan satisfechas) adaptada a la seguridad que resulta, cuando menos, interesante.


Por último, y para el que le hayan sabido a poco los artículos presentados, en Dragon Jar nos dejan una lista de documentación sobre seguridad informática en formato multimedia, ideal para presentaciones y para la necesaria concienciación de los usuarios que tanto venimos tratando en los últimos tiempos.

miércoles, 5 de noviembre de 2008

Coltan


Últimamente recibo numerosas llamadas de compañías telefónicas para tantearme y saber si quiero pasar a engrosar su lista de clientes. Además de precios irrisorios con respecto a la compañía con la que estoy actualmente, me ofrecen suculentas ofertas de móviles hipermegamodernos y superguays que casi dejan en mantillas a un ordenador de hace cinco o seis años respecto a lo que pueden llegar a hacer. Estas llamadas, que a buen seguro recibís también vosotros habitualmente, a la par que molestas me hacen hervir la sangre porque me recuerdan en qué mundo vivimos. Nada que no sepamos ya, por supuesto, ni que pase desapercibido si nos da por pasear por el ágora actual -el mito de Platón que tan sabiamente recreó José Saramago en su novela La Caverna- que son los centros comerciales. Todo se nos vuelve tener, tener, tener: móvil con GPS, portátil novísimo, Netbook de ínfimo tamaño, desechando el móvil que ya poseemos, y que permite llamar y recibir llamadas, el ordenador de sobremesa que compramos hace apenas dos años y que funciona a la perfección con software privativo, y de lujo con ese otro sistema operativo del pingüino. Se nos incita a comprar, a consumir, a despilfarrar tiempo, dinero y recursos con el encomiable afán de olvidar nuestras miserias, sin ser conscientes acaso de que en nuestra vorágine arrastramos con nosotros al resto de mundos, inclusive el tercero. El que más.


Y os preguntaréis, con toda la razón, ¿qué mosca le ha picado a éste? Pues que aunque a estas alturas uno está curado de espanto (o eso desearía creer), de vez en cuando leo un texto, veo una imagen, escucho una conversación, que me recuerdan que hay cosas que, si ya están mal de por sí, son peores cuando se prolongan en el tiempo, no terminan, tornan en realidad la peor de las pesadillas, que es nuestra propia naturaleza humana. Tan excelsa a veces como detestable en demasiadas ocasiones. Leía este fin de semana, y desde entonces he querido sentarme con tranquilidad a escribir sobre ello, una noticia sobre el uso del coltan en la fabricación de dispositivos de última tecnología (móviles, portátiles, satélites…) y cómo una avaricia que convertiría a Ebenezer Scrooge en un filántropo sigue llevando la guerra a países tan necesitados como la República Democrática del Congo. El coltan está compuesto por columbita y tantalita y es de un color azul metálico apagado. De él se extrae el tantalio, muy resistente al calor y con peculiares propiedades eléctricas que lo hacen muy preciado en la industria tecnológica. No abundaré mucho más en algo que la Wikipedia podrá explicar mejor a quien interese, pero en resumen el coltan está presente en la fabricación de todos estos pequeños dispositivos electrónicos y gadgets que portamos a diario, en los satélites que usa nuestro móvil GPS, que también es así de pequeño por gracia de tan singular mineral. Su escasez y amplia demanda determinan un precio que no es precisamente pequeño. Y todo ello nos lleva a la guerra, a la explotación infantil y a que se lleven a cabo todo tipo de atrocidades que podréis leer en los enlaces que adjunto al final de la entrada, algunos de los cuales incluyen vídeos.



Fotografía: Dizolele.com


Pero lo que me retuerce las entrañas no es únicamente esto (que también), sino la ilusa sensación que tenemos en este bendito primer (o segundo, no se yo…) mundo en que vivimos, de que lo merecemos todo por gracia divina. Somos el hijo mimado que todo lo merece, y que puede disfrutar del juguete que arrebata de las manos al hermano pequeño. Aunque se quede llorando y pataleando nada va a ocurrir: estamos solos en casa y nadie va a oírle. Nadie quiere oírle, porque no interesa. ¿O estamos dispuestos a no renovar nuestro móvil cada 6 meses o un año, a utilizar nuestro portátil durante 7, 8 ó 9 años al menos, a utilizar software que no lo convierta en inútil porque no sea capaz de ejecutarlo? ¿Seremos capaces ya no de optar por el decrecimiento, sino básicamente de no consumir inútilmente? ¿Sufrimos de gula tecnológica?


Os dejo con los enlaces, cuya lectura os recomiendo encarecidamente:



Y, aunque no tenga una relación del todo directa con la tecnología, sí se trata de unos hechos similares en cuanto al abuso del primer mundo con la cuna de la humanidad: Os recomiendo ver la película documental La pesadilla de Darwin, que trata sobre la perca del Nilo y los efectos que ha tenido sobre la población que vive en torno al lago Victoria (que no es poca, hablamos tres países: Uganda, Tanzania y Kenia).

martes, 4 de noviembre de 2008

Pruebas sobre la interfaz de usuario en aplicaciones Windows

Hay múltiples ocasiones en las que resulta necesario realizar pruebas sobre la interfaz de usuario de nuestras aplicaciones, y como bien saben quienes llevan a cabo desarrollo dirigido por pruebas (más conocido por su nombre anglosajón, Test Driven Development o, simplemente, TDD), esta capa del software, la más cercana al usuario, resulta más compleja a la hora de establecer una automatización sobre las pruebas. Existen, no obstante, opciones para llevar a cabo baterías de pruebas sobre la UI (User Interface), que dependerán del tipo de aplicación con la que estemos trabajando (consola, con interfaz gráfica, web…) y del lenguaje o plataforma de desarrollo. Hoy nos vamos a centrar en .NET y las pruebas en Windows Forms.


Una aplicación Windows en .NET no es más que una serie de clases, entre las que se incluirán controles de usuario y formularios, que van siendo presentadas e interactuando con el usuario a través de diversos eventos. La automatización de las pruebas, en este entorno, dependerá de ser capaces de simular la interacción del usuario con la aplicación a través de los propios controles de los formularios. Esto es factible, desde el propio código, si vamos instanciando los formularios y ejecutando sobre ellos determinadas acciones. Por ejemplo, podríamos crear un Formulario mediante


Form1 f = new Form1();

e interactuar con sus controles, bien porque conozcamos cómo se llaman, bien a través de reflexión. Sin embargo, al igual que para llevar a cabo pruebas unitarias sobre el código disponemos de frameworks tan adecuados como NUnit o XUnit.NET, para desarrollar pruebas sobre la UI podemos hacer uso de NUnitForms, una extensión de NUnit que permite realizar pruebas unitarias y de aceptación sobre aplicaciones Windows (Forms).


Si descargamos NUnitForms, veremos que además del propio framework, incorpora una aplicación llamada Recorder, que nos ayudará a “grabar” como si de una macro se tratase el test. Realmente sólo permite la grabación de tests básicos, por lo que si deseamos probar alguna funcionalidad más avanzada o un control de usuario específico que hayamos creado lo ideal será escribir la prueba a mano (o grabar una prueba más básica y ampliarla con aquellas características que el Recorder no haya sido capaz de gestionar). El funcionamiento es muy básico, y lo presentaremos mediante un ejemplo.


Imaginemos que deseamos comprobar el funcionamiento del siguiente formulario (Form1). Simplemente consta de una caja de texto (textBox1), un botón (button1), una lista (listBox1) y un par de etiquetas (label1, label2). El botón insertará en la lista los valores que vayamos escribiendo en el cuadro de texto. Una de las etiquetas contiene el valor constante “ítems”, y la otra se va actualizando con el número de elementos que contiene la lista.



El código del formulario es tan simple como esto:



[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestingUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(textBox1.Text))
{
listBox1.Items.Add(textBox1.Text);
label1.Text = listBox1.Items.Count.ToString();
}
}
}
}
[/csharp]


Por tanto, una prueba podría ser insertar uno o varios elementos en la lista, y comprobar que el valor de la etiqueta coincide con el esperado. Creamos la aplicación, la compilamos, y abrimos el Recorder. Pulsaremos sobre File, Load, y seleccionaremos el fichero .DLL o .EXE que contenga los formularios sobre los que llevar a cabo la prueba. En el desplegable de la parte superior del Recorder, seleccionamos el formulario a “lanzar”, y comenzaremos a interactuar con él.



Podremos ir viendo cómo el Recorder va “grabando” nuestras acciones sobre el formulario. Si en un momento dado queremos insertar una comprobación (un Assert), pulsaremos con el botón derecho del ratón sobre el control, y en el menú contextual seleccionaremos la propiedad del mismo sobre la que efectuar la comprobación. De este modo tendremos un método de prueba [Test] que insertar dentro del proyecto de pruebas con NUnit y NUnitForms. El código de la prueba generada quedaría así:



[csharp]
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using NUnit.Framework;
using NUnit.Extensions.Forms;

namespace TestingUITests
{
[TestFixture]
public class Form1Tests
{
[Test]
public void Test()
{

TextBoxTester textBox1 = new TextBoxTester("textBox1");
ButtonTester Form1_button1 = new ButtonTester("button1", "Form1");
LabelTester label1 = new LabelTester("label1");
FormTester Form1 = new FormTester("Form1");

textBox1.Enter("hola");
Form1_button1.Click();
textBox1.Enter("adios");
Form1_button1.Click();
Assert.AreEqual("2", label1.Properties.Text);
Form1.Close();
}

}
}
[/csharp]



Existe también una aproximación bastante interesante a las pruebas del UI en aplicaciones Windows mediante el uso de WF (Windows Workflow Foundation). El proyecto puede encontrarse en Codeproject, y merece la pena echarle un vistazo.


En el caso de las pruebas sobre la UI en aplicaciones web, contamos con frameworks de prueba como Selenium, que incorpora un plugin para Firefox para ayudarnos a crear las pruebas, de forma parecida al Recorder de NUnit. Pero esta es otra historia, que fue contada en otra ocasión ;) .

domingo, 2 de noviembre de 2008

Whizzball!

En algunas ocasiones he traído al blog reseñas de juegos de estrategia o, más habitualmente, de puzzles. Son juegos que permiten jugar un rato y desconectar de ellos, o jugar horas y horas sin cansarnos, pues su mecanismo sencillo suele albergar enormes grados de complejidad. El otro día, hablando con un compañero sobre cómo todo estaba inventado, y que consolas como Wii o DS estaban teniendo un gran éxito gracias a lo innovador de sus interfaces de usuario, más que a los juegos que se desarrollaban para ellas en sí mismos. Nos preguntábamos si existirían juegos tan castizos como las canicas, las chapas o la petanca para alguna de estas plataformas. Aunque nos sorprendió encontrar una petanca para móviles, lo cierto es que no hay ningún juego (que sepamos) de este tipo para consola (¡¡desarrolladores independientes, aprovechad el nicho de mercado!! :D ). Lo que sí encontré fue un curioso juego Flash, tipo The Incredible Machine, llamado WhizzBall! No sé si lo conocerá alguno de los lectores, pero la verdad es que tiene muy buena pinta.



Nos encontramos ante un tablero de juego que vemos en perspectiva isométrica (que, en ocasiones, puede dificultar un poco la visión de las piezas que vamos encajando en nuestro puzzle), donde iremos colocando distintos componentes, seleccionados de entre aquellos que tenemos disponibles en cada puzzle. El objetivo es simple, dada una pequeña esfera negra colocada en el punto de partida, debemos llegar con ella a dar en una diana que representa el final del trayecto. En cuanto al tablero, cuenta con casillas coloreadas, donde podemos situar piezas, y casillas en blanco donde esto no será posible. Bajo esta sencilla premisa encontramos puzzles de lo más sencillo, y otros ciertamente complejos, en los que posiblemente tengamos que usar el sistema de pistas que incorpora el juego, que nos coloca una de las piezas a cambio de una considerable cantidad de puntos.



Por último, antes de lanzaros como posesos a disfrutar de este juego, os recuerdo que los puzzles son creados por la comunidad de usuarios, por lo que la diversión se brinda por partida doble: resolviendo los puzzles existentes y creando los vuestros propios.

viernes, 31 de octubre de 2008

Cerramos la semana...

Cerramos la semana (laboral, pues muchos apuntarán que realmente la “semana” comienza hoy), cuando hay dos días por delante para dar salida a las más altas y bajas pasiones, deseos e instintos. A los más criminales les recuerdo que el lunes aparecerá en castellano el tercer volumen de las aventuras y desventuras de Dexter que, esperemos, esté mejor traducido del inglés que sus predecesores. Pero bueno, dejando esto de lado, tenemos otras lecturas para el fin de semana que (tal vez) os resultarán interesantes:


Chema Alonso, en su blog Un informático en el lado del mal nos ofreció hace tiempo una serie de artículos escritos junto a Enrique Rando sobre los metadatos en Microsoft Office, muy recomendables. Ahora, a raíz de su participación en la Open Source World Conference 2008 de Málaga, amplía la serie con un interesante proyecto para extraer metadatos de archivos de Open Office.


Security Art Work polemiza un poco sobre la apología que sobre Gmail hace gala Enrique Dans en su denostado blog (¿Por qué será que tantos bloggers le critican? ¿se trata únicamente de envidia cochina? :P ). La verdad es que la EULA de Chrome trajo consigo muchísimos reparos de la comunidad de usuarios, pero quienes defienden el uso indiscriminado de Gmail no parecen reparar en que tanto éste como Google Docs tienen licencias de uso muy similares. Fueron varias las empresas de mi entorno las que prohibieron el uso del navegador de Google, ¿no cabría tomar medidas similares con las cuentas de correo redirigidas a Google? No parece ser así para el señor Dans.


En la tan traída y llevada Web 2.0, las redes sociales son la panacea de la comunicación y el divertimento. Miles (millones) de usuarios interconectados compartiendo información: fotografías, textos, opiniones… ¿Con seguridad? En Informática y Seguridad presentan un decálogo de normas de seguridad para los usuarios de dichas redes sociales. Y me pregunto yo, con la cantidad de visitas que recibe este blog buscando saber qué contactos les bloquearon en el Messenger (y no seré el único), cuánto tardarán en aparecer ataques de phishing de los avispados fabricantes de malware ofreciendo este tipo de servicios para Facebook, Twitter o Tuenti.


Un Gurú de la Informática nos trae información sobre GreenSQL, un firewall que inhibe las peticiones al servidor que incorporen SQL Injection, presentando un informe de comandos bloqueados y sospechosos. Una herramienta muy útil que habrá que tener en cuenta a la hora de proteger nuestro servidor de bases de datos, y a la que podemos echar un vistazo gracias a la demo que proporcionan en su sitio web.


Cambiando de tercio, en Vive Málaga se lamentan de la desaparición de la tienda Tipo de esta ciudad. Yo, que recientemente viví algo similar con la Tipo de Granada, comparto su visión negativa respecto a la desaparición de establecimientos que nos han venido acompañando durante nuestra vida. No cabe duda de que el tiempo es cambiante, y lo que antes se nos antojaba como la panacea hoy no es más que un recuerdo, pero nadie nos puede robar éstos, ya sean más o menos difusos. La verdad es que en la nueva industria musical no tienen cabida los distribuidores “al uso”, aunque algunas vetustas entidades gestoras de derechos de autor se empecinen en afirmar lo contrario.


En la actualidad, el soporte es lo de menos, ya que los medios de reproducción son capaces de almacenar e intercambiar la información. Esto lo sabe muy bien la famosa cadena de televisión MTV, que ha lanzado recientemente un servicio on-line de distribución de vídeos musicales. En Un mundo binario nos hablan sobre ello.


Y si estos tiempos de crisis dickensianos son ideales para estimular la imaginación buscando nuevos sectores de negocio, en La pastilla roja nos lanzan la idea de convertir a los usuarios de nuestro software (libre) en clientes del mismo. Un breve artículo que a buen seguro os puede interesar.


Pasamos ahora al frikismo supremo. Hace unos días descubría en Devolución y Préstamo una entrada sobre literatura popular, referida a las antiguas colecciones de Bolsilibros que a buen seguro todos hemos visto en alguna que otra ocasión. Yo los recuerdo de niño, cuando los encontraba en algún cajón o veía como mis mayores los intercambiaban en el estanco. Obviamente no son el súmmum de la literatura, pero resulta curioso volver a descubrirlos tiempo después. Me trajeron también a la memoria las colecciones de la desaparecida (y ahora “rediseñada”) Editorial Bruguera, y a través de la entrada encontré un blog, Bolsi&Pulp, dedicado en exclusiva a estos libritos, por el mismo autor.


¡Venga, a disfrutar del fin de semana lluvioso que nos espera! Y, si alguien no puede o quiere salir a la calle con este clima adverso, tal vez pueda darse un paseíto por Sevilla, Valencia, Madrid o Barcelona gracias a Google Maps “Street View”.

Me alegra que me haga esa pregunta

En la entrada de ayer introducía el uso de la clase Mutex para evitar el acceso concurrente a un determinado recurso (en ese caso concreto, a la ejecución simultánea dos o más veces de una misma aplicación). Lonifasiko pregunta, muy acertadamente, qué diferencia existe entre el uso de la palabra reservada lock y el propio Mutex. Lo cierto es que tanto la exclusión mutua de Mutex como el uso de monitores (lock implementa la clase Monitor) permiten el acceso exclusivo a recursos, pero cada uno tiene sus propias peculiaridades. Empecemos con lock.


En .NET, la palabra clave lock se puede usar para evitar que dos subprocesos accedan a un mismo objeto de forma simultánea. Esto se consigue pasándole a lock un objeto como argumento, seguido del bloque de código que deseamos ejecutar aisladamente en un subproceso (es decir, sin que interfieran otros subprocesos en su ejecución).



[csharp]
object miCandado = new object();
lock (miCandado)
{
// No molestar ;)
}
[/csharp]


El objeto en cuestión debe estar basado en un tipo de referencia y es usado para definir el ámbito del bloqueo, ya que estará dado por el alcance del objeto dentro de nuestra aplicación (si se ciñe a una determinada función o es mayor, en función de si existen referencias al objeto fuera de la misma). Microsoft, en su infinita sabiduría :P, desaconseja utilizar bloqueos en tipos public, o utilizando instancias de objetos que estén fuera del alcance de la aplicación, así como cadenas, ya que pueden producir interbloqueo entre procesos si otro código fuera del control de la aplicación utiliza ese mismo objeto para llevar a cabo un bloqueo. Resumiendo, que lo ideal es usar para el bloqueo objetos privados o protegidos, excepto las cadenas, que ni por esas: el CLR las “interna”, es decir, existe una única instancia de la cadena para toda la aplicación.


Como decía, la palabra reservada lock implementa la clase Monitor, facilitando su uso. Monitor es una clase del espacio de nombres System.Threading que contiene dos métodos, Enter y Exit. Al igual que con lock, en el método Enter debemos pasarle al monitor el objeto a usar para definir el ámbito del bloqueo. Cuando finalicemos el acceso exclusivo al recurso, debemos indicar su liberación mediante el método Exit. Así, nuestro pequeño ejemplo anterior quedaría como sigue:



[csharp]
object miCandado = new object();

Monitor.Enter(miCandado);
try
{
// No molestar ;)
}
finally
{
System.Threading.Monitor.Exit(miCandado);
}
[/csharp]


Todo esto está muy bien, resulta tan sencillo como el uso de Mutex, y de hecho es incluso más rápido y eficiente. ¿Entonces, por qué usar Mutex? Bien, la diferencia (jejeje, me he hecho de rogar, pero aquí está por fin) está en que lock permite la exclusión mutua entre subprocesos hijos de un mismo proceso, pero no entre subprocesos de distintos procesos. Es decir, podemos excluir el acceso a un recurso dentro de la misma aplicación, pero no entre aplicaciones (procesos) distintos. Por esto, ya que lo que ayer deseábamos era evitar la ejecución simultánea de dos aplicaciones (que en ese caso podrían ser la misma o no, basándonos simplemente en que utilizasen el mismo nombre para el mutex creado), me basé en el uso de la clase Mutex.


Si os interesa el tema de la programación concurrente os recomiendo el recurso Threading in C#, de Joseph Albahari (precisamente en la parte 2 profundiza en las diferencias entre lock, Mutex y la tercera parte en discordia, que de momento le dejaremos a él: el uso de semáforos).

jueves, 30 de octubre de 2008

Exclusión mutua

Hay ocasiones en las que puede interesarnos que sólo exista una instancia de una aplicación ejecutándose. Uno de los métodos más habituales es usar la API de Windows para comprobarlo. Podemos conseguirlo utilizando la función FindWindow de la DLL User32 del sistema, como ya vimos hace bastante tiempo en el blog.
Un método más común en .NET es utilizar la clase Process, que también sirve para lanzar aplicaciones externas a la nuestra como procesos, para comprobar si existe ese proceso en ejecución. La forma de hacerlo es bastante simple, basta con obtener los procesos que se están ejecutando con el nombre de la aplicación actual, o lo que es lo mismo:



[csharp]
bool CheckIfExists()
{
Return (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).GetUpperBound(0) > 0);
}
[/csharp]


Sin embargo, no es tampoco el mejor método, ya que en.NET las aplicaciones no se ven separadas como procesos independientes, tal y como ocurría con las aplicaciones tradicionales, sino que se separan en distintos AppDomains, que contienen el entorno adecuado para la ejecución de las mismas. Por esto, dentro de un mismo proceso podríamos tener varios dominios de aplicación y en ese caso el método GetProcessesByName de la clase Process no resolvería el problema.
Mucho más eficiente resulta la clase Mutex (Exclusión Mutua), del espacio de nombres System.Threading. Esta clase permite la sincronización entre procesos, controlando el acceso a un recurso compartido.


El uso de esta clase es muy sencillo, como podremos observar en el siguiente ejemplo:



[csharp]
bool recursoLibre;
// Comprueba si podemos tomar el control del “mutex”
Mutex mutex = new Mutex(false, "MiMutex", out recursoLibre);
if (recursoLibre)
{
// Comienza la ejecución de la aplicación…
}
else
{
// Tratar el problema o salir de la aplicación
}
[/csharp]


Este constructor en cuestión, indica en sus parámetros si la instancia actual tendría la propiedad del mutex si su llamada fue la que lo creó, el nombre del mutex (que será usado para comprobar la concurrencia de varios procesos al mismo) y nos devolverá si está libre o no. Si lo está, podemos proceder a continuar con nuestra aplicación (o con el acceso al recurso, si fuera el caso), y si no, deberemos tratar dicho error, esperando un tiempo a que quede libre, terminando la ejecución, etc.


Dentro de los constructores que tiene Mutex existe uno que permite que le pasemos un objeto del tipo MutexSecurity, que permitirá definir los privilegios de acceso al mutex, ya que dicha clase especifica cómo se auditan los intentos de acceso al mismo. El control se lleva a cabo encapsulando el manejo de las listas de control de acceso discreccional (DACL), que controla el acceso al objeto protegido, y una lista de control de acceso al sistema (SACL) que indicará los intentos de acceso a ser auditados. Dado que no es el ámbito de esta entrada, no profundizaré en este tema de momento, pero avanzo que espero escribir en breve sobre dicho tema, además del control de acceso a los procesos y la auditoría de los mismos por parte de .NET.