Unity 1.1 is out

by cristian 18/05/2008 13:07:33

Bien, continuando con la línea de código nuevo tenemos que luego de la EntLib4 también nuestro amigo Unity tiene un nuevo update, la versión 1.1. Entre los cambios importantes tenemos:

  • Se eliminan dependencias no necesarias de ObjectBuilder
  • Un par de bugs eliminados
  • Mejoras en performance en singletons
  • Algunas clases internas se volvieron publicas
  • Mejores mensajes de error correspondientes a resolución de clases.

Noticias más detallas aquí, y el download aquí

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , , ,

.net | entlib | news | programming

Enterprise Library 4.0 is out!

by cristian 16/05/2008 20:04:45

Yep, oficialmente ya salió al aire la última versión de la Enterprise Library 4.0... Mejor integración con terceros componentes y Unity son solamente una de las muchas mejoras en esta release... Vamos! bájenla mientras aún está recien salidita del horno! (download it!)

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

.net | news | programming | entlib

Ya esta el beta de .Net 3.5 Service Pack 1

by cristian 12/05/2008 13:37:50

Si, aunque algunos sentimos que la 3.5 "acaba" de salir, ya salió al aire el primer beta de la Framework 3.5, muchos sabemos que el primer beta esta muy lejos de estar listo para producción, así que al menos que tengan listo una máquina virtual para jugar con el pueden bajarlo de inmediato!

Algunas de las mejoras en resumen tanto para Visual Studio y la Framework:

  • Mejoras en el designer de ASP.net
  • Scaffolding!!!! (si, CRUD pages casí que automáticas! -ala ror-)
  • Routing Engine (nuevamente a lo Paste, importante en MVC)
  • Soporte Back/Forward en AJAX
  • El designer de ASP.Net ahora soporta ASP clásico (eh???)
  • Mejoras en ClickOnce
  • Nuevos controles en Windows Forms
  • Mejoras en el designer de WPF
  • WPF y DirectX viven mucho mejor y se aprovechan uno al otro
  • XAML runtime debugging
  • Soporte para SQL 2008
  • ADO.Net Entity Framework
  • ADO.Net Data Services (Astoria)
  • Mejoras en WCF

Bien, estas son algunas de las mejoras a groso modo, mejor explicaditos esta en el blog de Scott Guthrie. Bien ahora a jugar con la Framework!!!

Technorati Tags: ,
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Actualmente calificado con 4.0 por 1 personas

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

.net | news | programming

WCSF y PageFlow

by cristian 24/04/2008 2:08:46

Quienes recuerdan la WCSF antes del release 2.0 sabran que antes era realmente fácil implementar cambios y transiciones entre páginas usando la PageFlow Guidance Package que a su vez usaba Workflow Foundation para manejar a forma de diagramas de transición de estado el movimimento y transición entre páginas. Personalmente fui uno de esos usuarios que extrañé de sobre manera el PageFlow Guidance. El 22 de abril se hizo presente el PageFlow Guidance Package en las Extensiones a la WCSF y su código junto con ejemplos de uso estan ahora en el repositorio de la WCSFContrib en CodePlex.

A modo de review corto una de las mejoras en esta nueva versión es la posibilidad de usar el PageFlow sin necesidad de la WCSF y sin utilizar o necesitar Workflow Foundation además de, claro, soportar Visual Studio 2008.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , ,

.net | news | programming

xUnit 1.0 ya en RTM!!!

by cristian 23/04/2008 7:38:12

Aquellos fanáticos de TDD y developers de .Net conocen de sobra a nuestro amigo NUnit, bueno, no se si sabian pero los mismos creadores originales de NUnit trabajan desde hace buen rato en CodePlex, al mismo tiempo aprendiendo de errores de diseño en NUnit decidieron implementar una nueva generación de Unit Tester y a este le nombraron xUnit. Lo interesante es que ya xUnit 1.0 salió a RTM y puede ser bajado de http://www.codeplex.com/xunit

