miércoles 24 de junio de 2009

La manera correcta de mostrar el Cursor de Espera

A la hora de desarrollar interfaces de usuario, es una buena práctica el mostrar un Cursor de Espera (como el clásico reloj de arena) mientras el sistema está realizando una operación que requiera que el usuario espere.

Pero muy a menudo los desarrolladores caemos en una mala práctica, al setear la propiedad Cursor.Current como sigue:

Cursor.Current = Cursors.WaitCursor;

El problema con este enfoque es que setea temporalmente el Cursor de Espera, pero no asegura que el mismo se muestre hasta el final de nuestra operación. Otros programas o controles de nuestro propio programa pueden fácilmente resetear el cursor.

Esto puede confundir al usuario en pensar que la operación se ha completado cuando en realidad todavía se está ejecutando.

UseWaitCursor

Una manera mucho mejor de mostrar el Cursor de Espera es el setear la propiedad UseWaitCursor de un formulario en true.

form.UseWaitCursor = true;

Esto muestra el Cursor de Espera para el formulario o control especificado y todos sus controles hijos, hasta que se vuelva a setear la propiedad UseWaitCursor en false. Si nuestra operación no solo bloquea una ventana, sino toda la aplicación, podemos setear la propiedad estática Application.UseWaitCursor en true:

Application.UseWaitCursor = true;

Notar que al setear Application.UseWaitCursor, no se tomarán en cuenta las propiedades UseWaitCursor de cada control o formulario en particular.

Fuente: CSharp411
sábado 21 de marzo de 2009

