Mis Aventuras con AutoCAD MAP: Acceso a datos Geoespaciales
Primero que son los datos Geoespaciales?? Es sencillos terminos son los graficos de los mapas, estos normalmente estan divididos en capas en las cuales se tienen representaciones graficas de objetos de distintos tipos, es decir se tiene una capa que tiene los graficos que representan a las calles, otra capa tendra los hidrantes, otra capa tendra las casas (lotes, parcelas, o como les denominen)....
Estas capas fisicamente pueden estar almacenadas en una base de datos como en uno o varios archivos, como ustedes se imaginaran no es una buena practica desarrollar sistemas de informacion geografica sobre archivos, esto nos deja la opcion de la base de datos...
Es posible almacenar estos datos en algunas bases de datos como por ejemplo Oracle, MySQL y SQL Server, la verdad la que mas avanzada esta en el tema es Oracle, al punto de tener su propio visor de datos geoespaciales en las versiones 9i y 10g y prometen una mejora sustancial que aun no evaluo en 11g, SQL Server 2008 promete tambien soportar bien este tema, sin embargo se pueden usar las versiones 2005 e incluso 2000, con MySQL no tengo experiencia en el tema, pero claro si desean bajar un poco los costos de su solucion podrian evaluar esta opcion...
Asi mismo por varias razones se eligio usar Oracle, se intento con la version 9i pero la verdad tuvimos problemas un poco extraños como por ejemplo que a veces AutoCAD dibujaba los datos pero a veces no, las conversiones de sistemas de coordenadas no siempre funcionaban como debian, etc....
Decidido, se uso 10g una version Enterprise con AutoCAD MAP 3D 2008 SP1, lo del Service Pack del AutoCAD es importante por que quita una serie de Bugs molestosos cuando desarrollas, les cuento ademas que yo uso Visual Studio Team System SP1 sobre Windows Vista Business y no he tenido problemas con eso, una recomendacion si es que hagan que AutoCAD MAP funcione con permisos de administrador, asi cuando una excepcion es arrojada Vista no usara el control de excepciones propio del SO si no te mostrara la excepcion y podras saber que esta sucediendo...
Muy bien ahora la parte de la conexion de datos, como he mencionado en posts anteriores AutoCAD tiene la habilidad de hostear aplicaciones .NET, con esto uno puede hacer lo que desea en cuanto a programacion, pero claro el objetivo es usar las facilidades de AutoCAD, especialmente la concatenacion de datos geoespaciales y datos "normales" en la base de datos...
Me costo un poco de tiempo entender un poco la evolucion de este tema, AutoCAD MAP puede acceder de 2 formas a los datos espaciales de un modo nativo:
OSE: Esta es la primera forma de acceder a los datos, pero no los trata como ciudadanos de primera clase, es decir uno obtiene los datos, los modifica pero es dificil manipular datos "normales" asociados con estos...
FDO: Esta es una forma abierta de acceder a los datos, no solo en cualquier base de datos si no tambien en archivos SDF y servicios web geoespaciales (yo tampoco sabia que existian estos pero es cierto!!!), ademas de que es un proyecto Open Source, lo pueden encontrar aqui http://fdo.osgeo.org, con esto si se puede usar los datos graficos de un modo muy interesante, mas aun para mi si funciona con C#, en el caso de AutoCAD MAP 3D 2008 usa la version 3.2.1 que es uno de los ultimos releases, pero esto no lo libra de los bugs...
Para mi caso es claro que si deseo usar Oracle necesito tambien en la maquina cliente tener el famoso Oracle Client, yo les recomiendo la version 10.2.0.3 es la mas estable al momento y funciona en Windows Vista, las anteriores tienen problemas con Windows Vista...
He decidio usar FDO por muchas razones, la mas fuerte es que AutoCAD MAP 3D 2008 ofrece muchas facilidades para usarla como interfaz al usuario final y tambien al programador .NET, esto se refleja por ejemplo que para obtener los datos desde Oracle se pueden usar DataReaders, claro estos son especializados pero se los puede usar tal cual se usan DataReaders, ademas permite ver los datos adjuntos a los datos espaciales y modificarlos de un modo sencillo para un usuario comun, etc..., es un tanto dificil explicar en un solo post el uso de FDO por eso ire explicando por pasos como usarlo, desde la conexion, creacion de capas, actualizacion de objetos y datos, etc...
Bien con estas decisiones tomadas se puede decir que se puede inciar el trabajo, como les comentaba el problema mas grande que encontre yo es la falta de informacion sobre el tema, es por eso que ahora que ya he descubierto muchas de esas cosas he querido compartir esto para que no pasen lo que yo he pasado, y claro si tienen alguna pregunta con mucho gusto los ayudare, por lo pronto es todo por hoy!!!
Un ejemplo de ADO Entity Framework y LinQ
He estado un poco mas libre estos días así es que por esto he decidido poner mas cosas interesantes en mi blog, cuando me refiero a cosas interesantes me refiero a código útil, que en algún momento ya sea de ocio o desesperación, ha hecho que mi vida valga la pena!! Pues bien hay una revolución en nuestro mundo .NET que se está acercando a pasos agigantados como es el ADO Entity Framework, antes solo he escrito solo para anunciarlo o para comentar sobre el mismo, pues hoy les quiero mostrar como se puede usar el Entity Framework combinado con LinQ, es decir ustedes requieren o el Beta 2 de Visual Studio 2008 (Este es mi caso), o su RTM y el ultimo CTP del EF, es el de diciembre, en uno de mis anteriores post esta como descargarlo...
Muy bien!! Primero que es el EF?? El ADO Entity Framework permite que se cree una capa de persistencia automáticamente, cuando hablo de capa de persistencia me refiero a que se crean clases que manejan la interacción entre la Base de Datos y la solución, esta capa esta representada por clases que reflejan los elementos de la base de datos como las tablas, vistas, procedimientos almacenados, funciones, etc. a diferencia de otras soluciones existentes de este tipo (NHibernate y Hibernate para Java) esto es completamente VISUAL!!! A lo que nos tiene acostumbrado MS, es decir hago una conexion en Visual Studio 2008 en el Server Explorer, arrastro las tablas sobre mi modelo, especifico unos NameSpaces y voila!!! Capa de persistencia!! Y es realmente completa, uno ejecuta operaciones sobre las clases y esto se refleja automáticamente sobre la base de datos, además tiene cosas interesantes como el deferred execution, esto significa que la capa ejecuta las instrucciones solo cuando es realmente necesario, incluso se puede indicar que ciertos "campos" de la base de datos no sean obtenidos hasta que sean explícitamente utilizados, para que es útil esto?? Es bueno cuando almacenas archivos en campos binarios por ejemplo...
Como se lo hace?? Bien abren su Visual Studio 2008, se crean una librería de clases y la llaman como quieran, en mi caso TestLibCSharp, y le agregamos un archivo de tipo LinQToSql Classes como este:

Listo ahora desde el Server Explorer se debe arrastrar lo que uno desea incluir como objetos, si no tienen una conexión en el Server Explorer pues no es difícil crearla, al momento con mi versión y con el CTP de EF no es posible usar mas que SQL Server, pero al momento el resto de proveedores de datos como DataDirect ha anunciado que van a soportar también el EF por lo cual absolutamente todas las bases de datos comerciales que normalmente se usan podrán ser usadas también, bueno al arrastrar algunas tablas les debe quedar algo así:

Con eso ya se puede empezar a trabajar, pero antes revisen un poco las propiedades, si presionan F4 puede observar algunas cosas interesantes, como por ejemplo la conexión que usa, el NameSpace en donde puede ser referenciada, algo asi como lo de abajo:
Bueno como se imaginaran ahora lo que falta es usar la capa de persistencia, la verdad seria desaprovechar todo el potencial de .NET si no lo hago con LinQ, asi es que voy a incluir una clase dentro de la misma librería que hace uso del EF con LinQ y claro voy a explicar, de paso topo un par de nuevas características de C# 3.0:
Ahora vamos a seccionar el método LinQExample para indicar que se hizo:
En las líneas 14 y 15 se encuentra la creación de un nuevo DataContext, como recordaran mas arriba se veian propiedades como por ejemplo el NameSpace en el que se encuentra nuestro DataContext, en este caso BudgetClassesDataContext, en su constructor podemos especificar la cadena de conexión que deseamos usar, en mi caso la saco del archivo de configuración de la aplicación.
En las líneas 16, 17 y 18 se encuentra algo muy interesante, hace tiempo atrás en Visual Basic se podían usar tipos de datos Variant, es decir uno podía guardar cualquier cosa ahí, en C# el tipo var no es lo mismo, se la llama una variable de tipo implícito, es decir el tipo de esta variable es inferido basado en el tipo asignado con esto los programadores no están atados a declarar exactamente que tipo es hasta no instanciar la variable, de paso usamos LinQ, como ustedes saben LinQ es un lenguaje de consultas integrado a los lenguajes .NET el cual permite extraer datos en forma de objetos, no solo se puede actuar como en mi caso sobre el EF si no también sobre ciertos objetos, XML e incluso DataSets!! Es muy parecido al SQL, por no decir igualito, y básicamente se lo usa con un generador que es la clausula from, se la llama generador por que inicia la sentencia, en esta se especifica primero un objeto que representa a una entidad del conjunto sobre la cual se puede trabajar en el resto de la consulta, se le agrega un in para indicar de donde van a ser tomadas las entidades, en nuestro caso del DataContext instanciado y a su ves una clase que representa una tabla especifica de la base de datos, con esto ya especificamos el origen de los datos y un objeto sobre el cual podemos especificar condiciones en la siguiente clausula que es el where, como ustedes ven en la línea 17 el where especifica que de la entidad declarada en el from anterior se tome una propiedad de la misma y se cumpla con una condición, en palabras simples que se escoja las entidades que tengan en Active el valor de 1, para finalmente terminar con un select, en este podemos decir si se toma todas las propiedades de la entidad o solo algunas, en mi caso al poner solo el nombre de la entidad se traduce en un select *, esto retorna en este caso una lista de un tipo FiscalPeriod que es un tipo generado por el EF que representa una tabla y estas entidades cumplen con la condición de que el valor de la propiedad Active sea igual a 1.
Listo!! Pero esperen, si ejecutan esto o un ejemplo propio suyo paso a paso resulta que esto funciona muy rápido!! Es sospechoso verdad?? Pues esta correcto, LinQ ejecutara realmente la consulta la primera vez que se use el objeto resultante de la consulta, es decir en la línea 21, que ganamos?? Pues velocidad en el procesamiento y es oportuno además, claro que la línea 21 no es un buen ejemplo de cómo se debe programar en .NET pero es tan solo un ejemplo….
Espero que esta breve guía les sirva y puedan empezar a utilizar LinQ y el EF, realmente es algo muy prometedor y ayuda a reducir aun mas los tiempos de desarrollo, esperemos que tenga un buen futuro!!!
Web 2.0: Que mismo es?
Wikipedia: http://en.wikipedia.org/wiki/Web_2
Estoy en una especia de campaña de difusion del tema, es bastante ya con que los gobernantes de paises mantengan ignorantes a la gente para que no opine, no debemos dejar que algo similar suceda con el conocimiento en la Web!!!
El Gourmet .NET: Que es mas eficiente, un if, un ?: o un ??
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace CSharpTestHost
{
public class clsTest
{
///
/// Prueba con instruccion If
///
/// pdtbData1: Parametro a ser evaluado
/// Devuelve:
public DataTable IfTest(DataTable pdtbData1)
{
DataTable dtbResult;
if (pdtbData1 != null)
{
dtbResult = pdtbData1;
}
else
{
dtbResult = new DataTable();
}
return dtbResult;
}
///
/// Prueba con operador ?:
///
/// pdtbData1:Parametro a ser evaluado
/// Devuelve:
public DataTable InLineIfTest(DataTable pdtbData1)
{
return (pdtbData1 != null) ? pdtbData1 : new DataTable();
}
///
/// Prueba con operador ??
///
/// pdtbData1: Parametro a ser evaluado
/// Devuelve:
public DataTable InLineIfTest2(DataTable pdtbData1)
{
return pdtbData1 ?? new DataTable();
}
}
}
Despues de esto si ustedes revisan los 3 metodos de esa clase cumplen exactamente la misma funcion, es decir evaluan si el objeto parametro, en este caso un DataTable, es diferente de null y devuelven un nuevo objeto de ser esto cierto, debemos recordar que el hecho de usar menos codigo no necesariamente quiere decir que es mas eficiente, como ustedes saben cuando uno usa C# la implementacion de operadores es posible y detras de esos tambien se puede poner bastante codigo!!
Con esta duda en mente, se me ocurrio utilizar ildasm (para quienes no la conocen a esta herramienta lo que hace es desemsablar el codigo de tu assembly .net y te lo muestra en MSIL, que es muy parecido al assembler y la verdad es bastante facil de leer) y compare los 3 metodos, con la referencia de que MSIL es casi assembler es un punto perfecto para comparar los 3 metodos, aqui estan los resultados:
Metodo con If:
.method public hidebysig instance class [System.Data]System.Data.DataTable
IfTest(class [System.Data]System.Data.DataTable pdtbData1) cil managed
{
// Code size 29 (0x1d)
.maxstack 2
.locals init ([0] class [System.Data]System.Data.DataTable dtbResult,
[1] class [System.Data]System.Data.DataTable CS$1$0000,
[2] bool CS$4$0001)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldnull
IL_0003: ceq
IL_0005: stloc.2
IL_0006: ldloc.2
IL_0007: brtrue.s IL_000f
IL_0009: nop
IL_000a: ldarg.1
IL_000b: stloc.0
IL_000c: nop
IL_000d: br.s IL_0017
IL_000f: nop
IL_0010: newobj instance void [System.Data]System.Data.DataTable::.ctor()
IL_0015: stloc.0
IL_0016: nop
IL_0017: ldloc.0
IL_0018: stloc.1
IL_0019: br.s IL_001b
IL_001b: ldloc.1
IL_001c: ret
} // end of method clsTest::IfTest
Metodo con In Line If u operador ?:
.method public hidebysig instance class [System.Data]System.Data.DataTable
InLineIfTest(class [System.Data]System.Data.DataTable pdtbData1) cil managed
{
// Code size 17 (0x11)
.maxstack 2
.locals init ([0] class [System.Data]System.Data.DataTable CS$1$0000)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: brtrue.s IL_000b
IL_0004: newobj instance void [System.Data]System.Data.DataTable::.ctor()
IL_0009: br.s IL_000c
IL_000b: ldarg.1
IL_000c: stloc.0
IL_000d: br.s IL_000f
IL_000f: ldloc.0
IL_0010: ret
} // end of method clsTest::InLineIfTest
Metodo con operador ??:
.method public hidebysig instance class [System.Data]System.Data.DataTable
InLineIfTest2(class [System.Data]System.Data.DataTable pdtbData1) cil managed
{
// Code size 16 (0x10)
.maxstack 2
.locals init ([0] class [System.Data]System.Data.DataTable CS$1$0000)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: dup
IL_0003: brtrue.s IL_000b
IL_0005: pop
IL_0006: newobj instance void [System.Data]System.Data.DataTable::.ctor()
IL_000b: stloc.0
IL_000c: br.s IL_000e
IL_000e: ldloc.0
IL_000f: ret
} // end of method clsTest::InLineIfTest2
Ganador: Definitivamente el operador ?? es el ganador, por 1 byte!!
Ahora claro esta comparacion esta basada en la comprobacion de si un objeto esta vacio (es decir tiene una referencia a null) y que devolver, no siempre es practico el operador ??, por ejemplo en objetos que tienen solo valores (tipos primitivos como int, double, etc...) no es aplicable, a menos claro que uses nullable types, y en otros casos en los que tienes que ejecutar varias operaciones definitivamente el tradicional if sera el llamado a ejecutar las operaciones!!!
Espero que esto les ayude en sus decisiones sobre como escribir codigo, a veces 1 milisegundo menos de ejecucion ayuda a todo el perfomance de la aplicacion!!!
ADO Entity Framework Beta 3!!
La novedad es que se ha anunciado que oficialmente se dara soporte no solo a sql server si no a otros proveedores de datos!!
Para quienes ha utilizado Hibernate u otra solucion de este tipo van a ver que es tan sencillo usar el EF que el tiempo de desarrollo se vera cortado por la mitad!!!
Hay de todas maneras algunas dudas que tengo, por ejemplo con SQL Server estoy seguro que la generacion del SQL sera muy buena y funcionara muy bien, pero en otras bases de datos como por ejemplo Oracle que es muy sensible a como esta generada la sentencia se tendra en cuenta este tipo de cosas?? Espero que si!!!
Quieren saber un poco mas??
Revisen esto:
http://visualstudiomagazine.com/news/article.aspx?editorialsid=9323
Que pasa cuando mi Task Pane se pone en blanco??
Bien aqui esta el link de donde encontre la solucion:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2278405&SiteID=1
Y la solucion es quitar esta clave del registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{5f61f809-422a-4152-91f5-9ec1b935efd7}
Busquenla, si la encuentran no lo duden, quitenla intenten de nuevo y funciona como magia!!!
ParallelFX: Codigo Manejado en paralelo de verdad!!
http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx
Y si quieren bajarlas vayan al sitio de ParallexFX (Parallel Computing Develper Center):
http://msdn2.microsoft.com/en-us/concurrency/default.aspx
Espero que esto marque de verdad una diferencia!!!
Visual Studio Team System 2008 Liberado!!!
Development Edition
Code Analysis Checkin Policy
Code Metrics
JavaScript debugging
Performance run comparison
Hot pathing
Code Analysis Rules
Rules Management
Analyze menuSpelling rules
Database Edition
Integrate TeamData v1 into Team Suite
Test Edition
Auto cleanup of results
Control Load Modeling
New default views
Devices Unit testing
Test performance improvements
Inherited test classes
Load test and profiler integration
Web test correlation
Right-click test execution
Test generation from a compiled assembly
Webtest recorder support for AJAX and popups
Webtest playback improvements
Architecture Edition
Architectural RolesConform to WSDL
Top-down system design
Web application projects
Team Foundation Server
SharePoint 3.0 / 2007 supportImproved deployment experience
Better offline supportContinuous integrationBuild queuing & scheduled buildsDrop ManagementAnnotate
Folder Diff
Get latest on checkout
Performance and scale improvements (Work Item Tracking / Version Control)
Destroy files
Improved source control merging
Workspace mapping improvements
Team System Web Access (power tool)
La verdad tiene tantas cosas que mejoran mucho la herramienta!! Cada ves se pone mas bueno!!!
.NET Framework 3.5 Liberado!!!
http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6&displaylang=en
Espero lo aprovechen!!!
VSTO Client Troubleshooter
Hace tiempo los mensajes de error decian algo asi: "Ha ocurrido un error. Contacte con su administrador o la persona que desarrollo el paquete".... Pero si yo soy el que desarrollo el paquete!!
Bueno ademas de ya usar las facilidades como los controles de windows forms (antes no podias aunque no lo crean), usar Windows Installer de forma precisa (si tampoco podias), o incluso ClickOnce(antea habia no touch deployment y si funcionaba, a veces!!) me encontre una herramienta genial, el VSTO Client Troubleshooter!! Este te ayuda revisando que las dependencias de componentes y parches esten cumplidas y lo hace de una manera amigalbe y facil, lo quieren probar?? Vayan a este link:
http://www.microsoft.com/downloads/details.aspx?FamilyID=C9FB6A54-8069-4918-A6F9-E744928DFAC3&displaylang=en
Espero les ayude mucho!!!
Model Driven Development con MS, al FIN!!!!
En esta iniciativa participan Biztalk Server R6, Biztalk Services R1, .NET 4.0, Visual Studio 10 y aun estan por develarse otros detalles...
Con esto se pretende que el modelado sea la principal actividad dentro del desarrollo, ademas de que los desarrolladores no tengan que aprender nuevos lenguajes si no que usen lo que ya saben y tambien tener la facilidad de poder crear aplicaciones compuestas de una manera muy sencilla: Drag and Drop!!!
Pues esperemos que esto se vaya cumpliendo, es un objetivo bastante ambicioso y las promesas de este tipo ya tuvieron antes su implementacion, quien no recuerda las herramientas CASE??
Ademas actualmente IBM, aunque lleva ventaja, no es exactamente una implementacion exitosa de MDD, hay algunas barreras como el mismo UML que la verdad no es tan bueno para representar partes del negocio, etc...
MS tiene en ese punto una clara ventaja que es DSL, en los cuales uno puede crear su propio lenguaje y sortear este tipo de cosas, ademas con WWF y Biztalk Server el desarrollo de codigo se puede cortar hasta en un 80%, y claro ya de hecho el desarrollo .NET es mas rapido que el Java, y se lo puede hacer un 80% mas rapido!!!
Hay gente que aun piensa que .NET no es para aplicaciones empresariales, pero cuando les comento que se usa en bancos, petroleras, bolsas de valores, hay casos de exito de todo y por todos lados, pues ya piensan 2 veces...
Wow, si esto sigue asi realmente deberian pensarlo 2 veces en realizar un proyecto con herramientas que usan Java, por que claro les toma mas tiempo realizarlo y depende las herramientas tendran su costo, si usan herramientas IBM pues deben tener bastante dinero y si usan Eclipse u otro IDE y servidores de aplicaciones como JBOSS u otros pues piensen bien si no les cuesta (bajar la herramienta, tiempo de aprendizaje, tiempo de customizacion, etc...)
Espero que todo esto se vaya conviertiendo en una realidad, MS planea lanzar betas en el 2008, y no espera tener nada de releases antes del 2009, mas detalles de la noticia aqui:
http://www.sdtimes.com/article/LatestNews-20071015-24.html
Best Practices Analyzer
Quieren encontrarlas???
vayan a
http://download.microsoft.com y en su busqueda incluyan las palabras "Best Practices Analyzer" y se encontraran con algunas sorpresas!!!
AutoCAD y sus versiones
AutoCAD: La clasica herramienta de dibujo arquitectonico, esta puede ser expandida a el dibujo tecnico mecanico, automotriz, etc., tiene millones de prestaciones!!
AutoCAD Civil 3D: Este un una derivacion del AutoCAD mas especializada para la parte de Ingenieria Civil, claro el 3D le da una gran ventaja por que todo lo que dibuje lo puede ver en 3D!!!
AutoCAD MAP 3D: Es otra derivacion que en cambio es especializadad para temas de informacion geografica y topologica, este es con el que yo me tope!!!
De lo que se desde la version 2004 AutoCAD nos abre los brasos a los programadores .NET, uno puede hacer Host de las aplicaciones que uno desarrolla en AutoCAD tal cual uno las escribe, claro con la diferencia de que se tienen que derivar ciertas clases de tipos especificos, registrarlas en AutoCAD para que inicien solas o cargarlas...
Claro es logico tambien que se nos provea con Assemblies para acceder a las funcionalidades de AutoCAD, y ademas tambien lo podemos usar como objetoc COM especialmente para temas de interfases menus y ese tipo de cosas...
En los siguientes Posts pondre el procedimiento y el codigo para usar el famoso AutoCAD con .NET!!!
Silverlight al fin!!!
Mis aventuras con AutoCAD MAP 3D 2008 y .NET 2.0
Primero que nada quiero referenciarlos a otro blog que me salvo la vida: Through the Interface, http://through-the-interface.typepad.com/ este pertenece a un miebro de AutoDesk y claro tiene acceso de primera mano a todo lo relacionado con el CAD y de paso es un muy buen conocedor del .NET lo cual ayuda mucho...
Tambien he decidido hacer varios post sobre el tema tratando de seccionar los temas en un orden adecuado para explicar las relaciones y conceptos de Acad MAP con .NET 2.0, esto es para no asimilar mucha informacion de golpe!!
Los temas que tratare van a dividirse asi:
AutoCAD sus versiones y su relacion con .NET
AutoCAD MAP 3d 2008 y sus caracteristicas .NET
GIS con AutoCAD MAP 3d 2008 y .NET usando Oracle Spatial
Espero que estos siguientes posts les sirvan!!!
SDK para OpenXML
Se ha generado ya un SDK que esta en CTP para poder construir documentos basados en OpenXML con un modelo de objetos fuerte, lo cual quiere decir que no tenemos que conocer todos los tags y estructuras de la espcificacion y menos aun construir a mano los archivos XML!!!
Es cierta tanta maravilla?? Compruebenlo ustedes mismo!!
http://blogs.msdn.com/erikaehrli/archive/2007/06/04/announcing-the-new-open-xml-object-model.aspx
Traductor OpenXML a ODF
http://sourceforge.net/projects/odf-converter
Tambien es un proyecto Open Source y ya tiene un buen avance, pruebalo!!!
El CTP de Visual Studio Team System "Rosario" ha sido liberado!!
Un whitepaper con detalles mas completos puede ser encontrado aquí:
http://www.microsoft.com/downloads/details.aspx?familyid=0ADE6C5D-BE17-4168-B57B-4C2FA36EAD3E&displaylang=en
Y el VPC bajalo aqui:
http://www.microsoft.com/downloads/details.aspx?FamilyId=8450EFF5-24AD-44C3-AB91-1ED88EF2F4F0&displaylang=en
Llamar a un Servicio Web en forma Asincronica
Siendo esto así, se han hecho muchos artículos de como usar esta técnica, en algunos de los casos he notado que los hacen de una forma bastante compleja para los principiantes (delegados, métodos anónimos, etc...) entonces decidí mostrar como ejecuto yo esta técnica consumiendo un Servicio Web desde una forma Windows, para lo cual escribí este código:
//Instancia del Servicio Web Referenciado
//Este tambien puede ser agregado como un componente desde el diseño de la forma
MDMQ_BC.Service objService = new Service();
private void Load()
{
//Este metodo debe ser ejeutado una sola ves en la vida de la forma, puede ser en el Constructor
//Event Handler necesario para ejecutar acciones cuando llegue la respuesta
objService.ConsultaNombresCompleted += new ConsultaNombresCompletedEventHandler(objService_ConsultaNombresCompleted);
}
void objService_ConsultaNombresCompleted(object sender, ConsultaNombresCompletedEventArgs e)
{
//Preguntamos si la consulta fue bien
if (e.Error == null)
{
//Si la consulta se ejecuto sin problemas revisamos el resultado de la misma
if (e.Result.Codigo_error == "0")
{
//Si el resultado del proceso es correcto mostramos los datos
MessageBox.Show("Los datos estan correctos");
}
else
{
//Si el resultado del proceso no es correcto mostramos la razón
MessageBox.Show(e.Result.Codigo_error + ": " + e.Result.Texto_error);
}
}
else
{
//Se muestra el error, en una aplicación consistente se debe tambien guradar los detalles del error
//con una estrategia de Loggin correcta (EventLog, Archivos, Mails, etc...)
MessageBox.Show("Ha ocurrido un error realizando la consulta. " + e.Error.Message);
}
}
private void CallAsync()
{
//Lamada al metodo asincronico, este se ejecuta y el Event Handler maneja la respuesta cuando llegue
objService.ConsultaNombresAsync("LOMAS");
}
Aqui unas aclaraciones:
MDMQ_BC es un NameSpace que contiene los objetos que se crean cuando se hace referencia a mi servicio Web de Pruebas, este contiene el Objeto Service que es el proxy que hace las llamadas al Servicio, así mismo tiene métodos que ejecutan las operaciones que posee el Servicio, tanto de modo sincrónico como asincrónico, estos están claramente diferenciados pues el método asincrónico tiene un sufijo "Async"...
Si bien la respuesta va a ser manejada por un método es importante mostrarle al usuario que se esta ejecutando la operación como también que se ha completado, para esto se puede tener un PictureBox con un gif animado que mientras la operación se ejecuta esta visible y cuando esta termina se vuelve invisible al Picturebox, también sería conveniente bloquear controles que ejecuten otras operaciones...
También hay que tomar en cuenta que siempre se deben tener estrategias claras de manejo de excepciones y loging, así la operación de tu aplicación sera consistente y tendrás datos completos y detallados de que sucedió, en este caso del ejemplo hay una estrategia simple que solo muestra el error pero te hace acuerdo que hace falta mas trabajo sobre el tema...
Algo importante que debo mencionar que si se fijan bien no van a encontrar ni una sola estructura try - catch, eso es importante para el performance de la aplicación, en lo posible no se deben usar estos bloques por que aunque no se note siempre degradan el funcionamiento del código, y su finalidad es encontrar EXCEPCIONES no controlar el flujo normal de una aplicación...
Espero que les sirva este codigo y si desean comentar, adelante!!
El nuevo Coldfusion 8 soporta .NET!!!
El articulo completo aquí:
http://www.ftponline.com/channels/net/2007_07/jwaters/
Visual Studio Beta 2 ha sido liberado!!!
Quieren bajarlo??? Aquí esta el link!!!
http://msdn2.microsoft.com/en-ca/vstudio/aa700831.aspx
Quieres usar JSON con tus servicios Web??
http://www.ftponline.com/channels/net/2007_07/dwahlin3/
Data Access Layer con LinQ a SQL
http://www.ftponline.com/vsm/2007_07/magazine/features/rjennings/
Visual Studio 2008: Metricas en tu codigo!!!
No me creen??? Visiten este link:
http://www.ftponline.com/channels/net/2007_07/jlevinson/
Todo sobre WCF!!!
http://msdn2.microsoft.com/en-us/library/bb332338.aspx
Acropolis: Construir aplicaciones mas rapido y realmente orientadas al cliente!!!
Esta herramienta se basa en componentes del .NET Framework 3.0 como WPF y WCF para usar servicios de un modo desacoplado, quieres probalo??
Bajalo de aqui!!
http://www.microsoft.com/downloads/details.aspx?familyid=72386ce5-f206-4d5c-ab09-413b5f31f935&displaylang=en&tm
Microsoft dice que el movimiento OpenSource infringe mas de 235 patentes!!!
Estoy de acuerdo con que el conocimiento debe ser de todos, pero nadie trabaja gratis!!
Si hay una patente que cubre algo no se deberia infringirla por cualquiera sea el motivo!!!
10 Tips de Seguridad que todo Desarrollador debe saber!!
1. Confia en lo que el usuario ingresa solo bajo tu propio riesgo!!!
2. Protegete contra el Buffer Overrun
3. Cuida el Cross-site Scripting
4. Evita que se puedan hacer SQL Inyections
5. Usa los algoritmos de Encritacion Standart
6. Reduce tu superficie de ataque
7. Usa el principio del menor privilegio
8. Usa un manejo de errores apropiado
9. La impersonacion es fragil
10. Escribir aplicaciones que no requieran de privilegios administrativos
Mas detalles de cada una?? Vean este articulo:
http://msdn.microsoft.com//msdnmag/issues/02/09/securitytips/default.aspx
Desarrollo de aplicaciones mobiles!!
Entren a este link:
http://www.ftponline.com/channels/net/2007_05/dfergus/
Windows Vista Beta 2, RC 1 y 2 por expirar
Enterprise Library 3.0
Esta esta ya en su version 3.0 que fue liberada el mes pasado...
Desean probarla y obtener informacion y entrenamiento sobre esta??
Vayan a este link:
http://msdn2.microsoft.com/en-us/library/aa480453.aspx
Un Java SDK para Team Foundation Server
En ese caso pueden usa estas APIS para incorporar en sus IDEs, persoanlizar aplicaciones, etc...
Visitenlo:
http://www.teamprise.com/news/2007/05/teamprise_announces_java_sdk_f.html
Se anuncia SQL Server "Katmai"!!!
"The next generation of Microsoft SQL Server, code-named Katmai, is slated for release next year. Microsoft corporate vice president Ted Kummert will divulge selected details about Katmai during his keynote address at the Business Intelligence conference today.
Preliminary product literature reveals that Katmai will be more deeply integrated with Microsoft Office 2007 system front-end tools. Katmai's reporting capabilities will be more robust, supporting any report size or complexity.
Additionally, it will manage and accept nonrelational data types, including documents, geographic information and XML. Katmai adds new data warehousing capabilities, enables applications to interact with local stores, and can synchronize data from devices to the central data store.
What's more, Katmai supports the next-generation ADO.NET data access framework to define business entities and has LINQ support.
Katmai has shifted SQL Server from scripts to a rules-based management framework, and the contents of entire databases may be encrypted. A resource governor defines individual resource limits and can prioritize workloads.
Private beta testing could begin as early as June, according to an Austrian TechNet blog post published in April. "
PackageThis!!! Llevate el Contenido de MSDN que quieras!!
Es decir si quieres construir tu libreria de ayuda a medida basada en MSDN con esta herramienta lo puedes hacer!!
Quieres probarla?? Aqui esta el link:
http://www.codeplex.com/packagethis
CLR multiplataforma!!!
Bueno que quiere decir esto: Por lo pronto cuando uses Silverlight 1.1 sobre Mac puedes usar C#, VB, Python .NET, etc... pero claro aun no puedes usar las librerias del Framework ni crear aplicaciones de escritorio .NET que funcionen en Mac, por lo pronto....
La version probada al momento es Mac OS X!!!
SilverLight: El reemplazo de Flash??
Ademas puedes usar ademas de JScript tambien todos los lenguajes del CLR es decir C# y VB!!
Ademas hay algo interesante, ya hay un traductor de SWF (Adobe Flash) a XAML lo cual facilita mucho la migracion!! Tambien para AI (Adobe Illustrator) a XAML!!!
Aqui estan los links:
http://www.mikeswanson.com/swf2xaml/
http://www.mikeswanson.com/xamlexport/
Una nueva forma de Autenticacion: Windows CardSpace
Miren este articulo y pruebenlo!! Es realmente facil!!
http://msdn.microsoft.com/msdnmag/issues/07/04/identity/default.aspx
WorkFlow Foundation con Sharepoint 2007
Asi es que decidi claro informarme mucho mas del asunto y encontre este articulo en el cual se muestra mas de Sharepoint 2007 y su integracion con Windows Workflow Foundation, revisenlo es realmente interesante!!!
http://msdn2.microsoft.com/en-us/library/aa830816.aspx
Por que no se usa Team System??
Update: Es importante por que topa, sin querer, un tema de la estructura de la educacion del Ecuador!! Por eso es importante y tambien que apoyen con sus comentarios, asi se tiene una perspectima mas amplia del tema!!!
Windows Vista: Sera??
Siempre un cambio es duro, Vista ha puesto muchas nuevas caracteristicas y claro muchas de ellas ya han sido explotadas creativamente por muchos Hackers, siempre pasa, y claro que tire la primera priedra quien este libre de bugs!!!
Lo unico que realmente no me ha gustado es que es tan pero tan poderoso, que posiblemente tu hardware no aguante!! Claro en gringolandia esto no es un problema, pero si para nostros latinoamericanos que no podemos cambiar tan facil de compu...
Esperemos que como con XP en un tiempo Vista sea el preferido en los escritorios del mundo, no solo por su Aero si no por ser un robusto sistema operativo, despues de todo cuando Linux incorpore capacidades de reconocimiento de voz, interfases graficas a nivel Mac y otras cosas, claro si se ponen de acuerdo todos los que fabrican linux, estaremos en un nuevo sistema operativo que posiblemente sea muy inteligente!!!
MSBuild y WIX
Bueno al buen MSBuild creo que todos los conocemos, es nuestro agente constructor de Team System y WIX??
Windows Installer XML es una caracteristica de Windows Installer que te permite a punta de archivos XML generar ciertas acciones como por ejemplo despues de terminar de generar un Release MSBuild de una ves instalar en los clientes!!!
Genial idea verdad?? Como??
Vayan a este link:
http://msdn.microsoft.com/msdnmag/issues/07/03/wixtricks/default.aspx
Centro para Desarrolladores Principiantes
Aqui puedes encontrar lecciones sobre programacion incluso si no tienes experiencia alguna!!
Aqui claro ellos te guian y proveen de sus versiones Express de Visual Studio de acuerdo claro a lo que te orientes!!!
No dejen de probarlo y recomendarlo!!!
http://msdn.microsoft.com/vstudio/express/beginner/
IIS 7 al Aire!!!
En estos dias fue liberada la version final de IIS 7, quien tiene ya Windows Vista en cualquiera de sus ediciones pues ya lo tiene, la falta algo de funcionalidad pero nada grave y cuando salga el primer Service Pack de Vista, que al parecer no sera en un dia muy lejano como van las cosas, obtendra IIS 7 completo, claro tambien en Windows Longhorn sera una base fundamental, IIS 6 ya era una verdarea maquina en todo aspecto, sabian que solo salio 1 parche para IIS 6?? y la falla que cubria no podia ser explotada remotamente!!! Esto si que me da confianza!!
Si quieren mas detalles puede ir a http://www.iis.net o el articulo de overview en http://msdn.microsoft.com/msdnmag/issues/07/03/iis7/default.aspx?loc=es
Espero que lo prueben pronto por que de verda esta muy bueno!!!
Windows Communication Foundation: No mas productos Next, Next, Next...
Pues bien la configuracion por default funciono bien para el ambiente de desarrollo, pero adivinen?? En una pequeña prueba de carga con apenas 10 conexiones concurrentes, se fue al piso y dejo de funcionar por completo!!
Empece a buscar la razon del problema, la base de datos, que es una Oracle 10g, estaba de maravilla, la red completamente libre, el codigo en pruebas unitarias estaba funcionando de maravilla, algunas pruebas mas y nada...
Cuando empece a reviasr un poco mas las configuraciones de WCF en el servidor y me encontre con algunas cosas...
La primera era que los Bindings(Conexiones de cualquier tipo que soporta WCF, Http, TCP, MSMQ, etc...) tenian un tamaño maximo de mensaje, habia olvidado que WCF funciona como un sistema de mensajeria y claro parametriza ese tipo de cosas, al aumentar ese tamaño se fueron algunas excepciones, pero tambien note que no eran tan claras las excepciones en los clientes... Si pensaron que WCF no pasa los detalles de las excepciones a menos que se le indica lo contrario, tienen toda la razon, tienes que en la configuracion del servicio agregar un comportamiento que le indica al servicio que te de detalles sobre la excepcion...
Extraño verdad?? "Normalmente este tipo de cosas en productos vienen listas para usar..." Asi pense, y dije bueno adelante!!
Despues encontre algo un tanto magico: la rzon por que a las 10 conexiones dejaba de funcionar, el binding Tcp tenia especificado que maximo acepta 10 conexiones!!
"Voila, lo cambio y asunto solucionado", aliviado pense asi, sabran que no, a las mismas 10 conexiones se caia, y es cuando comence a dar vueltas por la Web en busca de respuestas...
Encontre de todo la vedad pero para esto ya cambie a un binding Http, que de paso no tiene limite de conexiones teoricamente, pero encontre otro comportamiento de WCF que limitaba su funcionamiento, y era cuantas instancias de objetos de servicio podia crear, ademas de cuantas peticiones podia procesar simultaneamente y cuantas podia tener en cola mientras procesaba, despues de eso comenzaba a rechazar peticiones, bueno lo configure para las pruebas a un numero bastante mas grande de modo que no moleste, se resolvio el problema claro, pero note algo mas, los mensajes comenzaban a ser bastante grandes, claro necesitaba pasar de 16000 registros cada mensaje, tenian que ser grandes, y mis bindings estaban configurados por default excepto por lo que ya les mencione, nuevamente mis investigaciones me llevaron a determinar que la codificacion del mensaje no era la apropiada: estaba usando Texto Plano, ahi se me hizo claro, estaba poniendo un DataSet relativamente grande y serializado a XML, dentro de un mensaje XML, definitivamente tenia que ser grande!!
Bueno experimiente cambiando a una codificacion llamada MTOM, definitivamente mejoro mucho el tamaño ya era mas aceptable y claro esto hacia que los mesajes viajen mas rapido...
Estas y tantas otras experiencias me han resultado a ratos un poco tensionantes, y mas cuando tuve que poner en produccion el sistema, no es muy grande son 60 usuarios, pero a ratos son los 60 concurrentes y tienes como una salida de 25 mensajes por segundo que ya es respetable, y ahi tambien tuve que afinarlo un poco mas...
Estoy preparando un articulo sobre WCF para aclarar este tipo de cosas, espero que con eso menos gente pase lo que yo pase y se cambie tambien la idea de Microsoft tiene solo productos que se instalan y funcionan!!!
Windows Communication Foundation es muy conservador instalado por default, definitivamente tienes que afinarlo....
Tantas maravillas juntas!! Hacia donde vamos??
Pues bien, como va la tecnologia me atrevo a decir que en 5 o 10 años estaremos solo "dibujando" modelos de como queremos que el software se comporte, desde diferentes perspectivas claro, me atrevo a decir esto por las diversas tecnologias emergentes, tanto en el mundo .NET como en el mundo OpenSource...
En general mi afirmacion esta apoyada por lo que se conoce como Model Driven Development, este esta tomando fuerza ya en muchos paises y especial en la plataforma de Java, con sus IDEs y demas, la idea claro es usar diagramas basados en estandares para generar codigo, el gran problema ahi es que las representaciones universales como UML 2.0 no pueden representar por completo las reglas de negocio y claro como normalmente sucede en esa plataforma, hay tantos esfuerzos por separado y cada cual jalando para su lado, que hasta no tener algo como la recientemente formada Linux Foundation, no tendra una clara direccion...
Y Microsoft??
Pues la verdad si uno se pone a revisar, tiene muchas iniciativas para acelerar el desarrollo de aplicaciones, Windows WorkFlow Foundation es la mas recientemente liberada, asi como complementos a esta como son Windows Communication Foundation y Windows Presentation Foundation, es cierto tambien que persiguen no solo el objetivo de mejorar el tiempo de desarrollo de aplicaciones si no otros mas como llevar a un nivel de abstraccion mas alto las comunicaciones, etc...
Pero tambien hay otras iniciativas muy interesantes, LinQ por ejemplo (http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx), permite extraer datos de una forma natural para un desarrollador de C# o VB, es decir adios a SqlConnection y otros objetos ADO .NET, a muchos desarrolladores antiguos les resultara muy familiar poder utilizar un lenguaje de consulta dentro de su codigo, por ejemplo Fox lo tenia hace mucho tiempo, tambien tiene la base integrada a su entorno, pero LinQ no se limita a extraer datos de una manera natural de cualquier base de datos a la que se le configure, si no tambien puede extraerlos desde fuentes de datos XML, podria ser un Web Service, o incluso de un DataSet, lo cual realmente expande las posibilidades!!
A esta iniciativa le complementa ADO Entity Framework (http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx), este Framework genera todas las clases necesarias para tratar a la base de datos tal cual fuera un objeto, por detras claro hace toda la carpinteria de los conocidos DataProviders, y claro ya se imaginaran todo esto tendra sus Wizards y diseñadores incluidos, al momento como esta en beta funcionan bastante bien los wizards pero aun te toca cambiar en XML ciertas cosas...
Muy bien esto ayuda mucho, pero aun hay mas, han escuchado de la iniciativa de los Software Factories?? (http://msdn2.microsoft.com/en-us/teamsystem/aa718951.aspx) Estos son un conjunto de practicas probadas, de Microsoft Patterns and Practices, que se integran en tu IDE y a manera de Wizards "conversan" contigo para estructurar proyectos de diversas indoles, desde Sevicios Web o de Windows Communication Foundation, hasta SmartClients, ademas tienen "Recetas" para ejecutar algunas tareas muy comunes, nuevamente esto te ahorra mucho tiempo...
Hay otras mas como los DSL (Domain Specific Lenguages, http://compose.labri.fr/documentation/dsl/dsl_overview.php3) que pretender mejorar la definicion de las reglas de negocio, etc, etc, etc....
Claro tambien hay herramientas que cubren otros aspectos como Team System el asunto de colaboracion y metodologia de desarrollo, Project Portfolio Server (http://office.microsoft.com/en-us/portfolioserver/FX101674151033.aspx) el desarrollo de los proyectos, etc, etc, etc...
Para verlo mejor si les recomiendo que lean y experimenten con estos productos, tanto los de dearrollo como los de administracion, asi uno nota algo muy interesante: nada de esto esta desconectado entre si!! Eso es de verdad genial por que la iniciativa tiene metas claras y todas jalan para un mismo lado lo que permite que Microsoft avance rapido en el tema...
Como ven no se ha quedado muy atras Microsoft, en un fututo no muy lejano me atrevo a decir que no tendremos Visual Studio, tendremos algo asi como Visual Software Factory o algo por el estilo, asi es que posiblemente todos estemos un poco mas dedicados a resolver problemas a un nivel mas de procesos, antes de que lidiar con el lenguaje o las conexiones a la base de datos...
Hay empresas como Rational que tienen tambien suites muy aproximadas a lo que menciono aqui, claro esto es bastante caro por lo pronto y en consecuencia prohibitivo para muchos desarrolladores que no tienen la suerte de estar en una empresa que pueda utilizar estas herramientas, y tendran que esperar un poco a que la comunidad OpenSource se ponga de acuerdo con respecto al tema...
Por lo pronto yo espero ancioso la salida de LinQ y ADO Entity Framework, que dicen ustedes???