Lilypie Primer PicLilypie Primer Ticker

miércoles, 25 de junio de 2008

Iconos, Iconos y mas Iconos

http://www.iconlet.com

Contiene una gran variedad de iconos que podemos incluir en nuestras aplicaciones. Los iconos son de muy buena calidad y pueden ser descargados sin costo.


Ojala les sea de utilidad

http://www.iconlet.com

viernes, 2 de mayo de 2008

Ruby: Un nuevo pariente cercano

Aunque este blog está orientado a la plataforma .NET, no podemos ignorar que los lenguajes dinámicos (Python y Ruby en particular) están ganando mucho terreno.

MS ha anunciado que Ruby estará entre los lenguajes soportados por Silverlight, asi que Ruby ya está entre los 'parientes cercanos' de C# (aludiendo al título de este blog), por lo que a partir de ahora los posts incluirán temas referidos a este lenguaje.

Y quiero aprovechar este primer post para compartir con ustedes un recurso muy interesante. Un curso online gratuito de Ruby, que lleva adelante un profesor indio (de la India) llamado Satish Talim. Este curso está basado en Moodle y la quinta versión empieza mañana sábado 3 de mayo, pero tenemos la opción de inscribirnos hasta el 6 de mayo.

Los participantes de esta versión ya superan los 400 y mas de 2000 personas ya han tomado este curso en sus versiones anteriores.

Yo ya me inscribí, y los invito a ustedes a participar también. Pueden registrarse aqui

Saludos.

miércoles, 23 de abril de 2008

Live Mesh: mucho ruido

La gente de MS hizo mucho ruido hoy en los blogs con el anuncio del lanzamiento de una versión preliminar de una nueva plataforma de servicios llamada Live Mesh

El comercial dice:

Aqui, allá, en todo lugar.

Live Mesh te ubica en el centro de tu mundo digital. conectandote con la gente, los dispositivos, los programas y la información que te interesa. disponible en el lugar que estés.

Pues eso.. la idea es lograr que los usuarios tengamos acceso a nuestra información independientemente del lugar en que nos encontremos y del dispositivo que utilicemos.

En channel9 está disponible una entrevista con Ray Ozzie, en que brinda mucha información respecto a este nuevo producto.

El tiempo dirá si se trata de un producto más o es una innovación tal que marque un punto de inflexión en la forma en que los usuarios interactuamos con nuestra información.

Por mientras hariamos bien en mantener un ojo puesto en la evolución de esta cosa llamada Live Mesh.

Saludos

UPDATE: En este post del General Manager de Live Mesh hay una explicación muy completa de las características.

martes, 22 de abril de 2008

The Shutdown Day

Este 3 de mayo será el Shutdown Day, que se celebra una vez al año.

Qué hay q hacer?? pues simplemente apagar el computador durante un dia entero y compartir cosas diferentes y divertidas con la familia y los amigos.

Estas cosas no deberian hacerse solo una vez al año.. sino minimamente un dia por semana, pero no deja de ser un experimiento interesante que nos ayuda a ver las lindas cosas que nos perdemos por estar sentados frente a nuestro monitor la mayor parte de nuestro tiempo.

Shutdown Day is a Global Internet Experiment whose purpose is to get people to think about how their lives have changed with the increasing use of the home computer, and whether or not any good things are being lost because of this.

The idea of Shutdown Day project is simple - just shutdown your computer for one whole day of the year and involve yourself in some other activities: outdoors, nature, sports, fun stuff with friends and family - whatever, just to remind yourself that there still exists a world outside your monitor screen.

El sitio que promueve esto es Shutdown Day

Quien se anima a permanecer UN DIA ENTERO con el PC apagado?? YO SI.. y no solo un dia :)

Correo de Confirmación de MS

Estaba intentando registrarme para un evento on-line de MS y como parte del proceso debia confirmar mi dirección de correo electrónico, para esto me enviaron el siguiente mensaje:



y por qué razón primero me piden que haga clic en el vinculo y a continuación me dicen que si lo hago no funcionará??

Y al final de toda la historia.. ninguna de las dos instrucciones funcionó :@:@:@

viernes, 28 de marzo de 2008

Google Code University

Recientemente (bueno, no tanto) salió a la luz un sitio llamado Google Code University, que tiene recursos interesantes sobre lenguajes (actualmente C++, Java y Python), AJAX, Seguridad en la Web, Aplicaciones distribuidas, MySQL y otras cosas.

Aunque al momento el material no es muy abundante, los temas que se incluyen son realmente interesantes y varios de ellos son bastante especializados. Vale la pena darle una mirada.

La direccion es http://code.google.com/edu/

Saludos

miércoles, 19 de marzo de 2008

[OT] Dia del Padre

Hoy 19 de marzo se celebra en mi país (Bolivia) el Día del Padre.

Este dia es muy especial para mí porque es la primera vez que puedo celebrarlo, pues en noviembre del año pasado nació Areli, mi primera hijita, que hoy cumple 3 meses, 3 semanas y 4 dias. Ella es el mejor regalo que Dios me pudo haber dado.

Quise compartir esta felicidad con ustedes, mis amigos lectores, y aprovecho para desear un "Feliz Dia del Padre" a todos los padres que visitan este blog, aunque hoy no se celebre el Dia del Padre en los diferentes paises :)

Aqui les dejo una foto donde aparezco con ella en un viaje que hicimos la semana pasada.
















saludos

martes, 18 de marzo de 2008

Incluir los métodos privados en las pruebas unitarias

Aunque existe un gran debate acerca de si se debe incluir o no los métodos privados en las pruebas unitarias, siempre es bueno disponer de alguna forma de hacerlo.

