Wednesday, September 27, 2006
Ruby Tuesday
Primero aclarar que Ruby es el lenguaje, ya que en la red comienzan a desprenderce diferentes nombres los cuales son: Ruby on Rails, Rails es un Framework construido sobre Ruby, el cual ha hecho de este lenguaje algo verdaderamente importante. Cuando escuchen de Ruby in Steel, básicamente es el AddIn que hace que podamos programar proyectos basados en Ruby utilizando Visual Studio .NET 2005.
Qué se necesita para utilizar Ruby desde Visual Studio .NET 2005?
Primero conseguirse el interprete de Ruby, el cual pueden descargarse de: http://www.rubyonrails.org/down
Luego descargarse Ruby in Steel, que habilita a nuestro IDE para que tengamos plnatillas para Ruby: http://www.sapphiresteel.com/
Con esa tarea completa podran entonces iniciar a programar con Ruby dentro de Visual Studio .NET 2005.
Bien que este sea el inicio de varias entradas acerca de Ruby in Steel, Ruby on Rails, en fin Ruby, para usar un lenguaje verdaderamente potente y que facilite nuestro trabajo.
Tuesday, June 20, 2006
Ambiguedad en Interfaces
Me encontré con una técnica, que alivia este problema, y básicamente lo que se hace es un nombramiento completo, usando el nombre de la interfaz (IMiInterface1.Metodo), esto le dice al compilador que método Metodo() está siendo implementado.
using System;
public interface IMiInterface1
{
void Metodo(int x);
}
public interface IMiInterface2
{
void Metodo(int x);
}
public class MiClase: IMiInterface1, IMiInterface2
{
void IMiInterface1.Metodo(int x)
{
Console.WriteLine("Llamando al método...{0}",x);
}
void IMiInterface2.Metodo(int x)
{
Console.WriteLine("Llamando al método...{0}",x);
}
}
class App
{
public static void Main()
{
MiClase obj= new MiClase();
((IMiInterface1)obj).Metodo(1);
((IMiInterface2)obj).Metodo(2);
}
}
Debe tenerse en cuenta que cada llamada a Metodo() en el cliente necesita su respectivo Cast a la interfaz de la cual se va a usar el método.
En conclusión el nombramiento explicito, es una buen técnica, para evitar la ambiguedad entre interfaces implementadas por una clase, las cuales definen un método igual.
Sunday, June 11, 2006
TypeForwardedToAttribute
El atributo TypeForwardedToAttribute, permite básicamente poder mover los tipos definidos en nuestros assemblies, a nuevos assemblies, y que las aplicaciones clientes, simplemente sean redirecionadas a las nuevas localizaciones de los tipos que esten usando del assemblie, del cual han sido movidos estos tipos. Permitiendo de este modo, simplemente compilar los assemblies pero no las aplicaciones clientes.
Veamos esto en marcha, con un ejemplo muy sencillo.
Nuestro assemblie que llamaré "Original" tiene un tipo llamado Ejemplo:
using System;
namespace Probando
{
class Ejemplo
{
static Ejemplo()
{
Console.WriteLine("Estoy en el ensamblado original.");
}
}
}
para compilar el código anterior simplemente copienlo en su NotePad, nombren el archivo como original.cs y usando el Command Promp de VS.NET, escribimos el siguiente comando:
css /t:library original.cs
Bien con esto ya tenemos el ensamblado "original" con una clase llamada Ejemplo. Recuerden /t:library, le indica al compilador que el resultado va a ser una libreria de clases, no una aplicación ejecutable, ya que nuestro primer ensamblado no contendrá ningún método main().
Ahora creemeos un pequeño cliente que referencie el ensamblado y utilice su clase:
using System;
using Original;
namespace Aplicacion
{
class Prueba
{
static void Main()
{
Ejemplo obj = new Ejemplo();
}
}
}
Copien el código anterior al bloc de notas y nombren el archivo como prueba.cs.
En este pequeño cliente, se puede apreciar que se está creando una instancia de la clase Ejemplo, definida en el ensamblado "original".
La compilación del código anterior la pueden ejecutar de la siguiente mandera:
csc /r:original.dll prueba.cs
/r le indica al compilador que se está haciendo referencia al ensamblado original.dll, el cual contiene la definición de la clase Ejemplo, que estamos usando en nuestro cliente.
La salida de prueba.exe será: "Estoy en el ensamblado Original."
Supongamos que hemos decidido mover el tipo definido en el ensamblado "original" a otro ensamblado que llamaremos NuevaVersion. Entonces cortamos la definición de la clase Ejemplo del ensamblado "original" y la pegamos en un nueco archivo que llamaremos nuevaversion.cs. Compilamos original.cs como lo habiamos hecho antes con lo cual al ejecutar nuestro cliente obtendremos el siguiente error:
prueba.cs(2,7): error CS0246: The type or namespace name 'Original' could not be found (are you missing a using directive or an assembly reference?)
Es obvio lo anterior ya que hemos movido el tipo Ejemplo al nuevo ensamblado que ha quedado así;
using System;
namespace Probando
{
public class Ejemplo
{
public Ejemplo()
{
Console.WriteLine("Estoy en el ensamblado Nueva Versión.");
}
}
}
Copiamos el anterior código en el bloc de notas, y nombramos el archivo como NuevaVersion.cs, y se compila así:
css /t:library nuevaversion.cs
Ahora entonces que debemos hacer, para evitar recompilar la aplicación cliente y que siga funcionando aunque haya sido movido el tipo al nuevo ensamblado?
Agregamos el siguiente atributo, al ensamblado Original, con lo que el código de original.cs queda así:
using System;
using System.Runtime.CompilerServices;
[assembly: TypeForwardedTo(typeof(Probando.Ejemplo))]
namespace Probando
{
}
Primero noten el nuevo NameSpace agregado System.Runtime.CompilerServices; para poder hacer uso del atributo [assembly: TypeForwardedTo(typeof(Probando.Ejemplo))].
Con lo anterior, el cliente seguirá llamando al ensamblado original, pero este internamente redireccionará al ensamblado NuevaVersion para acceder al tipo Ejemplo, que previamente ya habiamos movido a ese nuevo ensamblado.
Con esto el cliente ahora recibirá el mensaje:
"Estoy en el ensamblado Nueva Versión."
Esta es una grandiosa característica, que puede servir mucho para los que se dediquen a crear librerias de clases y necesiten realizar este tipo de actualizaciones, y quieran no tocar nada en las aplicaciones cliente.
Friday, June 09, 2006
Generics
Si queremos definir un tipo, llamado stack (pila), no generico tenemos algo como esto:
class Stack {
private object[] store;
private int size;
public Stack()
store=new object[10]; size=0;
}
Ahora si lo quieren genérico, aqui está lo interesante del asunto:
class Stack
private T[] store;
private int size;
public Stack()
store=new T[10]; size=0;
}
Fijense que sería como una especie de plantilla, para la cual definiremos cualquier tipo de dato, consiguiendo una clase stack de tipos genéricos. En el caso no genérico tenemos por ejemplo un arreglo store como tipo object, lo que supone recibir cualquier tipo de datos, pero incurriendo obviamente en la costosa operación de boxing y unboxing.
Por el contrario, con nuestro modelo genérico el arreglo store, está habilitado para ser del tipo que le definamos sin incurrir en operaciones de boxing y unboxing.
Hasta el momento el ejemplo nos muestra que podemos definir tanto Clases como sus miembros de tipo genérico.
Pero ahora veamos la implementación de los métodos de ingreso y sacada de elementos de la pila en el modo no genérico:
public void Push(object x) {
if (size>=store.Size) {
object[] tmp = new object[size*2];
Array.Copy(store,tmp,size);
store = tmp;
}
store[size++] = x;
}
public object Pop() {
return store[--size];
}
Es de observar el uso de object como forma de recibir cualquier tipo de dato, pero si le pasamos tipos primitivos, incurrimos en la no bienvenida operación de box, por ejemplo, compilemos lo anterior y analicemos un poco el IL generado.
En la ventana generada gracias al ILDASM.EXE en la línea IL_000a: box, se aprecia una clara llamada a una operación de box. Ahora imaginense esto ocurriendo por cada elemento que entre a la pila de tipo primitivo, en este caso un entero, que deberá ser casteado a Object.
Ahora observermos la versión genérica mirada a través de la lupa del ILDASM:
public void Push(T x)
{
if (size>=store.Length)
{
T[] tmp = new T[size*2];
Array.Copy(store,tmp,size);
store = tmp;
}
store[size++] = x;
}
public T Pop()
{
return store[--size];
}
Alguien me puede ayudar a buscar la operación de Box que no la veo. Si señores, una ventaja de Generics vista en puro C# convertido a IL.
Como se puede observar, igualmente nuestra clase genérica puede también tener Métodos genéricos, el caso de Pop() y métodos no genéricos que reciben tipos genéricos el caso de Push().
Este ejmplo lo tome del artículo http://research.microsoft.com/projects/clrgen/generics.pdf
y quise comprobar a través del ILDASM, para ver de cerca una de las ventajas claras de Generics Types.
UNICAUCA en Imagine Cup 2006
Cuatro estudiantes con muchas ganas, se dieron a la tarea de hacer un desarrollo utilizando tecnología .NET, para cumplir con el lema del evento que reza "Imagina un mundo donde la tecnología nos permite vivir vidas mas saludables", consiguiendo un producto que basado en la Electro-Acupuntura, logran determinar el estado de salud de una persona, de acuerdo a ciertos rangos establecidos, según la información electrica recogida a través de un dispositivo hardware conectado al puerto serie, y logrando así una gran intereacción a través de una aplicación de Windows Forms, y usando también clientes Pocket y ASP.NET.
Mis más sinceras felicitaciones, y esperemos que se traigan una buena posición en la final, sino la primera.
Sunday, May 21, 2006
Microsoft Andean Developer Days
Si señores, los dias 15 y 16 de Mayo se celebró en la ciudad de Bogotá en el Hotel COSMOS este magnanimo evento. Con la oportunidad de reunirse con los expositores ya conocidos: Miguel Mendoza, Willy Marroquin y el señor Ricardo González, por su participación como Comunidad, pero manteniendo su libertad por no ser workers de Microsoft.
El Señor Rocardo González presentó el tema de los Gadgets en Windows Vista. Muy interesante, básicamente pequeñas aplicaciones residentes en algo que se conoce como el SideBar, pero que prestan bastante potencial para ofrecer información instantánea a los usuarios de este grandioso Sistema Operativo.
Revisen http://microsoftgadgets.com/
Por su parte Mr Willy mostró esta cosa de SOA, aluciendo como siempre su simpática forma de presentar los temás, que lo colocan de 2do en mi ranking de los mejores expositores que se vieron en el evento. Esto de SOA pues si estuvo muy interesante, sobre todo lo referente a la cosa Enterprise, donde lo veo con la fuerza y el estilo muy CMMI. Hablando de niveles de madurez y mostrando 5 o 6 niveles no recuerdo, de la misma forma que lo hace CMMI.
Además requiere de la participación de todos los personajes de la Enterprise, y su sustento final, obviamente serán los Web Services, por la cosa heterogenea que pretende atacar esta maravillosa forma de ver las arquitecturas.
Bien, continuando, ahora llegan personajes nuevos a quienes no había podido escuchar en charlas: de perú Segundo Leon, con la cosa del Office 12, para que pero estuvo muy interesante, mostró todo de forma muy didáctica y dejo ver realmente las nuevas potencialidades del Office 12, basado plenamente en XML. El señor David Parra consultor de Microsoft, con el tema de Web Services, muy bueno, mostrando la cosa desde un enfoque más Guideline, es decir basó su charla en lo que la gente de Patterns and Practices han sacado para mostrar las diferentes formas de asegurar nuestra infraestructura en la parte de Web Services y sus respectivos clientes. Recomendado: http://www.microsoft.com/downloads/details.aspx?FamilyId=3E02A6C8-128A-47C2-9F39-4082582F3FE1&displaylang=en
El señor Mauricio Alvarez, con quien he tenido la oportunidad de estar en Cali en sesiones de Arquitectura, se lució en su presentación, haciendola como siempre muy amena y tratando el tema alrededor del ciclo de vida del desarrollo, tocando la cosa de: requerimientos, arquitectura, desarrollo, pruebas, y técnicas usadas por las diferentes empresas en las cuales cada uno participamos jugando roles que se mostraron en la charla, y se dejaron ver como aca en Bogotá se usan de una u otra cosa para tratar de mantener los proyectos marchando de manera adecuada. La principal conclusión quiza, es el no uso de técnicas eficientes de Estimación, algo que puede incidir en el aumento en los retrasos y obviemnte los costes de los proyectos.
Y el gran señor, expositor internacional de INETA, y mi idolo en esto de .NET, de la hermana Argentina, el señor Dani Seara. Hasta ahora no he visto mejor expositor que este señor. En todo momento manteniendo atento a su público nos deleitó con 2 horas acerca de Windows Workflow Foundation. Mostrando la cosa teórica y llevando cada tema a la práctica con ejemplos claros usando obviamente VS.NET 2005. Gracias Dani porque tú Universidad.NET me inció en este cuento. Lástimosamente me acerqué a hablar con él de por qué no ha continuado la cosa de la Universidad.NET y muy simpáticamente me mandó a preguntarle a los señores de Microsoft, responsables directos de que el proyecto esté detenido.
Ah no se me puede escapar el señor Ruben Sanchéz, lucido con el tema de Windows Presentation Foundation, mostró la cosa nueva de las herramientas para diseñadores que traerá Microsoft, en la parte de gráficos Pixelados y Vectoriales, y la animáción de todo esto, que en futuro vendrá integrado para dar toda la productividad del caso. La conclución, todo esto basado en XAML, del que se puede sacar mucho provecho desde nuestras aplicaciones.
En resumen, un DevDays maravilloso, donde yo creo que la inmensa mayoría quedamos muy satisfechos y a la espera de todo lo que viene de la mano de Microsoft y sus grandiosos productos.
Friday, May 05, 2006
ATLAS llega con fuerza
Que es algo así como un framework, que encapsula a alto nivel lo referente a eso que se conoce como AJAX. Quieren tener buena información del asunto? pues aqui está el punto de entrada para estar al dia con esta nueva tecnología: http://atlas.asp.net/Default.aspx?tabid=47
Por lo demás pues vamos traduciendo algunas de sus características para que vayamos dando juicios de esta nueva ayuda tecnologíca a las manos de los que andamos en el cuento del desarrollo usando ASP.NET.
“Atlas” habilita a los sitios para tomar completa ventaja de los browsers modernos.
“Atlas” da via libre a los desarrolladores ASP.NET para crear experiencias web muy ricas para los clientes.
“Atlas” incluye un Framework de Javascript del lado del cliente para facilitar la creación y reusos de scripts.
“Atlas” hace muy fácil el consumo de servicios desde ASP.NET.
Si señores Atlas llega con fuerza, y yo por mi parte comenzaré a actualizarme en el tema para mantenerlos al tanto.
Sería bueno iniciar una discusión alrededor de esta causa, para sacarle bastante provecho.
Thursday, May 04, 2006
Delphi .NET, GDI+ y un poco más
Lo que quiero es ir mostrando a paso lento pero seguro, cómo es la situación esta del Object Pascal for .NET.
Por ejemplo ahora en la sección Uses pueden ver cosas como estas:
uses System.Drawing;
Si señores, ahi le indicamos a Mr Delphi que vamos a necesitar acceso a las clases de este namespace, y finalmente poder utilizarlas.
Luego dicen por ahi que Private y Protected en Delphi.NET no son como los pintan. Si señores, si ustedes usan
private intXo: integer;
Le cuento que además de ser usado dentro de la clase, a ese engendro lo pueden ver desde afuera. Cómo la ven? a mí la verdad a merced de que esto sea por mera casualidad o por resolver chicharrones para el equipo de la Borland Corporation, pues me parece una falta de atrevimiento querer hacer llover hacia arriba.
Quiere entonces que lo privado sea verdaderamente privado? pues teneis que usar:
strict private
Cómo les queda el ojo? un poco borroso, pues amí me quedo así cuando vi eso, y lo mismo haganle al protected si quieren que sea verdaderamente protected.
Quieren ver otra critica a los MRs de Borland? http://thenetrix.blogspot.com/2006/04/anda-qu-chulo-y-quin-trabaja.html
Bueno aqui además de criticar a Borland, pues tambièn vamos a lo que vinimos:
Supongase que quieren pintar un tablero de ajedrez en su Windows Forms, aqui esta el code:
type TGraficos = class
private
{ Private Declarations }
intXo: integer;
intYo: integer;
intAncho: integer;
public constructor Create;
procedure PintarTablero(objGraficos: Graphics);
end;
implementation
constructor TGraficos.Create;
begin
inherited Create; // TODO: Add any constructor code here
intXo := 80;
intYo := 0;
intAncho := 60;
end;
procedure TGraficos.PintarTablero;
var objPen: Pen; objBrushNegro: Brush;
objBrushBlanco: Brush;
intContador1: integer;
intContador2: integer;
begin
for intContador1 := 0 to 7 do
for intContador2 := 0 to 7 do
if ((intContador1 + intContador2) mod 2) = 1 then
objGraficos.FillRectangle(objBrushNegro, intXo + intContador2 * intAncho, intYo + intContador1 * intAncho, intXo + intContador1 * intAncho + intAncho, intYo + intContador2 * intAncho + intAncho)
else
objGraficos.FillRectangle(objBrushBlanco, intXo + intContador2 * intAncho, intYo + intContador1 * intAncho, intXo + intContador2 * intAncho + intAncho, intYo + intContador1 * intAncho + intAncho);
objPen.Dispose();
objBrushBlanco.Dispose();
objBrushNegro.Dispose();
end;
TGraficos, recuerden, uno de los 10 mandamientos dice: "Colocaras una T antecediendo el nombre de tú
clase", vaya que en esto si soy responsable y no he olvidado los mandamientos tipo Borland.
Fijense el uso de var para declarar variables locales al procedimiento. Ah si, además esto funciona como Mr VB, toca decirle al señor compilador, vea esto es un procedure, o esto es una function. Sencillo el primero no retorna nada, el segundo si retorna. Ah cosas raras, yo prefiero C#.
El famoso Begin, esto me recuerda al viejo pseudocódigo, pero en fin hace las veces de las {} para los Javeros, C++, y C#reros, podría decirse?
Pero bueno, finalmente, llegamos a la conclusión. A parte de toda esta parafernalia heredada del object pascal comun y corriente, llegamos al punto del uso de nuestras queridas clases del .NET Framework, que eso si es totalmente transparente para los que le dedicamos 9 hrs al dia y un poco más a .NET.
Fijense como el procedure recibe un tipo Graphics, muy simple, instancian TGraficos, y al constructor le asiganan por ejemplo el Graphics devuelto por la forma, al estilo, self.CreateGraphics(), o hacen el llamdo en el evento Paint de la forma y le pasan e.Graphics. El primero como ven es un método como tal, el segundo una propiedad del tipo (e) de la clase PaintEventArgs.
Adicionalmente pueden ponerse en su Form un control tipo pictureBox, y lo usan para retornar el tipo Graphics, de la misma forma como lo hacen con el Form.
Recuerden que esto es uso de GDI+, entre más complejos son lo gráficos y las utilidades que usamos, debemos estar al pendiente de liberar los recursos, para no tener sobrecarga en recursos de memory y procesamiento. Para esto, en mi sencillo ejemplo invoco el método Dispose() de cada uno de los objetos que han o están ocupando recursoso de mi máquina.
Si señores esto es Delphi.NET, un lenguaje más que se une a la liga de la justicia, por qué? sencillo, para estar a la moda. No mentira, porque saben que deben estar al dia con lo que se trabaja actualmente y así no quedarse resagados en relación a IDEs como VS.NET 2005.
Una cosa si les digo, quieren invertir bien la plata? Comprense un VS.NET, la verdad es que Delphi 8 for Microsoft .NET Frameowrk, deja mucho que desear.
Un abrazo
Friday, April 21, 2006
Bienvenida
Es momento entonces de crearme un nuevo blog, esta ves en honor a mi hija Sofia. Por eso la url del Blog.
Como siempre este espacio está dedicado a .NET y todos sus intringulis.
Espero que sean de utilidad cada una de las cosas que pretendo colgar aqui, básicamente sacadas del dia a dia en mi trabajo, y en el trabajo de muchos que hacen de .NET una tecnología digna de ser investigada y transmitida a muchos más.
Bienvenidos!!