2009-05-24

Visual Studio 2010 Beta 1: Primeras Impresiones

Como ya mencioné en el post anterior, luego de solucionar los problemas severos de performance causados por la combinación WPF + Aceleración de VMWare pude empezar a probar el Beta 1 de Visual Studio 2010.

Por alguna razón oscura que no llego a comprender, en MS decidieron que sería una buena opción hacer que Visual Studio utilice WPF en la capa de presentación.

La ventaja de esto es que la posibilidad de tener cientos y cientos de efectos, transiciones, menúes voladores y demas yerbas, mas la posibilidad de hacer sumamente extensible la UI del afamado IDE.

Pero todo esto viene con un precio... la performance. Si Visual Studio 2008 ya era pesado, la nueva versión salta una o dos categorías mas: iniciar el IDE, abrir una solución chica y compilarla se lleva nada mas y nada menos que 238MB de ram (mas 14MB del PresetantionFontCache).

Igualmente, estos valores y la performance presentada son indicadores que deben ser tomados con pinzas, ya que al ser el Beta 1, todavía queda un largo camino para dar lugar a optimizaciónes (las cuales espero, por el bien de mis VMs, que aparezcan!).

Otro problema que encontré (también atribuible al estado de Beta del producto) fue la cantidad de crashes que tuve. Durante el coding del ejemplo que dejé al final (una tarde) me habra crasheado unas 5 veces... bastante mas de lo tolerable. Esperemos que la estabilidad sea un punto importante a mejorar en la proxima Beta o RC


Cerrado este tema, pasemos a los "chiches" nuevos que trae:

.NET 4 (beta) y C# 4