En este post les mostraré una sencilla forma de invocar métodos privados usando Reflection.

Implementaremos la clase PrivateMethodCaller asi:

public class PrivateMethodCaller
{
public static object Invoke(Type t, string methodName, object[] parameters)
{
MethodInfo mi = t.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);
return InvokeMethod(mi, null, parameters);
}

public static object Invoke(object instance, string methodName, object[] parameters)
{
MethodInfo mi = instance.GetType().GetMethod(methodName, BindingFlags.NonPublic|BindingFlags.Instance);
return InvokeMethod(mi, instance, parameters);
}

private static object InvokeMethod(MethodInfo mi, object instance, object[] parameters)
{
if (mi == null)
{
throw new InvalidOperationException("No se pudo encontrar el método");
}
return mi.Invoke(instance, parameters);
}
}

Nuestra clase contiene un solo método: Invoke que toma dos formas:

La primera acepta un parámetro tipo Type. Esta versión del método nos permite invocar métodos estáticos.

La segunda acepta un parámetro tipo object. Esta versión nos permite invocar métodos no estáticos.

Veamos ahora como usamos esta clase desde nuestras pruebas unitarias.

Crearemos una clase muy simple que nos servirá como ejemplo:

public class ClassUnderTest
{
private static int StaticMethod(int a, int b)
{
return a + b;
}
private int InstanceMethod(int a, int b)
{
return a + b;
}
}

Hemos definido dos métodos en nuestra clase de prueba. Uno estático y el otro de instancia.

Ahora veamos como implementamos nuestras pruebas unitarias usando NUnit:

[TestFixture]
public class PrivateMethodTests
{
[Test]
public void StaticMethodTest()
{
int res = (int)PrivateMethodCaller.Invoke(typeof(ClassUnderTest), "StaticMethod", new object[] { 1, 2 });
Assert.AreEqual(3, res);
}

[Test]
public void InstanceMethodTest()
{
int res = (int)PrivateMethodCaller.Invoke(new ClassUnderTest(), "InstanceMethod", new object[] { 4,5});
Assert.AreEqual(9, res);
}
}


Como podemos ver ya somos capaces de invocar los métodos privados y testear sus resultados.

Espero que esta información les sea de utilidad.

Saludos.


 


lunes, 25 de febrero de 2008

NHibernate.Timestamp != SQLServer.Timestamp

Al intentar utilizar el control de concurrencia, mediante las etiquetas <timestamp> o <version> de NHibernate junto con el tipo Timestamp de SQL Server, nos encontramos con un mensaje como este:

"Could not cast the value in field ts_times4_ to the Type TimestampType. Please check to make sure that the mapping is correct and that your DataProvider supports this Data Type."

debido a que el tipo Timestamp de SQL Server es recibido como un byte[] en el .NET Framework y no es compatible con los tipos que NHibernate usa para el control de las versiones. (Aunque la documentación de NHibernate diga lo contrario)

Luego de algunas horas intentando resolver este problema encontré un artículo en CodeProject q resuelve el problema.

http://www.codeproject.com/KB/dotnet/OptLocking_PrefixTable.aspx

Ojala les sea de utilidad

jueves, 21 de febrero de 2008

Herramientas para GMail en MSDN CodeGallery

Se publicó en MSDN CodeGallery una libreria de clases muy sencillas, pero q nos pueden ahorrar algún tiempo, que nos permiten integrar nuestras aplicaciones .NET con el excelente servicio de GMail.

Pueden descargar el código desde aqui

Saludos

martes, 19 de febrero de 2008

NHibernate: Intellisense para archivos de configuracion

Un tip para lograr soporte de Intellisense para los archivos de configuración y mapeo (mapping files) de NHibernate

Simplemente debemos copiar los archivos [NhibernateInstallDir]\src\NHibernate\*.xsd en:

[VSInstallDir]\Xml\Schemas -- si estamos usando VS2005, o

[VSInstallDir]\Common7\Packages\schemas\xml -- si aun estamos usando VS2003

Espero les sea de utilidad a la hora de escribir sus archivos xml a mano :)

lunes, 18 de febrero de 2008

Si existe: actualizar; si no: insertar

Comparto con ustedes un tip sobre BD que encontré aqui

A menudo necesitamos actualizar un registro existente en una tabla o insertarlo en caso de no existir. La forma mas simple de hacerlo es:

IF EXISTS(SELECT * FROM MiTabla WHERE MiLlave = 10) THEN
UPDATE MiTabla SET MiCampo = 100 WHERE MiLlave = 10
ELSE
INSERT INTO MiTabla (MiLlave, MiCampo) VALUES (10,100)

Este script funciona, sin embargo no es la forma más óptima de realizar esta operación, pues el motor de la BD realiza dos búsquedas en la tabla. Una para el SELECT y otra para el Update.

Una mejor forma de hacer esta operación es:

UPDATE MiTabla SET MiCampo = 100 WHERE MiLlave = 10
IF @@ROWCOUNT = 0 THEN
INSERT INTO MiTabla (MiLlave, MiCampo) VALUES (10,100)

Asi le ahorramos un poco de trabajo a nuestro servidor.

Saludos

viernes, 18 de enero de 2008

El codigo fuente del .NET Framework ya está disponible

Cumpliendo con su anuncio de octubre pasado, MS acaba de liberar el código fuente del .NET Framework como material de Referencia y Depuración.

Pueden encontrar el anuncio original aqui,

También se ha posteado una explicacion en profundidad de como configurar VS2008 para depurar el código aqui

Y finalmente una traducción a nuestro idioma aqui


Espero q esta información les sea de utilidad... y un FELIZ Y EXITOSO 2008 a todos <:D