Personalmente, junto con NUnit, xUnit se ha convertido poco a poco en una de mis favoritas, y si a esto le sumamos el soporte para R# y Test.Run tenemos la combinación perfecta en el momento de uso. Claro, en el caso de NUnit no se han quedado atrás lanzando ya la primera alpha de NUnit 2.5 la cual ya perfila impresionantes cambios en el mundo del TDD.

Bien, afilen sus teclados y a testing!!!

Technorati Tags: ,,,,
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , , ,

.net | programming | news | tdd

Clases y estructuras bien formadas, Parte III

by cristian 21/04/2008 4:41:17

Puff, teníamos tiempo no conversábamos sobre este tema. La última vez que hablamos de estructuras y clases bien formadas fue para implementar operadores binarios simples. Hoy expandiremos un poco más la conversación y seguiremos hablando de operadores en clases. Hablaremos hoy sobre operadores unarios y operadores lógicos.

Operadores Unarios

Quién no recordará la expresión variable++ ó ++variable, para aquellos que por alguna razón olvidaron la diferencia, el operador variable++ especifica que a la variable se le agregará una unidad después de que su valor sea obtenido y ++variable indica que a la variable se le añadirá una unidad antes de que su valor sea obtenido. La mejor forma de ver la diferencia es de la siguiente manera:

   1: using System;
   2:  
   3: public class TestValues
   4: {
   5:     public static void Main(string[] args)
   6:     {
   7:         int a = 1;
   8:         int b = a++;
   9:         int c = ++a;
  10:         Console.WriteLine("a: {0} b: {1} c: {2}", a, b, c);
  11:     }
  12: }

Ahora clara la diferencia verdad?, bien, vamos a intentar lo mismo para el overload del operador unario complex++ en nuestra clase para números complejos, imaginemos que esto representaría el equivalente a sumar un número complejo mas 1+0i, tomando esto en cuenta modificamos nuestra clase y nuestra unidad de pruebas:

   1: [Test]
   2: public void TestUnaryAddOperator()
   3: {
   4:     Complex cplx = new Complex(4,2);
   5:     Complex cplxPost = cplx++; // debería ser 4,2
   6:     Complex cplxPre = ++cplx; // debería ser 6,2 == cplx01
   7:  
   8:     Assert.That(cplxPost.RealPart, Is.EqualTo(4));
   9:     Assert.That(cplxPre.RealPart, Is.EqualTo(6));
  10:     Assert.That(cplx.RealPart, Is.EqualTo(6));
  11: }

Ahora definimos el operador en la clase:

   1: class ComplexNumber
   2: {
   3:     // Todas las definiciones anteriores van aquí
   4:     public static Complex operator++(Complex baseCplx)
   5:     {
   6:         return AddComplex(baseCplx, new Complex(1,0));
   7:     }
   8: }

Alguien preguntará, cómo es posible definir un pre/post operador unario con un sólo operador y no modificar el la clase que llama al mismo tiempo? Este es un comportamiento que desconcertará a los programadores de C++ a simple vista (si es usted programador C++ sabrá de lo que le hablo). El secreto está en que el compilador crea "copias temporales" del objeto y en base a eso las asigna, la belleza de todo esto es que con un sólo operador implementamos tanto la forma prefija como la postfija. Interesante no? además si usted recuerda a nuestro amigo C++ sabrá que modificar this en ese momento no es muy llamativo.

Operadores de Casting

Bien, alguien ya a estas alturas habrá dicho "hey, y no sería más fácil hacer algo como (4+5i) + 1 = (5+5i) siendo 1 automáticamente el equivalente a 1+0i????", bien, este precavido lector tiene toda la razón del porqué preguntar, si tiene mayor sentido y si se puede lograr, de hecho en la .Net a esto se les llama operadores de casting. Antes de proseguir creo que es importante hacer notar que existen dos tipos de casting, el implícito y el explícito.

Los operadores implícitos de conversión son aquellos que no necesitan ser "casteados" en el código, por ejemplo, convertir un entero a un número real, sin embargo si queremos convertir un número real a un entero debemos explícitamente decirle que el resultado será un entero, a esto le llamamos conversión explícita. Creo que esto se debe a que las operaciones implícitas de conversión nunca deben producir una excepción y en las explícitas esto está permitido, en el caso de un entero a un real asumimos que siempre hay espacio en la data que contiene un entero para que "entre" un real, sin embargo puede ser que el número real sea más grande que la capacidad de un entero. Vamos comprendiendo?