Nueva version del CLR y del lenguaje estrella de la plataforma .NET. En este otro post (http://zpodblog.blogspot.com/2009/01/material-de-la-conferencia-sobre-c-4.html) pueden bajar una presentación que dimos con RodoF sobre los features nuevos incluidos en el lenguaje (tipado dinámico, parametros opcionales y por nombre, co y contra varianza en parametros de tipos, y algunas cosas mas).

F#

Esta versión de Visual Studio es la primera en incluir este lenguaje funcional para la plataforma .NET.
Debo decir que todavía no me puse a ver mucho sobre el mismo, pero será cuestion de encontrar una excusa suficientemente buena como para incluir alguna librería que tenga que hacer en F# para algún proyecto a futuro.
Por ahora los dejo con un bonito ejemplo de como obtener el n-esimo termino de la suceción de fibonacci (no puedo evitar caer en los clásicos) en F#:

let rec fibonacci elem =
match elem with
| 1 -> 1
| 2 -> 1
| n -> fibonacci (n - 1) + fibonacci (n - 2)

Printf.printf "Ingrese numero de termino: "
let termino = System.Console.ReadLine();

Printf.printfn "%i" (fibonacci (System.Int32.Parse termino))
let k = System.Console.ReadKey();

Parallel Extensions

Quienes hayan tenido que hacer optimizaciones en algún proyecto sabrán que uno de los primeros puntos a mirar es la paralelización de tareas independientes. Las Parallel Extensions vienen a simplificar este tipo de tareas.
Por ejemplo, en caso de tener una colección y querer aplicar una funcion a cada uno de los elementos, en vez de hacer un viejo y querido "foreach", podemos hacer:

miColeccion.AsParallel().ForAll(elem =>
{
//codigo a ejecutar por cada elemento de la colección
});

La gran ventaja de esto es que nos abstraemos de todo el manejo de concurrencia, manteniendo la ganancia de performance.

Sequence Diagram

Si hacemos click derecho sobre un método, vamos a notar que hay una nueva opción llamada "Generate Sequence Diagram". Al seleccionarla nos pregunta la profundidad máxima para las llamadas del diagrama y si queremos excluir las llamadas a clases dentro de ciertos namespaces (como System, u otros personalizables). Finalmente, nos presenta un diagrama como este:


Este es un feature sumamente útil en caso de tener que comprender lo que hace un código ajeno, sin tener que empezar a navegar todo el código! (y pensar que yo casi me hago una herramienta para generar estos diagramas... por suerte nunca prosperó!)

Definitivamente, una gran adición al Visual Studio.


Bueno, por ahora esto es lo que pude ver. Me queda pendiente el "Architecture View" y varios features mas que ni siquiera llegué a ver.

Como extra, dejo mi primer proyectito hecho en C# 4 que permite acceder datos provenientes de una conexión de ADO.NET levantando los campos como propiedades dinámicas del resultado y pudiendo aplicar un pipeline de filtros que hagan transformaciones sobre el resultado al ser obtenido.

La idea es poder hacer este tipo de cosas

using (var conn = new DynamicConnection(realADOConnection, new ImageMapper()))
{
dynamic result = conn.Query("SELECT * FROM Customer WHERE IdCustomer = @0", 37);
/* O tambien
dynamic result = conn.Query("SELECT * FROM Customer WHERE IdCustomer = @IdCustomer",
DynamicConnection.CreateParameter("@IdCustomer", 37));
*/

foreach (dynamic row in result) //recorrer el resultado con un foreach
{
//lectura directa
int id = row.IdCustomer;
string name = row.Name;

/*
Aca, el ImageMapper se encarga de leer el campo
y mapearlo a un Image
*/
      Image customerPicture = row.Picture;
grid.AddRow(id, name, customerPicture);
}

//Obtengo un solo valor
dynamic val = conn.QueryValue("SELECT TOP 1 Name FROM Customer WHERE Id = @0", 37);
MessageBox.Show(val);
}

Lo pueden bajar de aca: DynamicDataAccess


Hasta la próxima!
Z

Problemas de super-lentitud con la Beta 1 de Visual Studio 2010?

Bueno, en caso de estar trabajando con VMWare, posiblemente el problema sea que está activada la aceleración 3D en la VM.
Aparentemente este supuesto feature de VMWare tiene problemas para correr cosas hechas en WPF y dado que el nuevo Visual Studio 2010 lo usa extensivamente, la diferencia de velocidad es mayor a 100x una vez desactivada la "aceleración" (o, mejor dicho, desaceleración)
Ya mejorada la velocidad, con una VM de 2GB es bastante usable, aunque usa unas fuentes sospechosamente borrosas, como todo lo hecho con WPF.
En breve subo un post con las primeras impresiones del nuevo IDE de Microsoft y el primer proyectito no-charla (o al menos, no usado en una charla todavía) de C# 4.

Saludos!
Z

2009-05-17

MTGDeck Version 0.5

Paso a presentarles la primera version Beta (0.5) del MTGDeck!

Este programa/juego permite jugar al conocido juego de trading cards "Magic: The Gathering" desde la computadora a través de la red, sin la necesidad de comprar los no-tan-baratos set de cartas, pudiendo probar distintos mazos, combinaciones, estrategias, etc...

El juego esta separado en dos aplicaciones distintas:
- Servidor: programa encargado de almacenar la información de las manos de los jugadores y de comunicarlos entre si. El mismo puede servir varias partidas distintas y para jugar siempre será necesario acceso al servidor donde se aloje la partida a la cual se desea ingresar.
- Cliente: programa desde el cual - conectándose a un servidor - permite jugar partidas de Magic contra el resto de los jugadores conectados.


Que NO hace el programa:

- NO valida las (complicadas) reglas del juego y cada una de sus cartas. El propósito de este programa es el de reemplazar el set de cartas, y nada mas. El hecho de "jugar" propiamente dicho todavía queda a cargo de los humanos.

- NO permite jugar contra la computadora. El único modo de jugar solo es, simplemente, no tener contrincante.

- NO te va a ayudar a ganar minas (aceptémoslo, es un juego bien nerd)


Que SI hace el programa:

- Permite jugar desde uno (practica solo) hasta varios jugadores dentro de la misma partida

- Permite armar mazos, utilizar cualquier carta que haya existido para Magic: The Gathering, referenciándolas por su nombre en ingles
- ¡Te ahorra dinero! (¡no hoy que ir a comprar cartas!)
- ¡Te proporciona horas y horas de diversión nerd!

Requerimientos:
- Windows XP o superior con todos sus Service Packs.
- .NET Framework 3.5 con todos sus Service Packs.
- Algun tipo de conexión de red (y al menos la primera vez que se usa cada mazo, conexión a internet).

Info sobre el proyecto:
- UI hecha con .NET 3.5 en Winforms.
- Para la comunicación entre los clientes y el server se puede utilizar tanto un cliente/server de WCF funcionando con basicHttpBinding - proximamente esto será configurable - y otro cliente/server hecho con old-school Remoting.
Esto tiene dos motivos: por un lado, hay algunas computadoras en los cuales el server de WCF no funciona. Todavía no pude encontrar el problema, pero voy a seguir buscando. El otro motivo es que las librerías de Remoting en Mono estas mucho mas maduras que las de WCF y, pese a que todavía me topo con algunos errores del lado de Mono, pienso que dentro de poco voy a poder tener la app mas cross-platform (si me vuelvo suficientemente loco me pongo a hacer una interfaz nativa para Mac y todo!).
Por default, se utiliza el Client de WCF, pero esto se puede modificar por configuración (y ya que es levantado por reflection... ¡Pueden hacer sus propios clientes y servers en casa!)

FAQ:

- ¿De dónde bajo el juego?
Esta versión la pueden bajar de aca. El código fuente y las futuras versiones las podrán encontrar en el sitio de MTGDeck en Google Code

- ¿Cómo empiezo?
El paquete incluye un pequeño manual de usuario. Ahí esta toda la info necesaria para salir andando.

- Todo muy lindo pero... ¡Cómo armo mi mazo?
El formato del archivo de mazos es muy simple: cada línea tiene la cantidad de cartas de un tipo, seguida por el nombre de la carta. Las lineas que comienzan con "#" son ignoradas. Junto con el paquete se incluye un ejemplo.

Para armar mazos, recomiendo la siguiente página: http://www.essentialmagic.com/decks/

- ¡No puedo conectarme al servidor! ¿Qué pasa?
Posiblemente, el problema sea que el firewall de Windows (o algún otro) no este permitiendo conectarse al puerto 1234 (o el que esté configurado) en la computadora donde el servidor esté ejecutando. Para solucionarlo, habilitar el puerto en el firewall o desactivarlo por completo.
Durante las pruebas me ha ocurrido que hay máquinas donde el server indica que levantó correctamente, sin embargo es imposible conectarse, incluso desde la máquina local. Cuando tenga identificado este error y lo solucione, avisaré.

- Encontré un error. ¿Cómo lo reporto?
Pueden contactarse conmigo por twitter (http://twitter.com/pablozaiden), por mail o dejando un comentario en el blog.

- Me gustaría que el juego tuviese tal o cual feature. ¿Qué puedo hacer?
Nuevamente, podes contactarme por alguno de los medios nombrados anteriormente y si sos desarrollador podes contribuir con el desarrollo (proximamente)


A continuación dejo unos screenshots del juego en acción:



Saludos!
Z

2009-05-13

Pirata Informático

Hasta donde yo sabía, un pirata es una persona con pata de palo, un loro en el hombro, sed por los doblones y - eventualmente - con la habilidad de ganarle un duelo de insultos al Sword Master.

Por lo tanto, la pregunta que viene al caso es: por que los medios de comunicación se empeñan en llamar pirata a la gente que encuentra vulnerabilidades en sistemas de software o - mas bizarro aún - comparte música por internet?

2009-05-12

Primera reunion de ALT.NET Argentina

Tratando de mantener la vida del blog y siguiendo lo comentado en la lista de mails ALT.NET Argentina, vamos a hablar un poco de lo que fue la primera reunión del grupo

(para quien no sepa de que trata esto, puede darse una vuelta por: http://altdotnet.org/ y/o http://altnet-argentina.pbworks.com/ )

Pese a la no-tan-feliz combinación de día/horario para el inicio de esta reunión (sábado a las 9 de la mañana!) el ambiente era muy bueno: muchas caras conocidas - bastante mas dormidas que de costumbre - y muchas ganas por empezar las sesiones pensadas para el día.

A eso de las 10.00, nos fuimos presentando en ronda (no pude evitar tirar un chiste) y pasamos a contar que temas habían propuestos para las sesiones del día y arreglar entre todos los horarios y las salas de cada uno.

Independientemente del tema a tratar en cada una, se utilizó la modalidad de "open space", donde cada uno es libre de opinar y plantear su punto de vista cuando le parezca - siempre y cuando se haga de forma ordenada - y no las clásicas charlas con un orador y muchos escuchas.

Durante el día hubieron 4 franjas donde se llevaron a cabo sesiones simultáneas. En particular, voy a hacer una pequeña reseña sobre las cuatro donde yo participé:

(no recuerdo los nombres concretos, pero con el título de fantasía que puse se entiende)


1. SOA: ¿Vivo o muerto? ¿Cáncer o salvación?

En esta charla hubieron 4 a 6 sillas adelante, dándole al usuario de las mismas el derecho a hablar, siguiendo estas reglas:

- Siempre debe haber una silla vacía

- Si alguien quiere hablar, debe sentarse en una de esas sillas

- Si quedan todas las sillas ocupadas, deberá retirarse quien esté hace mas tiempo (o quien considere que ya no está aportando a la conversación, pero esto queda a criterio de cada uno)

La misma empezó comentando la experiencia de distintas personas que llevaron (o intentaron llevar a cabo) proyectos con arquitecturas que implementaban el patrón SOA y a raíz de esto, muchos - me incluyo - comentamos donde nos parecía que estaban las falencias usuales en este tipo de emprendimientos, cuales eran los beneficios, que costos se pagaban por intentar hacer SOA "porque es la palabra de moda" y cuando valía la pena realmente tener componentes de un proyecto que siguieran este patrón.


2. Microsoft... ¿Está innovando?

Este es un tema que propuso Miguel Angel Saez y, pese a que no mucha gente se prendió, me pareció un tópico sumamente interesante para tratar.

Acá charlamos sobre las alternativas a distintos problemas, viendo la forma - o formas - en que lo encaran Microsoft, otras empresas como Sun, Oracle, Amazon, Google, etc. y por último "la comunidad open source".

Para cada uno hablamos sobre cuanto de "inspiración" y cuanto de creatividad hubo en su creación y hacia donde veíamos el rumbo de evolución de cada una de estas tecnologías o productos.


Hacia el final de la sesión estuvimos hablando sobre Windows 7, su comparación con OS X (o inspiración en...) y cual grande - o pequeño - era el salto desde Windows Vista.


-- Pizza Break --

El almuerzo fue una gran sesión en si misma: todos hablando con todos sobre lo discutido en las sesiones anteriores, tratando de ver que nos perdimos y contando - mordisco de muzzarella de por medio - lo que aprendimos de los demás en las charlas que estuvimos.


Y sigue la tarde con...

3. YARF: Yet-Another-Rodo-Framework, o ¿Cuándo debo meter qué cosa?

Esta vez, pese a ser unos cuantos usamos la vieja y querida ronda para hablarnos entre todos y no tuvimos ningún problema.

Acá se charlo sobre para que tipos de desarrollo pensábamos que era mejor utilizar tal o cual framework o tecnología, o si - como algunos preferimos - hacernos el nuestro propio framework a media.

Hablamos de ventajas y desventajas de pensar necesidades a futuro, cuándo conviene reutilizar y cuándo conviene tirar lo que tenía y volver a pensar desde cero una mejor solución. Tocamos temas como la sobreingeniería de las soluciones planteadas, problemas con la división en capas (ya sea por defecto o por exceso) y varias cosas mas.


4. .NET hace monerías

La idea de esta charla fue hablar sobre las experiencias que hayamos tenido utilizando Mono (implementación Open Source de .NET) en distintas plataformas y poder contarles a los que nunca habían escuchado de este proyecto, o no lo habían probado, cual era el estado del mismo y que se podía o no hacer en comparación a .NET.

Durante la charla se mostró un poco de Mono en acción desde una maquina con Linux y mi Mac. Mostramos el REPL de csharp que viene incluido con Mono, explotando el hecho de que el compilador es provisto como "una librería mas". También vimos el plugin de Moonlight - implementación de Mono de Silverlight - corriendo dentro de Firefox en Linux y un pequeño vistazo a la IDE multiplataforma Monodevelop.


Bueno, con esto cierro el post de hoy. Si alguien quiere, pregunte sobre algún tema mas en particular de las sesiones y, de acordarme, con gusto responderé.

Saludos y hasta la próxima (donde pienso que subiré la primer versión beta del MTGDeck)!

Z

2009-05-10

Usando el MTGDeck para intentar devolverle la vida al blog

Hace unos 6 meses empecé otro de tantos proyectos que suelo dejar sin terminar... sin embargo el mismo tuvo su breve mención dentro del blog: MTGDeck

La idea de este proyectito era poder jugar al juego de trading cards Magic: The Gathering, sin la necesidad de tener las cartas (probar mazos, combinaciones, etc...).
Como implementar las 192381092381290 reglas que hay para cada carta de Magic era algo impensable, se me ocurró que la funcionalidad del juego sería únicamente la de suplantar las cartas (y mesa) del juego. Con esto quiero decir que el seguimiento de las vidas, cumplimiento de reglas, fases del juego, etc... seguirían a cargo de los jugadores.

Para permitir jugadas de mas de 2 jugadores, encaré el desarrollo de esta aplicación directamente como client-server, donde el server guardaría el estado de las manos y cartas jugadas de cada uno de los jugadores y el cliente simplemente le enviaría cuales son los cambios hecho en la mano propia.

Para desarrollarlo decidí - y no por casualidad - empezar por el server (ya que carece de ese cáncer que mucho conocemos como la interfaz gráfica).

No mucho tiempo después ya tenía listo el servidor... y ahí es cuando las cosas se pusieron feas: al empezar a desarrollar el cliente pude hacer un repositorio de cartas que se encargaba de traer la imagen de cada carta, un prototipo de lo que sería la mano de cada jugador... y perdí el interés.

Siempre lo mismo... en el momento que hay que hacer la UI mis proyectos caen a velocidades estrepitosas.

Sin embargo, hace unas semanas decidí que era hora de terminar lo que alguna vez empecé y pese a su no-del-todo-hermosa interfaz gráfica, el juego parece estar andando.

Actualmente, el proyecto está en las últimas fases del alpha-testing (gracias Krako!) y será liberado en breve a las masas!

Para que se vayan dando una idea, toda la comunicación esta manejada con WCF (actualmente usando BasicHttp), pero por las dudas también hice un conector basado en remoting, hecho a la old school.

La interfaz de usuario está hecha en Winforms, pero la idea es que, eventualmente, pueda ser portada a otras cosas (GTK#, WPF, Web... iPhone?) ya que los servicios que expone el server pueden ser consumidos desde todos los anteriormente nombrados.

Bueno, con esto cierro. Supongo que durante esta semana estaré poniendo la primer beta y veremos si tiene tanto éxito en Taringa como lo tuvo mi RapidshareDownloader (nota al pie: si alguien lo sigue usando, le recomiendo pasar a JDownloader que es mucho mas potente)

Saludos!
Z