Lilypie Primer PicLilypie Primer Ticker

martes, 20 de noviembre de 2007

Recursos adicionales que acompañan a VS2008

Junto con el lanzamiento de VS 2008 se liberaron muchos recursos adicionales que nos ayudarán a dar los primeros pasos en esta nueva plataforma.

Tenemos por ejemplo: Windows Vista P2P Toolkit, Free Game Developer Toolkit, Coding4Fun Developer Toolkit, Controles gratuitos, Host gratuito...y muchos otros.

Pueden encontrar una recopilación interesante en este post.

Espero les sea de utilidad, saludos

lunes, 19 de noviembre de 2007

Ya llegaron VS2008 y .NET Framework 3.5

Hoy fueron liberadas oficialmente las versiones RTM de estos dos productos. Aún no vienen en las tradicionales cajitas que podemos comprar en una tienda, pero podemos descargarlas desde varios sitios:

Si son suscriptores de MSDN pueden descargar el producto sin costo desde el sitio de msdn.

Si no son suscriptores:

* se puede bajar versiones de prueba de 90 dias de VS Team Suite aqui.
* Una versión de prueba de 90 días de Team Foundation System está disponible aqui.
* Una versión de prueba de 90 días de VS Professional estará disponible en los próximos dias.
* Las ediciones Express (gratuitas) están disponibles aqui.

y finalmente, si solamente quieren descargar el .NET framework 3.5, pueden encontrarlo aqui.

Espero les sirvan esos links, en los próximos les haré un resumen de las principales innovaciones que trae esta nueva versión.

El Training kit de Visual Studio 2008 y .NET Framework 3.5 ya está disponible

A partir de hoy está disponible el Training Kit de VS 2008 y .NET Framework 3.5. Es un archivo comprimido de poco más de 120 Mb que contiene presentaciones en PowerPoint, Demos y Labs.

Se puede descargar de aqui

Saludos

viernes, 16 de noviembre de 2007

Crónicas del Google CodeJam (Beta)

Ayer tuve la oportunidad de participar (con muy poco éxito O0o.:| ) en la primera prueba abierta al público del concurso de programación Google CodeJam, como les comenté aqui.

Les comento como funciona, haré una comparación con TopCoder, ya que es una plataforma de concursos bastante popular (en la que participo a veces), y era donde se llevaba a cabo el CodeJam los pasados años.