Bien, para demostrar nuestro punto asumimos un comportamiento similar, diremos que se puede implícitamente castear un entero a un número complejo pero necesitamos explícitamente castear el número complejo a un número entero. Asumiendo que un número entero es equivalente a num + 0i entonces pasamos a representarlo en una prueba:

   1: [Test]
   2: public void TestImplicitIntComplexCasting()
   3: {
   4:     Complex cplx = 1;
   5:  
   6:     Assert.That(cplx.RealPart, Is.EqualTo(1));
   7:     Assert.That(cplx.ImaginaryPart, Is.EqualTo(0));
   8: }

Tomando en cuenta que al transformar un número complejo a un número entero es igual a la raiz cuadrada de la suma de las dos partes cuadradas (imaginaria y real). Para simplificar nuestro ejemplo tomaremos en cuenta que solo podremos castear de Complex a un número real (double).

   1: public static implicit operator ComplexNumber(int num)
   2: {
   3:     return new ComplexNumber(num, 0);
   4: }
   5:  
   6: public static explicit operator double(Complex cplx)
   7: {
   8:     return Math.Sqrt(Math.Pow(cplx.RealPart, 2) + Math.Pow(cplx.ImaginaryPart, 2));
   9: }

Ahora probamos y todo debe funcionar fantásticamente. Recuerden, debemos crear overloading de operadores para solo aquellas clases que las necesitan, o sea, todo esto tiene sentido si en su dominio tiene sentido hacer tales operaciones matemáticas y queremos simplificarlo de esta forma, de otra manera NO sobrecarguen operadores.

Operadores Unarios Permitidos

A diferencia de C++, en C# no se pueden crear operadores unarios o binarios "nuevos" (crear operadores es una práctica bastante común en bases de datos como PostgreSQL por ejemplo). Estamos restringidos a los operadores siguientes:

Unarios Binarios
+ +
- -
! *
~ /
++ %
-- &
true |
false ^
  <<
  >>
  ==, !=
  >, <
  >=, <=

Los únicos unarios que nos hacen falta son los booleanos lógicos, los cuales junto con los operadores de comparación veremos en la siguiente parte, esta vez espero tenerla lista pronto. Hasta entonces me despido! Como siempre cualquier duda están a sólo un par de correos de distancia.

Technorati Tags: ,,
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Actualmente calificado con 4.0 por 2 personas

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

.net | programming

Confiar en el API? en la documentación? en el programador?

by cristian 08/04/2008 6:52:00

Hoy es de esos posts de desahogo, hace un par de semanas comenzamos un proyecto nuevo en la oficina, algo "nuevo", luego de un tiempo llegamos al punto en qué teníamos que hacer lectura asincrónica de la salida de otro proceso, bueno, debido a que me encanta la programación asincrónica (o sea usando threads), me ofrecí para llevarlo acabo. El primer día hice todas las pruebas respectivas y el código con "crosscuting concerns", pero luego de un par de pruebas, pufff... no funcionaba como se "esperaba". Pasé alrededor de tres días buscando toda la info posible, probando todo lo existente alrededor, preguntando, y porqué no, aprendiendo que podía tener malo. Luego de tres días me entró la curiosidad y lo probé con otro proceso, adivinen que... desde el comienzo estaba todo bien, el culpable era el primer proceso que "decidió" que era mejor usar una buffered output, bien, luego pasé otro día conversando por IRC con los creadores de este primer proceso buscando la forma de sobrellevar el problema y para variar (algo común el mundo OpenSource), no tenian idea que podía hacer para sobrellevarlo. Bien, por último se me ocurrió probar a otras implementaciones similares buscando como pudieron ellos sobrellevarlo, al final la triste verdad, ellos tampoco pudieron resolver tal situación. Claro, después de varios días llego a la sopresa que al final después de varias líneas de código se pudo resolver.