Limpiar / Quitar / Remover caracteres binarios de una cadena de texto (C#)

A veces es posible que necesitemos mostrar una cadena de texto (string), la cual incluye originalmente caracteres binarios. Estos caracteres necesitan ser removidos para poder mostrar la cadena. La siguiente función remplaza todos los caracteres binarios de una cadena por un espacio en blanco. De ser necesario, es posible modificar ésta función para quitar otros caracteres indeseados (como ser aquellos con valor ASCII alto).

Función

static public string CleanString( string s )
{
if (s != null && s.Length > 0)
{
StringBuilder sb = new StringBuilder( s.Length );
foreach (char c in s)
{
sb.Append( Char.IsControl( c ) ? ' ' : c );
}
s = sb.ToString();
}
return s;
}

Aplicación de consola de ejemplo

He aquí una pequeña aplicacón de consola que muestra el uso de la función:


using System;
using System.Text;

namespace CSharp411
{
class Program
{
static void Main( string[] args )
{
Random r = new Random();
int length = 1000;
StringBuilder sb = new StringBuilder( length );
for (int i = 0; i < length; i++)
{
sb.Append( (char)r.Next( 255 ) );
}
string s = sb.ToString();
s = CleanString( s );
Console.WriteLine( s );
Console.ReadLine();
}
static public string CleanString( string s )
{
if (s != null && s.Length > 0)
{
StringBuilder sb = new StringBuilder( s.Length );
foreach (char c in s)
{
sb.Append( Char.IsControl( c ) ? ' ' : c );
}
s = sb.ToString();
}
return s;
}
}
}

Fuente: C#411

viernes 13 de marzo de 2009

Indexar y buscar con Lucene .NET - Ejemplo en C#

Sin dudas que si hoy en día hablamos de una librería open-source para la indexación y búsqueda de texto, nos estamos refiriendo a Lucene. Lucene es una API de muy simple utilización, pero a la vez una herramienta muy potente a la hora de recuperar información.

El presente artículo pretende ser una simple introducción a la indexación y búsqueda con Lucene .Net, utilizando un ejemplo en WinForms tomado de ASPCode.net.

A continuación se describen las principales partes del código:

1 - En el evento Form_Load, verificamos que el índice exista. Si no existe lo creamos.


Lucene crea el índice en la carpeta que nosotros le indiquemos, en una serie de archivos binarios. Es conveniente que la carpeta en que se creen los índices esté destinada exclusivamente a éste propósito. Al ejecutar el ejemplo, los archivos del índice se generan en LuceneTest/debug/testindex.

2 - Se inserta información de ejemplo.


3 - Por último lo más importante: el código para buscar. Lucene posee un lenguaje de consulta muy flexible (ver documento de referencia completa).

Éste ejemplo es bastante básico, pero no deja de mostrar las muy interesantes características del lenguaje de consulta de Lucene. Como se observa en la captura de pantalla, mediante el ComboBox podemos optar por buscar cualquier tipo de documento, o solamente aquellos catalogados como type=soccer o type=hockey. Además, se permite buscar en el campo header.

El código para crear la consulta, ejecutar la búsqueda y desplegar los resultados en un ListView es el siguiente:

Concluyendo, con Lucene podemos indexar cualquier tipo de documento en grandes cantidades, para ejecutar búsquedas de manera muy simple y a una muy rápida velocidad.

Descarga el código del ejemplo desde el siguiente link: LuceneTest.zip

jueves 12 de marzo de 2009

Reproduciendo videos con Silverlight vía REST y WCF

En éste artículo mostraré cómo hacer para:

  • Exponer un servicio de WCF que dado un id "retorne" un video.
  • Reproducir éstos videos desde un control Silverlight.

En el caso de la utilización de Microsoft Visual Studio 2008, es necesario tener instalado el Service Pack 1 y Silverlight Tools for Visual Studio 2008 SP1.

Silverlight Tools también puede ser instalado sobre Visual Web Developer Express SP1.

Para comenzar, creamos una solución con tres proyectos: Un WCF Service Library (C#) que denominaremos "Servicio", una Silverlight Application (C#) llamada "Reproductor", y una ASP .NET Web Application, llamada "Prueba".

Proyecto Servicio

En primer lugar, debemos agregar a éste proyecto una referencia al assembly System.ServiceModel.Web.

App.Config

IService1.cs

Service1.cs


Proyecto Reproductor

Page.xaml

Page.xaml.cs

Proyecto Prueba

Agregar una referencia al assembly System.Web.Silverlight.

Crear una carpeta ClientBin y copiar en ella el archivo Reproductor.xap ubicado en Reproductor\bin\Debug.

Default.aspx

Agregar el control Silverlight correspondiente a Reproductor.xap.

Para probar, copiar un archivo de video .wmv en c:\video0.wmv, luego iniciar el proyecto Servicio (se hostea automáticamente el servicio con WcfSvcHost), y luego el proyecto Prueba.

Bueno finalmente dejo un link para descargarse el proyecto de ejemplo:

Espero tus críticas, dudas o comentarios. Gracias!

miércoles 11 de marzo de 2009

Springloops - Hosting gratis de Subversion

Hace unos días necesitaba alojar un repositorio de Subversion para un proyecto en el que estamos trabajando varios desarrolladores. Ninguno de nosotros dispone de un servidor con 100% de disponibilidad para poder alojar el repositorio, por lo que tuvimos que salir a buscar un servicio gratis en Internet. Algo que suponía iba a ser una tarea sencilla, dado que hoy en día se encuentra prácticamente todo en Google, diría que fue bastante complicado. De todas maneras, después de una intensa búsqueda, llegué a un artículo en el sitio de Jonathan Snook, en el que se describían distintas alternativas para el hosting de Subversion. Gracias a éste artículo es que di con Springloops, servicio del cual les paso a contar a continuación.



Las principales características de éste servicio son:


  • Brinda un plan GRATIS, con 100 MB de almacenamiento, hasta 3 proyectos y número ilimitado de desarrolladores.

  • Focalizado en proyectos Web (pero sirve para cualquier proyecto).

  • Codificación en paralelo.

  • Compartimiento seguro del código.

  • A diferencia de otros servicios, el código no es visible al público (pero permite hacerlo).

  • Accesible desde cualquier cliente de SVN (para Visual Studio, recomiendo AnkhSVN).

El servicio gratis es ideal para pequeños grupos de desarrolladores, como ser estudiantes. Pero Springloops también ofrece planes más robustos, a un costo moderado.