En pocas palabras: La mecánica del nuevo CodeJam es TOTALMENTE diferente a la de TopCoder, las principales diferencias son:

  1. TopCoder está basado en un Applet de Java que debe ser instalado en nuestro equipo. CodeJam está basado totalmente en el navegador.
  2. TopCoder pone estrictos límites en cuanto a los lenguajes de programación que se pueden usar (Normalmente C++, C#, VB.NET y Java. También se admitía Python únicamente para los CodeJams). El nuevo CodeJam no pone restricción alguna. Los participantes pueden usar el lenguaje que prefieran, desde assembler hasta SQL :) ya les explicaré como esto es posible.
  3. En TopCoder y en otros sitios de concursos como el de la UVA, se debe enviar el código fuente. En el nuevo CodeJam NO se envia ningún código. De ahi que es posible usar cualquier lenguaje de programación.
  4. En TopCoder el tiempo empieza a correr cuando el participante abre un problema para verlo. En CodeJam el tiempo empieza a correr a partir de la hora fijada para el inicio del concurso.
  5. En TopCoder se tiene la opción de ver el código de otros participantes y eventualmente desafiar aquellos que parezcan incorrectos, ganando (o perdiendo) puntos por ello. En CodeJam esto no es posible, ya que, como ya dije, no se envía ningún código.


Ahora les cuento como funciona este nuevo CodeJam:


Solamente se necesita un navegador web, no applets, addins, ActiveX, ni nada. Solo el navegador. Se ingresa al sitio del concurso a la hora fijada (ayer fue a las 6.00PM PST, 10 de la noche en mi país (-4.00 UTC)) e inmediatamente se pueden ver los problemas. Ayer fueron 4 problemas de algoritmos de diferentes niveles de dificultad, y obviamente de diferentes puntajes. El tiempo de la competencia fue de 2 horas. (Para entonces ya tenia mucho sueño :O)

El tiempo empieza a correr a partir de la hora de inicio del concurso, y pueden visualizarse todos los problemas al mismo tiempo. A mi parecer esto beneficia a quienes participan en grupo, perjudicando a los participantes individuales. Mientas mas grande el grupo, mas ventajas. En TopCoder los participante los individuales tenemos un poco más de oportunidad.

Ahora si, vamos al corazón del asunto: Una vez visto y analizado el problema, tenemos la opción de resolverlo en cualquier lenguaje de programación, usando cualquier herramienta de desarrollo. No existe ninguna restricción.

Básicamente nuestro programa deberá leer un archivo de texto, realizar algun proceso, y generar un archivo de salida.

Les comento un problema del concurso de ayer a manera de ejemplo: Se trataba sobre sistemas de numeración, y básicamente se pedía: Dado un número N expresado en Base-X convertirlo a Base-Y. Las bases podían contener números, letras, símbolos, etc.

Entonces nuestro programa debía leer un archivo parecido a este:

100
9 0123456789 oF8
Foo oF8 0123456789
13 0123456789abcdef 01
CODE O!CDE? A?JM!.

........

La primera línea nos indica el número de entradas que tiene el archivo. 100, en este caso. Las lineas sucesivas son de la forma:

[N] [Base-X] [Base-Y]

Entonces nuestro programa deberá recorrer todas las entradas del archivo, convertir N expresado en BaseX a BaseY, e ir generando un archivo de salida parecido a este:

Case #1: Foo
Case #2: 9
Case #3: 10011
Case #4: JAM!
Case #5: I%`jEEa
Case #6: *LAs969

........

Una vez que hemos leído, analizado codificado y probado nuestro programa, deberemos bajar el archivo de entrada. A partir de ese momento tenemos un corto tiempo para enviar el archivo de salida.

Existen dos tipo de archivos de entrada para cada problema:

1. Archivos de entrada Pequeños

Típicamente 100 entradas.

Tenemos 4 minutos para enviar la solución.

Somos informados inmediatamente si nuestra solución fue considerada correcta o no.

Normalmente tiene un puntaje menor que los archivos de entrada grandes.

2. Archivos de entrada Grandes

Contienen 1000, 10000 o más entradas

Tenemos 8 minutos para enviar la solución

Solo se evalúa nuestra solución al final del concurso.

Normalmente tienen un puntaje mayor que los archivos de entrada pequeños.

Si nuestra solución no fue correcta, tenemos la opción de bajar otro archivo de entrada y enviar la nueva solución. Si esto ocurre somos penalizados con 240 segundos. El tiempo es importante en caso empate.

Existe un foro dedicado al concurso aqui

Así es entonces como funciona el nuevo CodeJam de Google. habrá que esperar las versiones definitivas para seguir participando.

miércoles, 14 de noviembre de 2007

Google CodeJam (Beta)

Recien me enteré de que Google está cambiando la modalidad de su famoso concurso de programación CodeJam. En los pasados años, CodeJam era desarrollado por TopCoder, pero a partir de este año, será Google mismo quien operativice el concurso.

Mañana Jueves 15 se desarrollará por primera vez una prueba beta abierta al público, valdría la pena inscribirse.

Se ofrecen cupones de Google Store para los 3 primeros lugares y poleras para los primeros 200.

En el formulario de registro, se les pregunta a los participantes el país de residencia, pero solo aparecen Estados Unidos y Canadá, por lo que seguramente, si llego a ganar una polera, no me la podrán hacer llegar hasta Bolivia :-(.

De todas formas estoy muy entusiasmado con participar en esto.

Pueden inscribirse aqui

martes, 13 de noviembre de 2007

Por fin llegó la quinta estrella!

Luego de muchos meses de espera, finalmente está disponible la quinta estrella del programa  Desarrollador Cinco Estrellas.

Para lograr la quinta estrella se requieren aprobar 4 exámenes: el primero es sobre ASP.NET y AJAX, el segundo sobre arquitectura, el tercero sobre WCF y el último sobre WWF.

Los materiales vienen en videos, lo que personalmente no me gusta, hubiera preferido pdfs. No pude ver los videos usando Firefox, pero no tuve problemas con Internet Explorer.

Entre los incentivos, MS ofrece un diploma impreso que será enviado por correo a todos los que logren la quinta estrella. También se ofrece una invitación para el lanzamiento de VS 2008 en cada país.

Y al primero en lograr la quinta estrella se le obsequiará una cámara web de MS. Por lo que pude ver, ya hay dos personas que tienen la quinta estrella, asi que parece ser un poco tarde para optar por ese premio :).

Finalmente, la quinta estrella no es la cima del mundo, sino que una vez alcanzada, podemos optar por tomar 3 cursos adicionales para convertirnos en Desarrolladores Gold, o 6 cursos adicionales para ser Desarrolladores Platinum. Los 15 primeros desarrolladores que alcancen el nivel Platinum serán entrevistados por MSDN.

Esas son las novedades, visiten www.dce2005.com, vean los materiales y empiecen a rendir los exámenes.

 

Exitos

C# 3.0: Variables locales implícitamente tipadas

Una innovación interesante de la versión 3 de C# es la posibilidad de que el programador quede liberado de definir el tipo de dato de cada variable dejando a criterio del compilador el inferir el tipo de la variable, en base al valor a que se inicialice la variable.

Asi por ejemplo si inicializamos una variable x con el valor 1 (uno), resulta obvio que x es una variable de tipo int. O si inicializamos y con el valor "Hola mundo", es posible afirmar que y es del tipo string. Entonces es posible que el compilador determine (infiera) el tipo de la variable que estamos declarando, liberándonos de esta tarea.

C# 3 incluye la palabra reservada var que le indica al compilador que debe inferir el tipo de la variable que estamos declarando. Por ejemplo, a partir de la instrucción:

var x = 1;
var y
= "Hola mundo";

el compilador puede inferir que x es de tipo int. y que la variable y es del tipo string.

Es un error pensar que var declare una variable tipo Variant, es decir, una variable que puede cambiar su tipo dinámicamente. var simplemente nos evita tener que especificar el tipo de una variable al momento de declararla. Para el CLR cada variable tiene un y solo un tipo de dato, por tanto, el siguiente código no compila:

var x = 1;
x
= "Hola"; // Esta linea no compila

porque el compilador determinó que x es del tipo int, por lo que es ilegal asignarle un valor del tipo string.

El valor de inicialización es obligatorio cuando se declara una variable con var, asi el siguiente código no compila:

var x; // Esta linea no compila

porque el compilador necesita un valor a partir del cual pueda inferir el tipo de dato.


También es posible inferir el tipo de los arrays usando var, asi:

var numeros = new[] {1,2,3};

a partir de new[], el compilador sabe que estamos declarando un Array, y a partir de la lista de valores puede determinar el tipo de sus elementos.

Finalmente var también puede ser usada para declarar tipos complejos como listas o diccionarios, asi:

var lista = new List<int>();
var diccionario
= new Dictionary<int, string>();

lunes, 12 de noviembre de 2007

.NET Framework 3: Expresiones de inicialización de Objetos

Otra sencilla pero muy útil innovación del .NET Framework 3.0 son las expresiones de inicialización de objetos.

Si, por ejempo, tenemos la clase Persona con las propiedades Código, Nombre, FechaDeNacimiento y Estado, y queremos inicializar sus propiedades al momento de instanciarla, estábamos obigados a crear un constructor como este:

public Persona(int codigo, string nombre,
DateTime fechaDeNacimiento,
int estado)
{
this.Codigo = codigo;
this.Nombre = nombre;
this.FechaDeNacimiento = fechaDeNacimiento;
this.Estado = estado;
}

Entonces teniamos la posibilidad de invocar al constructor asi:


Persona p = new Persona(10, "Juan Perez",
new
DateTime(1980, 12, 10), 1);


con lo que la instancia es creada y sus propiedades inicializadas.

Ahora, con la versión 3 del .NET Framework tenemos la posibilidad de usar una forma alternativa que nos evita tener que implementar un constructor como el anterior. Esta nueva funcionalidad se implementa mediante las Expresiones de Inicialización de Objetos, que toman la siguiente forma:


Persona p = new Persona { Codigo=10,
Nombre
="Juan Perez", Estado=1 };


Es importante notar que nuestra clase debe implementar un constructor sin parámetros.

viernes, 9 de noviembre de 2007

Innovaciones del .NET Framework 3: Propiedades implementadas automáticamente

Otra innovación del .NET Framework 3 es la posibilidad de implementar automáticamente las propiedades, reduciendo la cantidad de código que debemos escribir.

En muchos casos implementamos propiedades triviales asi:

private string telefono;

public string Telefono
{
get { return telefono; }
set { telefono = value; }
}

En este caso get y set tienen implementaciones triviales, ya que get simplemente devuelve el valor de telefono y set asigna el valor recibido en value al campo telefono. Antes estábamos obligados a 1) declarar un campo privado telefono, 2) implementar get y set a mano.