Esto me lleva a un nuevo Fact: Si estas seguro que esta bien lo que haces, pruébalo y héchale la culpa a la otra implementación :P

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

personal | programming

CacheMan, un caché distribuido para Windows...

by cristian 03/04/2008 4:46:00

Quién haya trabajado en aplicaciones de alto desempeño (sea web, Cliente/Servidor o cual sea la moda actual), sabe del valor irremplazable del caché; caché en la DAL, caché en lógica de negocio, caché en la capa de vista, en fin, caché everywhere. Uno de mis amigos en las jornadas de caché es por supuesto la Caching Application Block de la Enterprise Library, el problema con la CAB es el uso restringido del caché a local, si, ya sé que la EntLib 4.0 (que por cierto a estas alturas ya salieron las primeras CTP :D) permitirá la creación de caché no local, pero ese no es el post.

Otra forma de caché es el distribuido, donde la información se guarda en una red de servers de caché (generalmente en memoria) y por lo tanto más instancias pueden consumir el mismo caché. Uno de mis amigos en las jornadas de caching ha sido Memcache, un sistema de código abierto de caché distribuido hecho por Danga Interactive en lenguaje C y con muchas librerías cliente (entre ellas para C#).

Me topo con un proyecto nuevo, CacheMan, un caché distribuído realizado en C# por Sriram Krishnam. Al parecer es en cierta manera compatible con Memcache (o por lo menos puede hacerse compatible con el protocolo de Memcache sin mucho esfuerzo). Luego de probarlo he quedado feliz de cuán bien se comporta y de lo bien que trabaja bajo Windows Server (Memcache suele dar ciertos problemas a la larga en Windows Server). Definitivamente CacheMan es algo que vale la pena revisar.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

.net | programming

Cadenas vacias en .Net 2.0

by cristian 02/04/2008 8:09:00

Una forma sencilla de saber si una cadena esta vacía, la forma "común" era:

   1: if (cadena == null && cadena.Length == 0) { 
   2:     // la cadena estaba vacia 
   3: } 

Mas bonito en .Net 2.0: (Importante, según el profiler esta segunda forma es varias veces más rápida que la primera!)

   1: if (string.IsNullOrEmpty(cadena)) { 
   2:     // la cadena estaba vacia 
   3: } 

Pero es aún más bonito en C# 3.0 usando un extension method y logrando que sea así:

   1: if (cadena.IsEmpty) { 
   2:    // la cadena esta vacia 
   3: } 

Se los dejo de tarea :P

Technorati Tags: ,
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

.net | programming

Bash to Powershell: usando && (and) y || (or)

by cristian 02/04/2008 7:13:00

En Bash era sumamente común hacer algo como:

bash> comandoUno && comandoDos  
bash> comandoTres || comandoCuatro  

E indicaba que el comando "comandoDos" se ejecutaría después del comando "comandoUno" pero solamente si el "comandoUno" retornara "SUCCESS", y el comando "comandoCuatro" se ejecutaría después del comando "comandoTres" si este no retornara "SUCCESS".

En PowerShell, para ejecutar un comando después de otro basta con separarlos con punto y coma (;), si queremos que el comando "comandoUno" se ejecute después del comando "comandoDos" basta hacer lo siguiente:

ps> comandoUno; comandoDos  

El problema radica en que PowerShell no tiene soporte para ejecución condicionada, así que tendremos que hacer un pequeño hack usando la variable $LastExitCode:

ps> comandoUno; if ($LastExitCode -eq 0) { comandoDos }  
ps> comandoTres; if ($LastExitCode -ne 0) { comandoCuatro }  

Claro que es un "poco" más largo, pero veanlo de esta manera, es un poquito más claro tambien :D

 

Technorati Tags:
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Sea el primero en calificar este post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

programming

Powered by BlogEngine.NET 1.3.1.0
Theme by Mads Kristensen

About me!

Name of author Cristian Prieto
Software Architect and a .Net fan

E-mail me Send mail

Calendar

<<  noviembre 2008  >>
lumamijuvido
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

View posts in large calendar

Comentarios recientes

Categorias