Ahora, el .NET Framework 3 nos ahorra todo ese trabajo, ya que podemos reemplazar todo el código anterior por:

public string Telefono { get; set;}

Ya no tenemos la necesidad de declarar un campo privado ni de implementar get y set.

También tenemos la posibilidad de utilizar modificadores como private para get y set, asi:

public string Telefono { get; private set;}

Asi logramos tener una propiedad de solo lectura.

Esta sencilla innovación nos evita mucho del trabajo repetitivo, y nos permite concentrarnos en la implementación de aquellas propiedades que sí requieren procedimientos más complejos. Una característica muy bienvenida.


jueves, 8 de noviembre de 2007

.NET Framework 3: Extension Methods

Una innovación interesante de la versión 3.0 del .NET Framework son los denominados Extension Methods.

Para entender el concepto, tomemos la clase System.String. Esta clase tiene una gran cantidad de métodos que nos permiten realizar muchas operaciones sobre las cadenas. Sin embargo, en ocasiones he necesitado invertir una cadena, y después de escarbar por un buen rato, tuve que aceptar resignado que esta clase no implementa un método que permita realizar esta operación.

Analicemos un par de alternativas para solucionar este problema.

1. Crear una clase derivada de String e implementar un método Reverse() en ella. Esta opción no es viable en este caso concreto porque la clase String está sellada (sealed) por lo que no admite clases derivadas.

2. Implementar una biblioteca que incluya un método ReverseString y pasarle la cadena como parámetro, asi:

public class MyLib
{
public static string ReverseString(string s)
{
// el código aqui.
}
}

Entonces invocaríamos al método de esta manera:

string rev = MyLib.ReverseString("Cadena a invertir"');

Esta alternativa cumple con el propósito, pero es algo incómoda de usar, sería mucho más conveniente contar con el método Reverse() implementado directamente en la clase String.

Aqui es donde los Extension Methods hacen su aparición, ya que permiten añadir funcionalidades a un tipo existente del CLR sin necesidad de crear una clase derivada ni de recompilar el tipo original. Entonces un Extension Method nos permitiría hacer una llamada como esta:

string rev = miCadena.Reverse();

o incluso:
string rev = "Cadena a invertir".Reverse();
Veamos entonces como se implementa un Extension Method:

public static class MisExtensiones
{
public static string Reverse(this string s)
{
string buffer = "";
foreach (char c in s.ToCharArray())
{
buffer
= c.ToString() + buffer;
}
return buffer;
}
}

Este código nos permite hacer algunas precisiones respecto a la forma de implementar los Extension Methods:

  • Deben ser definidos dentro de una clase estática.
  • Deben ser declarados estáticos.
  • Toman como parámetro el tipo que se quiere extender precedido de la palabra reservada this.

Nada más, cumpliendo esos pocos requisitos podemos extender cualquier clase del .NET Framework.

Veamos un ejemplo interesante, tomado del este post del blog de ScottGu:


public static bool In(this object o, IEnumerable c)
{
foreach (object i in c)
{
if (i.Equals(o))
{
return true;
}
}
return false;
}

Este método extiende la clase Object y nos permite saber si un objeto está contenido dentro de una colección. Invocamos el método asi:

bool isInArray = miObjeto.In(miColeccion);

Lo más interesante es que al extender una clase, la nueva funcionalidad también estará disponible en todas sus clases derivadas. Entonces al aplicar esta técnica en las clases base adecuadas, podremos extender el .NET Framework de forma limpia, ordenada y transparente.

miércoles, 7 de noviembre de 2007

A registrar minombre@live.com

Desde ayer ya podemos crear cuentas de correo con el dominio @live.com. Hay que apurarse porque los nombres cortos se terminan rapido, y en lugar de marcos@live.com tendremos que conformarnos con algo como marcost34.t25@live.com :D:D


La página en que pueden crear su(s) cuenta(s) es esta.

Saludos.

Linq: Nunca es tarde para aprender

Sin duda, debería haberme subido al tren de Linq hace muchísimo tiempo pero mas vale tarde que nunca. Hoy me propongo iniciar mi aprendizaje de Linq, y estaré posteando a diario mis avances, con la esperanza de que lo que escriba aquí le sea útil a alguien que, aunque tarde como yo, quiere iniciarse en esta tecnología.

Estoy usando el libro "Linq for Visual C# 2005" de Fabio Claudio Ferracchiati, un libro de poco más de 170 páginas, que nos servirá por lo menos para dominar los rudimentos, para luego pasar a cosas más avanzadas.

Primero lo primero: Necesitamos datos que podamos consultar.


Linq puede consultar datos de diversas fuentes como objetos en memoria (Linq to Objects), bases de datos SQL, Ficheros XML entre otros. Empezaré usando Linq To Objects hasta dominar la sintaxis y luego (pronto, espero) pasaré a experimentar con las otras fuentes de datos.


Empecemos definiendo una sencilla clase Persona:


public class Persona
{
private
int id;

private
int idRol;

private
string apellido;

private
string nombre;

public string Apellido
{
get { return apellido; }
set { apellido = value; }
}

public string Nombre
{

get { return nombre; }

set { nombre = value; }

}

public
int IdRol
{

get { return idRol; }

set { idRol = value; }

}

public int Id
{
get { return id; }
set { id = value; }
}

public Persona(int id, int idRol, string apellido, string nombre)
{
this.Id = id;
this.IdRol = idRol;
this.Apellido = apellido;
this.Nombre = nombre;
}

}

Posteriormente extenderemos esta clase y añadiremos otras, pero por el momento nos sirve tal cual está.

Para que nuestros objetos puedan ser consultados mediante Linq, deben implementar la interface IEnumerable, por lo que podemos crear una lista de Personas y aprovechamos para poblarla con algunos elementos:

personas= new List<Persona>();
personas.Add(new Persona(1, 1, "Anderson", "Brad"));
personas.Add(new Persona(2, 2, "Gray", "Tom"));
personas.Add(new Persona(3, 2, "Perez", "Juan"));
personas.Add(new Persona(3, 3, "Morales", "Pedro"));


Ya estamos listos para empezar a consultar los datos usando Linq. Una consulta realmente simple es:

var query = from p
in personas
select
p;

Hay mucho que explicar en esta simple consulta.

  1. var: El .NET Framework incluye un nuevo tipo de datos denominado var, que significa Variant. Es una variable local implícitamente tipada, o sea que adopta un tipo determinado de acuerdo al contexto.
  2. from p in personas select p: Si manejamos SQL notaremos la similitud inmediatamente, pues en SQL escribiríamos SELECT * FROM Personas. En Linq primeramente especificamos a (o las) fuentes de las que extraeremos nuestros datos, en este caso "personas" que es una lista. En algún lugar leí que se decidió poner el datasource (la claúsula from) en primer lugar (a diferencia de SQL) con el fin de dar soporte a cosas tales como IntelliSense, imagino que también existen otras razones. La variable "p" representa un objeto dentro de la colección "personas".
  3. Select p: Esta claúsula equivale a SELECT * de SQL, es decir: "Recuperar todos los campos".

Asi de fácil, con esas 3 lineas, obtenemos todos los elementos de la colección personas y asignamos el resultado a la variable query.

Podemos ver los resultados de nuestra consulta asignando la variable query que hemos obtenido a un bindingSource, asi:

bindingSource1.DataSource = query;

entonces podremos visualizar inmediatamente los resultados en un DataGridView, por ejemplo. No olvidar fijar la propiedad AutoGenerateColumns a true.

Un par de consultas más, a manera de ejemplo:

var query = from p
in personas

select new { p.Apellido, p.Nombre};

Esta consulta nos permite seleccionar únicamente los campos que nos interesan, en este caso, el apellido y el nombre.

Por último,

var query = from p
in
personas
where p.Id == 1
select new { p.Apellido, p.Nombre };

Como se puede suponer, la cláusula where nos permite seleccionar únicamente aquellos elementos que cumplen una determinada condición. Podemos utilizar cualquier combinación de expresiones booleanas que el .NET framework nos permita, eso nos permitirá construir consultas muy complejas.

Hasta aquí llegamos con esta breve introducción.

martes, 6 de noviembre de 2007

Visual Studio 2008 se lanza a finales de noviembre

Pues si... En el evento de Microsoft TechEd Developers 2007 en Barcelona se anunció que Visual Studio 2008 y la versión 3.5 del .NET Framework estarán disponibles a finales de este mes. Algunos meses antes de la fecha inicialmente fijada que era febrero 2008.

Asi que ya no falta mucho para tener entre nosotros la version final de esta herramienta. Es de esperar de MS prepare alguna promoción como la que se hizo en el programa Desarrollador cinco estrellas cuando VS 2005 fue lanzado, lo que nos permitió a muchos desarrolladores contar con el programa en forma totalmente gratuita. Habrá que estar atentos a ver que noticias nos tienen.

Saludos.