Problemas con SSL y WCF??
Un gran problema que normalmente se presenta cuando se usa SSL para las comunicaciones es que por supuesto no se cuenta con un certificado SSL valido, claro en los exploradores uno tiene la opcion de entrar indicandole al explorador que uno asume el riesgo, pero con WCF esto no puede ser hecho, asi de facil :)
El truco esta en hacer que el metodo que inspecciona la validez del certificado sea sobrecargado o a su vez sobrepuesto por otro (override), como? Hay una par de posibilidades:
1. Crear un metodo con el delegado RemoteCertificateValidationCallback
Este delegado hace que en el evento de ServerCertificateValidationCallback se ejecute la validación que uno quiera, entonces se crea un metodo como este:
public class clsCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
{
return true;
}
public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certtificate, X509Chain chain, SslPolicyErrors errors)
{
//Aqui las validaciones, yo siempre acepto el certificado, no lo hagan en casa!!
return true;
}
}
Y claro hay que ponerlo como manejador del evento:
ServicePointManager.ServerCertificateValidationCallback =
clsCertificatePolicy.RemoteCertificateValidationCallback;
Este claro debe estar antes de la o las llamadas, les aconsejo lo agreguen en un lugar general, es decir por ejemplo cuando su aplicación inicia.
Pero hay un metodo aun mas facil:
2. Usando una expresion lambda lo podemos hacer asi:
ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);
A quien se le ocurrio las epxresiones lambda deberia ser premiado!!
Espero que les sirva…
P.D.: No fui muy explicito en algunos detalles, la clase que propongo debe estar junto al proxy cliente que se usa para la comunicacion del cliente WCF hacia el servidor, y la asignacion del manejador del evento deber ser hecha en lo posible cuando inicia el programa, antes de usar el cliente WCF, solo tiene que ser hecha una sola vez!
Cualquier duda por favor avisenme!
Performance Counters de WCF
Desde que se inventaron esos famosos contadores de rendimiento que incorpora Windows definitivamente la vida de los desarrolladores se volvio mas clara!! Uno puede saber muchas cosas, como por ejemplo cuantas llamadas se hace por segundo al servicio, o a un endpoint especifico, o aun metodo especifico!! No les agradaria?? Pues a mi me sirve mucho para las tareas de mejoramiento y para entender como se estan comportando los servicios y los clientes de los mismos claro, realmente muchos datos para tan poco tiempo!!!
Como se los habilita? En el config de su aplicacion dentro del tag ServiceModel le agregan esto:
<diagnostics performanceCounters="All"/>
Como es de esperarse los contadores de rendimiento que se habilitan son los llamados ServiceModel (En las lista de contadores salen como ServiceModelEnpoint, ServiceModelOperation y ServiceModelService 3.0.0.0), ahi depende de las instancias que tengas podras ver contadores como llamadas por segundo, duracion de la llamada, etc.
A mi me ha resultado muy util, espero que a ustedes tambien!!
AI Framework con nuevo Release: v0.1.1
Pues si, a pocos dias del primer release, pues hubo que hacerle algunos ajustes, como por ejemplo reconstruir la base de datos de ejemplos para poder usar la forma de prueba de la red de Hopfield, asi mismo agregar algunas funciones de activacion extra para las neuronas, la de identidad hace que las neuronas sumen sus entradas!, arreglar que las cadenas de conexion a la base sean configurables desde el archivo de configuracion, etc…
Con esto espero que sea mucho mas usable el Framework asi la gente se interese mas y sea mas claro el uso que se le puede dar a este, si desean verlo esta aqui.
Espero que les sirva y si tienen algun comentario o desean saber mas del uso del Framework pues solo contactenme!!
Servicio de backup en linea
Y justo ahi es cuando nos damos cuenta de la importancia de un respaldo...
Con la afluencia de los servicios en linea se ha abierto muchos de backups, no todos son gratis u ofrecen muy poco espacio, pero este definitivamente fue ideal...
Encripta tu informacion antes de subirla con un algoritmo Blowfish de 448 bits, virtualmente imposible de romper, y lo hace todo en aproximadamente una hora, es decir vas al almuerzo y cuando vuelves voila!! Tu vida digital esta a salvo!!
No conforme con eso puedes personalizar todo lo que quieras respaldar, para mi caso mi codigo fuente por su puesto, y tambien lo que no quieras respaldar, no solo funciona en Windows si no tambien en MacOS lo cual es una amplia ventaja competitiva!!
Si se animan aqui esta el link: https://mozy.com/?code=FN8WH3 con eso ustedes reciben 2.2GB de almacenamiento y a mi tambien me dan un poco mas de espacio para los backups, olvide mencionar que te dan 256MB gratis por cada nuevo usuario que refieres?? Y sin limite de referidos?? Interesante verdad?? Pero si quieres tener espacio ilimitado puedes pagar como 5$ al mes y listo! Espacio ilimitado!!
Es una buena precaucion tener este servicio, no cuesta y te traera la paz mental que necesitas!!!
Ojala les sirva!!
Artifitial Intelligence Framework Project

Comportamiento Extraño cuando haces commit con SQL Server y ADO .NET??
Lo que sucedia en escencia es que al dar commit en una transaccion sql, por medio del objeto SQLTransaction de ADO .NET, resulta que daba errores como el siguiente: "
This SqlTransaction has completed; it is no longer usable" o "
System.NullReferenceException", la verdad no sabia que pasaba, segun yo el software no fue modificado para nada asi es que le heche la culpa a la base de datos!! Busque tanto que era lo que pasaba y di con algunas posibles explicaciones como por ejemplo que SQL Server no tenia los suficientes recursos y en consecuencia cerraba ciertas transacciones sin avisar, esto si pasaba en SQL 2000 pero lo parcharon, y ese tipo de cosas que suenan a veces un tanto extraordinarias...
No hay peor ciego que el que no quiere ver, asi reza el dicho, y es cierto, lo que sucede es que hace algunos años no era fanatico de lo que ahora se conoce como el Data Access Application Block de Enterprise Library, tenia una clase pequeña que hacia las veces de ese bloque de aplicacion, trataba claro que use las mejores practicas y todo, no se cuando sucedio pero tenia yo dentro de esta clase dos metodos que hacian commit o rollback a la transaccion, y se veian algo asi:
public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
psqlTran.Connection.Close();
}
Pues resulta que nunca supe, aunque dedia suponerlo, que cuando uno usa el metodo Commit o Rollback de un Objeto SQLTransaction la conexion que usa se CIERRA!! y Claro en la segunda instruccion quiere cerrar la conexion que esta cerrada y ese es el origen del error!!
Que ciego!! Pase un buen tiempo luchando con esto por que tengo que agregar que no siempre se daba este error, lo cual es realmente extraño, pero como les digo solo hace falta el commit o el rollback, nada mas!! Entonces debe quedarles algo asi:
public static void CommitTran(SqlTransaction psqlTran)
{
psqlTran.Commit();
}
O mejor aun, usen el Enterprise Library con el Data Access Aplication Block, asi no cometeran errores como el mio!!!
Ojala les sirva!!
Alternativa a AutoCAD MAP??
En esas investigaciones de una alternativa el año pasado me encontre con algo interesante unos controles de ThinkGeo, pero en ese entonces no soportaban el acceso a una base geoespacial como Oracle Spatial, solo soportaban shapefiles lo cual en aplicaciones profesionales realmente no es practico, es decir 300 clientes sobre un solo archivo no es saludable, pero en estos dias he recibido una noticia muy alentadora, en la nueva version de los componentes de ThinkGeo ya se soporta el acceso a bases geoespaciales!! Y de verdad es muy sencillo usarlo, y que mas ventajas uno espera de esto? Simple, los costos pueden recortarse de una manera expectacular!! El costo de una liciencia de AutoCAD MAP 3D puede reemplazar la licencia de los componentes para un servidor web y dar servicio a muchos clientes con la funcionalidad que necesitan(cambiar los datos, mover los shapes, crear nuevos, etc.) y solo pones AutoCAD MAP 3D cuando de verdad lo necesitas!!
Creanme es de verdad una opcion genial esto, quieren una probada?
http://gis.thinkgeo.com/Products/MapSuite30Roadmap/tabid/636/Default.aspx
Ojala les sirva!!
ORA-03113 en .NET, que significa??
SQLNET.EXPIRE_TIME =10
SQLNET.INBOUND_CONNECT_TIMEOUT = 300
SQLNET.SEND_TIMEOUT = 300
SQLNET.RECV_TIMEOUT = 300
Al agregarlos el DBA dijo que solo hacia falta reiniciar el listener, yo la verdad por precaucion reiniciaria el servidor...
Con esto la verdad que se estabilizo bastante, por un rato... Como dije el DBA solo reinicio el listener de la base de datos, despues de otros ORA que aparecieron un tanto erraticos como por ejemplo un ORA-01041 que algunos reportaban como un bug en la base de datos, pues despues volvio a estabilizarse con un ORA-03113: end-of-file on communication channel, y ahora que?? Pues en ese punto ya estaba un poco complicado con la gente de infraestrutura por cuanto ellos insistian en que no hay nada raro en la red, bueno suponiendo eso todo estaba aun mas complicado por cuanto uno usa el pool de conexiones por defecto en .NET y claro no puedes mas que ajustar la cadena de conexion y/o ver los contadores de rendimiento, pero si subitamente las conexiones simplemente se desconectan?? pues las opciones anteriores no son muy valiosas las verdad, pues bueno conversamos un poco, intercambiamos experiencias y todo pero nada era eficaz contra el problema, y claro como normalmente sucede solo a mi aplicacion le pasaba esto y era un hecho que para la gente que maneja la infraestrutura demostraba que algo no estaba bien en mi codigo, de cierto modo tienen razon, pero en que parte!!!
Al dia siguiente se inicio una serie de pruebas que ya estaban fuera de este tema, y fruto de estas pruebas vi la luz!! Sucedio que estaba conectado a la dichosa base de datos con un TOAD, y otra maquina igual, despues de un cierto tiempo, que no medi, TOAD tambien me dio el mismo error un ORA-03113!! y en la otra maquina tambien!! genial!! por que no era el codigo!! Y que es?? Pues parece que entre la base de datos y los clientes existen un par de routers y firewalls, uno de ellos tenia por politica cortar las conexiones a ese servidor despues de un cierto tiempo, este comportamiento ya nos habian comentado que era el mas posible, a uno de los consultores en otro proyecto ya le habia pasado y nosotros no hicimos mas que dar vueltas!!
Soluciones a esto?? Pues hay un parametro en todo sistema operativo para que las conexiones TCP usen un metodo muy conocido llamado KeepAlive, el cual envia cada cierto tiempo una señal a indicar que esta vivo y claro con esto el Firewall las tomaba como conexiones activas, no tanto pero activas al fin, o cambiar las reglas del firewall para que no corte las conexiones bajo ciertas condiciones claro, entonces resumiendo:
Si tienen un error ORA-03113 en cualquiera aplicacion, en mi caso .NET, revisen si alguien no les esta cortando las conexiones!! Prueba simple? Pongan el servidor de base de datos en el mismo switch junto con la maquina que tiene el problema y revisen que no hayan firewalls molestando por ahi, definitivamente con esto pueden probar que su aplicacion esta bien!!
Preguntas? Comentarios? Con gusto los ayudo!!
Cliente WCF detras de un ISA Server o un ProxyServer??
When attempting to invoke any of the generated client class methods, we recieve the following error: "The remote server returned an unexpected response: (407) Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )."
Pero el resto de cosas funcionaban bien!! Internet Explorer, otros programas con acceso a la red y demas!! Que estaba haciendo mal??
Primero pues lo mas evidente, la configuracion de mi cliente en la parte WCF, si ustedes ven en la parte de la configuracion del binding en la seccion transport hay una propiedad llamada proxyCredentialsType en donde puedes decir que credenciales se pasan, claro pasa ISA Server se deben usar las credenciales Windows asi es que intente poner ahi la opcion y pues no no funciono... Mi binding quedaba algo asi
<binding name="wsData" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="4194304" maxBufferPoolSize="4194304" maxReceivedMessageSize="4194304"
messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="128" maxStringContentLength="10000000"
maxArrayLength="65536" maxBytesPerRead="8192" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientcredentialtype="None">proxyCredentialType="Windows"</strong>
realm="" />
<message clientcredentialtype="UserName" algorithmsuite="Default">
</security>
</binding>
Dando vueltas por ahi algunas personas tenian el mismo problema, pero lo mas frustrante es que nadie tenia una respuesta para esto, asi es que segui dando vueltas y en un foro encontre a alguien que si lo logro pero claro despues de una larga charla se llego a la conclusión de que se debia cambiar el machine.config para que se usen las credenciales por defecto, y esto se logra incluyendo estas lineas:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
</defaultProxy>
</system.net>
Entonces con esto es mejor reiniciar la computadora despues de esto magicamente el error desaparece!!
Una acotacion, resulta que el machine.config hay que buscarlo en la carpeta del framework 2.0, por que?? Recuerden que tanto Framework 3.0 y 3.5 son agregados al 2.0 por lo tanto el Framework base es 2.0, si no me creen busquen el machine.config en los otros folders y cuando lo encuentren miren detenidamente las secciones que estan al ultimo...
Ojala les sirva!!
Problemas con los Servicios Windows y .NET??
Después de que dos servicios Windows hecho por mí me han visto la cara… a continuación van algunos pasos que se deben verificar antes de perder tiempo:
Asegurarse que la versión del servicio instalado es el correcto.
Revisar la identidad que se encarga de la ejecución del servicio
La identidad debe tener todos los permisos necesarios que va a utilizar el servicio, por ejemplo:
i. Escribir en directorios del disco duro
ii. Acceso a Internet
Hay dos partes donde se configura la identidad cuando es un servicio que se inicia desde una página Web:
i. La identidad del servicio propio
ii. La identidad del grupo de aplicaciones o application pool; esta identidad debe tener los permisos suficientes para iniciar servicios Windows.
Anécdota : Mi servicio no funcionaba bien, xq la identidad que ejecutaba el servicio no tenía acceso a Internet
La conexión a la base de datos debe ser la correcta
Anécdota : Mi servicio no funcionaba por utilizar TableAdapter, lo cual generaba una cadena de conexión diferente a la usada… de tal forma el error principal era que nunca se conectaba a la base de datos.
No es suficiente registrar sólo las excepciones manejadas, hay que registrar las excepciones que no son manejadas o controladas.
Anécdota : gracias a esto descubrí que estaba trabajando con una versión de librería antigua cuando la excepción me dio a conocer que no existe el método que estaba llamando.
Cuando se trabaja con librerías y hay problemas se debe verificar que se está trabajando con la versión correcta o indagar la posibilidad de que nuestro servicio está tomando la librería de otra ubicación.
Anécdota : Mi servicio fallaba, ya que la librería que utilizaba estaba registrada en el GAC… la verdad no me acuerdo pero era indispensable registrarlo x una aplicación Web… el problema era que esa librería no la estaba actualizando.
Si todos los pasos anteriores ya han sido verificados y aún así el servicio está fallando entonces ahora si hay que revisar el método al que llama el servicio.
Anécdota : Nos jalamos en alguna parte de la programación, si tenemos un Visual Studio instalado en la pc servidor de producción sería más fácil comprobar esto, pero si no podemos hacernos una pequeña aplicación q verifique que el método funciona de forma correcta.
Yo perdí mucho tiempo xq en ves de revisar desde el paso 1, empecé x revisar desde el paso 6…. Así que es recomendable seguir los pasos; considerando que mi servicio estaba funcionando de forma perfecta hasta que se cambiaron las configuraciones del servidor… y se hizo pasa.
ojala esto les ayude a ahorrar un poco de tiempo, modificare este post en futuros dias para hacerlo un poco mas claro y didactico!!!
Problemas con los Performance Counters de Enterprise Library??
The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly.
Cuando queria usar los performance counters (contadores de rendimiento) del Enteprise Library, salia una excepcion con el texto de arriba, quien iba a saber que faltaba installar los contadores!!! Si asi es no lo hace por defecto, asi es que en su instalacion de Enteprise Library debe buscar el comando InstallServices.bat, y con un usuario con suficientes privilegios ejecutarlo en una consola de comandos de VS2005 o 2008, si estan en Vista es mejor abrir una consola de comandos con privilegios elevados y ejecutar el .bat, despues deberian reiniciar su equipo, tambien debe incluir dentro de su instrumentacion lo siguiente:
<instrumentationConfiguration performanceCountersEnabled="true"
eventLoggingEnabled="true" wmiEnabled="false" /%gt
Claro con la seccion antes incluida, la que esta en el post anterior, ahora cuando se tenga que revisar los contadores ya tendran los valores necesarios!!
Disfruten de los contadores de rendimiento!!!
Error al quere utilizar la instrumentacion del Enterprise Library 3.1
<configuration>
<configsections>
<section type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" name="instrumentationConfiguration">
</configsections>
<instrumentationconfiguration wmienabled="true" eventloggingenabled="true" performancecountersenabled="true">
</configuration>
Pues bien segui los pasos al pie de la letra, pero salia un error diciendo que no encontraba el assembly, es decir "Could not load assembly Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null".... Pero ahi estaba!! junto a los ejecutables donde debia estar junto a todos los assemblies que se hace referencia!! Despues de un buen rato dando vueltas por el Internet, encontre una sugerencia, era para otro assembly pero pense que podia funcionar, quitale el PublicKeyToken=null, por que?? Seguramente el assembly fue firmado entonces el valor de PublicKeyToken dejo de ser null, por consiguiente como siempre que te lanza un error el Framework .NET es el Framework el que tiene la razon!! Estaba buscando otro assembly!! Si asi resulta, el mas minimo cambio de version o de ese tipo de metadata en un assembly resulta que le da una identidad diferente al assembly, aun mas estando ya firmado!!!
Bien entonces?? la configuracion queda asi:
<configuration>
<configsections>
<section type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral" name="instrumentationConfiguration">
</configsections>
<instrumentationconfiguration eventloggingenabled="true">
</configuration>
Cierto me dio otro error que aun no soluciono si dejas el tag instrumentationConfiguration como te dice la documentacion de Enterprise Library, de hecho hay algun problema con instanciar ciertos contadores de rendimiento, asi es que por lo pronto los quite hasta solucionar esto...
Por que dejo sin solucion el segundo tema de los contadores de performance?? Pues por que hubiera querido publicar un post completo pero note que este error era bastante problematico y podia bloquear el trabajo de mucha gente, ademas nadie ha dado una solucion especifica al tema por lo cual mas de uno debe estar en apuros como yo estaba...
Esperen mas info sobre el performance counter perdido!!!
Proveedores de para ADO .NET Entity Framework!!
http://www.crlab.com/mysqlnet/
http://crlab.com/oranet/
Visual Studio Team System 2008: Mis experimentos y experiencias
Y para quienes trabajan con Team System?? Esa si era una pregunta de examen!! Pues yo tambien tengo mi ambiente Team System 2005, con Team Foundation Server 2005 y todas las de ley, se puede usar el Team Foundation Server con Visual Studio 2008?? Pues me dijeron que si cuando pregunte a uno de los expertos en el tema, claro ver para creer, asi es que baje el cliente de Team Foundation 2008, llamado Team Explorer 2008 lo encuentran en http://download.microsoft.com, y lo instale a mi Visual Studio Team System 2008, demoro un poco mi instalacion pero de verdad valio la pena!!
Me pude conectar a mi Team Foundation Server 2005 sin problemas, pude ver los documentos normalmente y todo, pero aqui entra lo interesante: Recuerdan ustedes que en Sharepoint Services 2.0 no se registraban correctamente los documentos Office 2007, es decir un docx sale sin icono y si lo quieres editar te baja el archivo como cualquier cosa, bien con el Team Explorer 2008 resulta que si ves el documento desde Visual Studio en el Tab del Team Explorer lo ves como un documento Office!! Al fin!! No me hace falta hacer la maroma que hay que hacer para cambiar TFS 2005 a Sharepoint Services 3.0!!! Eso si que es un alivio, y ademas me permite editarlos!!! Felicidad completa!! Esto incluye poder usar Project 2007 y que se aten los Workitems a tu TFS como se debe!!
De verdad estoy muy feliz por esto, uno puede usar tranquilamente las nuevas versiones sin temor a perder su trabajo ni tener regresiones!! Wow y gracias a los equipos de desarrollo de VS y TFS por acordarse y tomar en cuenta las sugerencias de los usuarios sobre el tema de compatibilidad hacia atras!!
En resumen lo que soporta Visual Studio 2008 Team System en el tema compatibilidad hacia atras es:
- Multitarget (Frameworks 2.0, 3.0 y 3.5)
- Soporte para proyectos de varios Frameworks en una solucion
Team Explorer 2008:
- Compatibilidad con Tema Foundation Server 2005
- Compatibilidad con Office 2007 para editar documentos
- Plugins para Office 2007 de Integracion (Administracion de WorkItems)
Pues entonces si quieren probar no tengan miedo, haganlo con confianza!!!
P.d.: Ademas mi ambiente de desarrollo es Windows Vista Business, tengo tambien Visual Studio 2005 Team System y Team Explorer 2005, no me trae conflictos para nada!!
Launch 2008: Visual Studio, SQL Server y Windows 2008
Los temas de los demos fueron:
Visual Studio 2008:
- Compatibilidad entre Frameworks
- Breve Muestra de ADO Entity Framework y LinQ a SQL
- AJAX y ASP .NET (Este fue el que me fallo!!)
- Master Pages anidados
- Membership y Roles para ASP. NET y Windows Forms (Esto es realmente simple y genial)
- Silverlight Media (Este demo tambien es genial pero un poco largo)
- Office Business Applications con todo lo anteriormente aprendido
La verdad nos pasamos del tiempo que teniamos y no mostramos todo lo que queriamos mostrar, espero ir haciendo posts de como hacer cada uno de estos demos...
El codigo de los demos va a estar en www.comunidadesandinas.com o si lo desean con instrucciones y todo pues me avisan y yo se los entrego y explico!!
Windows Vista SP1: Mi opinión
Tengo una Toshiba Satellite A217-4757, muy buena computadora, vino con Windows Vista home, por mi necesidad de trabajo le hice un Upgrade a una edición Business, bueno desde que lo he usado me ha agradado Windows Vista, es bastante estable, a excepción de un par de pantallas azules que no se que sucedio, compatible con todo lo que yo uso, normalmente aplicaciones para desarrollar software y hacer experimentos :P, y claro admito haber experimentado ciertos bugs como la lentitud terrible para copiar archivos, demoras en iniciar el SO, etc...
A lo largo de casi 6 meses que tengo la computadora, se han bajado una seria de parches desde Windows Update, lo cual no ha mejorado notablemente el desempeño de mi computadora pero si su estabilidad, y claro no solo MS ha liberado parches, tambien los fabricantes de drivers como ATI e incluso Toshiba ha pasado de la version 1.2 de BIOS a la 1.9, y si ha cambiado cierto comportamiento de bateria por ejemplo, pues bien estaba esperando el SP1 de Vista, pues lei que incluia muchas mejoras en cuanto a velocidad, seguridad y compatibilidad, bien hace unos dias Windows Update me notifico que podia instalar el SP1, no lo dude y le deje toda la noche a que lo haga, cuando termino de bajarse (es sorprendente que un SP tenga solo 65MB, si lo bajan de MSDN resulta que pesa 450MB+, lo que sucede es que esta empacado con casi todos los lenguajes que actualmente distribuye Vista, pero solo un lenguaje pesa 65MB, es decir si eres un usuario de casa mejor usa Windows Update) me pidio reiniciar la maquina, y empezo a instalarse, fue en tres fase, que hace cada una la verdad ni idea, termino, se reinicio y luego claro de iniciarse la primera vez no note nada extraño, es decir en apariencia no se nota nada, pero un momento se inicio mas rapido?? Pues al parecer si, bien a copiar archivos, en efecto copio mucho mas rapido!! Pues que mas puede haber mejorado?? Segun yo incluso el IE mejoro de velocidad, tambien sabia que habian un par de mejoras en el tema ReadyBoost, asi es que formatee mi SD Card que hace de memory ReadyBoost, ahi me encontre con soporte para exFAT esto es nuevo, luego claro le ensamble de nuevo a mi SD con ReadyBoost y de nuevo mi maquina sintio un pequeño empujon de velocidad, hasta aqui mi experiencia con el SP1 de Windows Vista ha sido positiva, asi es que si dudan en instalarlo no lo hagan mas, instalen y disfruten!!!
Diferencia entre ADO Entity Framework Dec CTP y Beta 3
Ademas en la generacion de las clases resulta que en la entidad como tal el metodo Add, que podia ser usado para agregar entidades, ya no es publico, solo puede ser usado internamente, en su defecto pueden usar Insert o InsertOnSubmit, el segundo es mas facil de usar y si usaron Add antes pueden solo hacer un reemplazo simple sin cambiar parametros, pero cuidado se cambie por el Add que existe en los designers que eso si les puede causar problemas...
Mi conclucion es que el paso de Beta 2 a RTM en Visual 2008 fue 99% limpio, solo con Entity Framework tuvimos un poco de problemas pero nada que definitivamente sea un impedimento mayor...
Problemas de eficiencia usando WCF 3.0?? Aqui esta la solución!!
Ahi no termina la historia, comenzo a crecer el sistema y mucho mas de lo planeado y volvio a ponerse lento, y mas lento, y mas lento!!! Si bien los usuarios no tenian mucho problema con la lentitud por que la interfase de usuario es asincronica, la verdad yo veia que tenia cada vez mas problemas con la velocidad, ciertos procesos internos realmente tomaban demasiado tiempo, nuevamente entre a buscar el problema, mucho debug del codigo no ayudaba mucho asi es que tenia que probar tecnicas de profile, un producto que me ayudo en verdad es el ANTS profiles de RedGate (http://www.red-gate.com/products/ANTS_Profiler/index.htm) en mi opinion cualquier desarrollador profesional deberia tener una herramienta como esta, ayudo mucho y mas que nada encontre algunas cosas interesantes:
1. Cuando habia comunicacion entre el Cliente WCF y el Servidor WCF el consumo de memoria era realmente un problema, especialmente mi servicio el cual comenzaba a crecer y no dejaba de hacerlo, e incluso nunca liberaba memoria, asi este inactivo algunos días, lo cual me tenia confundido, incluso revisaba con el profiler la memoria, como estaba actuando el GC y cosas relacionadas lo que encontre es que habian millones de objetos de tipo String que no se morían, eso era raro por cuanto yo apenas si usaba un par de constantes dentro del servicio, no ocupaban tanta memoria pero estaban ahi...
2. Despues aisle la funcionalidad del servicio y lo separe en 2, con lo cual pude analizar mejor, resulta que tenia 2 servicios, A y B, donde A era la cara para los programas clientes y a su vez era cliente de B, y B servia como una capa de persistencia, saben que fue lo importante, solo los programas que actuaban como clientes WCF crecian mucho en memoria, el servicio B no pasaba de los 150MB mientras el servicio A llegaba a los 2GB, como es un servidor 32 bits se moria el servicio por su puesto con un System.OutOfMemoryException, esto claro afectaba la disponibilidad del servicio...
Bien al parecer encontre un patron, iba entonces en busqueda de que era exactamente, busque en foros pero nadie tenia un problema similar, estaba casi por rendirme cuando despues de algunos meses note algo extraño: tenia una laptop nueva con Windows Vista y un beta de Visual Studio 2008, en esa maquina funcionaba mucho mas rapido el cliente y no comia tanta memoria, cual era la diferencia?? En un principio pense que era que Vista al tener el Framework 3.0 como parte del sistema operativo esto hacia que WCF sea mas eficiente, pero habia otro cliente Vista que estaba en un punto mas bien intermedio, un tanto rapido pero normalmente lento, descartando todo tipo de problemas de comunicaciones y hardware, resulta que habia una cosa que no habia tomado en cuenta, el Framework 3.5....
Pero que tenia este que comenzaba a notar mejoría?? Un prerequisito importante, los Service Packs 1 de los Frameworks 2.0 y 3.0!!! Y por si acaso tambien el Framework 3.5 tiene un Garbage Collector nuevo y mejorado!! Investigando un poco mas encontre los Knowledge Base de dichos Service Packs (2.0 http://support.microsoft.com/kb/945757, 3.0 http://support.microsoft.com/kb/945826) y pues ni modo me los lei todo para ver que tanto podian afectar a mi software, pero habia estado probando inconcientemente en el cliente Vista con Framework 3.5 beta, y todo funcionaba ok, asi es que hice un par de pruebas mas y comence a desplegar el Framework 3.5 pero el RTM, tanto en el Servidor como en los clientes, el resultado?? Una espectacular mejora en los tiempos de respuesta, al fin vi mi problema resuelto!!!
Ahora tengan cuidado con el SP1 de Framework 2.0 por que si cambia algunas cosas, si deciden dar el paso pues ejecuten abosultamente todas las pruebas del software de nuevo con Service Pack puesto asi despues no tendran sorpresas de tipo mi codigo no funciona o estaba funcionando y ahora ya no....
Espero que esto les de algo de orientación, a mi me costo meses lidiar con este problema...
Entendiendo las Expresiones Lambda al Fin!!!
Me intereso mucho entender como es que funcionan, asi es que investigando un poco resulta que no es nada magico en verdad, simplemente es un uso inteligente de algunas caracteristicas de los lenguages .NET, y voy a tratar de mostrarselos:
1. Una expresion Lambda es un metodo anonimo que puede ser usado para crear delegados o arboles de expresiones
2. Un metodo anonimo es una porcion de codigo que puede ser creada para ser usada como un delegado, a pesar de que es un metodo no es necesario declararlo, es por esto que se lo llama anonimo, esto no es nuevo viene desde C# 2.0, un link interesante para entender mejor es sobre esto es el siguiente: http://msdn.microsoft.com/msdnmag/issues/06/00/C20/default.aspx
3. Un delegado es lo que antiguamente se conocia como un puntero a una funcion, cuando necesitas pasar una funcion como un parametros es muy util, mas informacion?? Encuentrala aqui: http://msdn2.microsoft.com/en-us/library/ms173171(VS.80).aspx
4. Arbol de expresiones: quien no ha construido esto en la Universidad!! Es un tipico arbol para evaluar expresiones, claro la gente de MS lo vuelve un poco mas completo al tema y lo usa como base para cosas muy interesantes, mas informacion: http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees
Bien ahora que tenemos mas claros los conceptos que se usan, podemos hacer la comparacion que a mi me funciono para entenderlo correctamente:
Partiendo del concepto de que una expresion Lambda es una funcion anonima, pero con una notacion diferente, podemos entonces entender que tiene parametros de entrada y devuelve un valor, vamos bien, pero cual es la notacion correcta?? Este articulo me guio hacia la luz!!
http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx
Y de ahi tomare prestado el ejemplo de las funciones para compararlos y explicarlos:
C# 2.0
static int Fibonacci (int x)
{
if (x <= 1) return 1; return Fibonacci (x-1) + Fibonacci (x-2); } C# 3.0 (Hace falta referenciar System.Core y System.Func) Func
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Como ven estas funciones nos ayudan con la famosa serie de Fibonaccim y las 2 funcionan muy pero muy bien, claro vamos ha hacer las relaciones correspondientes para que vean que son lo mismo:
Declaracion y Parametros de entrada
C# 2.0: La tipica declaracion de la funcion en la primera linea:
static int Fibonacci (int x)
Funcion estatica llamada Fibonacci, tiene un parametro de entradad de tipo int (int en C#, Int32 para el FCL, Integer para VB) y devuelve un resultado de tipo int (lo mismo que el parentesis anterior)
C# 3.0:
Parte de la segunda linea
fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Como estan pensando, solo n es la declaracion de la funcion, donde n es el parametro de entrada, pueden haber mas de un parametro de entrada, en este caso no es necesario, y se preguntaran: Y los tipos del parametro y el tipo del resultado de la funcion?? Esta es la parte interesante, aqui se usa una caracterista nueva que se llama inferencia de tipos, cuando la expresion lambda esta completa y bien escrita el compilador puede inferir los tipos que se usan, como se imaginaran entonces para que una expresion lambda funcione como nosotros deseamos debemos tener cuidado como escribimos el cuerpo de la misma, por cuanto el inferir el tipo no es tan sencillo como se piensa... Y el nombre de la funcion?? Como es un metodo anonimo no le hace falta la verdad, internamente se le asigna un nombre automaticamente para poder referenciarlo...
Cuerpo de la funcion e instrucciones
C# 2.0: lineas 2, 3, 4, 5 y 6
{
if (x <= 1) return 1; return Fibonacci (x-1) + Fibonacci (x-2); } Delimitan la funcion las llaves en la linea 2 y 6, dentro tenemos un if que verifica que el parametro no este fuera del rago y si lo esta devuelve un valor por default (1), si no hace un calculo simple basado en recursividad para ser devuelvo con una sentencia return, nada dificil verdad?? C# 3.0: Otra vez parte de la segunda linea fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n;
Muy bien aqui lo que hace es con el operador ?: (si no le conocen mucho a este operador entonces vayan a http://fcolomas.blogspot.com/2007/12/el-gourmet-net-que-es-mas-eficiente-un.html) reemplazar la funcionalidad del if y la linea del return de la funcion c# 2.0, es decir si n que es el parametro de entrada declarado antes es mayor que 1 entonces usa la recursividad para llamar de nuevo a la funcion y ejecutar un calculo simple, de lo contrario el valor que se devuelve es n.
Supongo que aun tienen preguntas, voy a aclarar algunas cosas que a mi me saltarian como dudas:
1. Que es esto de la linea 1 del la funcion en C# 3.0??
Resulta que como la expresion lambda es un metodo anonimo (puede tambien ser llamado funcion anonima) y como voy a requerir usarlo recursivamente de algun modo debo poder volver a llamarlo!! Recuerden que un metodo anonimo no tiene nombre, entonces como lo vuelvo a usar?? Justamente con el tipo Func
2. Y el operador => que significa??
Este es la separacion de la expresion, con esta se sabe que el lado izquierdo contiene los parametros y el lado derecho las instrucciones, ahora si desean ejecutar mas instrucciones claro que se puede, al lado derecho ponen un par de llaves y dentro las instrucciones tal cual una funcion y voila!!
Esas dos son las mas notorias a mi modo de ver, ahora si ustedes tienen mas preguntas pues con todo gusto!!!
Algunos links utiles:
Expresiones Lambda para VB
http://msdn.microsoft.com/msdnmag/issues/07/09/BasicInstincts/default.aspx
Expresiones Lambda para C# desde MSDN
http://msdn2.microsoft.com/en-us/library/bb397687.aspx
Ora-01000: Que paso otra vez!!!
Bueno y como se lo soluciona?? como les dije hay que cerrar y darles dispose explicitamente a los DataReader que se usan, en el caso de usar un DataAdapter resultaria algo asi:
Si no esta muy grand la imagen, haganle click y la veran mejor....
En la linea 162 y 163 esta la respuesta al problema, claro esta especializada para usar objetos del DataProvider nativo de Oracle, pero eso si es mejor tambien que aumenten un poco el parametro de cursores abiertos en su base de datos...
Actualizacion! La imagen original es muy pequeña, asi es que espero esta este mejor! Hagalen un par de veces click y la veran completa!
Mis aventuras con AutoCAD MAP: Arquitectura
En respuesta a un comentario desde Perú, voy a aclarar unas dudas y en lo posible guiar en algo el uso mas tipico para estas aplicaciones: El Catastro.
Con las capacidades de AutoCAD Map sobre los datos geoespaciales, es decir mapas que pueden llegar a ser muy complejos, es realmente una excelente opción usarlo!! Imaginen que no tienen que manejar directamente los datos espaciales si no que esto es por completo automatico!!! Y de la fuente o fuentes de información que uno disponga!!
Normalmente el primer problema es que los datos geoespaciales tengan relación con otros datos relacionales (es decir que los graficos puedan ser relacionados con sus atributos alfanumericos), para esto se debe tomar una estrategia que vaya de la mano con la prospectiva tecnologica que la empresa a la que estamos ayudando ha elegido, esto especialmente por donde se almacenan los datos y por que generalmente ya existen datos que se desean que se usen para los propositos mencionados, para esto escribire otro post que sera bastante extenso en verdad...
Supongamos que Oracle es nuestro repositorio principal y tendra dentro de la misma tabla los datos espaciales, la clave que lo identifica y otros datos necesarios, y ademas que este esquema fue definido con las herramientas de AutoCAD Map para este fin, como mencione antes esto cubrire en otro post...
Bien la parte de la pregunta que quiero responder es si se puede hacer que un programa .NET haga de host para AutoCAD Map y no al reves como he mencionado antes, ademas con esta condicion la idea de poder seleccionar la parcela (tambien conocido como lote) y que se muestre y modifique la informacion de la misma, si que la puso dificil nuestro amigo!!
Bien la primera parte es factible, usando a AutoCAD como objeto COM dentro del formulario, pero claro en ese punto es un tanto dificil manejar cierta funcionalidad como los FDO que nos interesan justamente para el segundo proposito, voy a tratar de hacer esto como lo pide nuestro amigo por que la verdad lo he hecho al reves, es decir que AutoCAD sea el Host del codigo .NET y si se puede obtener la informacion de la parcela y modificarla claro, de hecho es factible que seleccionas la parcela y obtienes la informacion, la cambias y todo, e incluso puedes dibujar la parcela, crear los datos y todo!! Con .NET claro!!!
Mi primera recomencadación es que deficitivamente se use AutoCAD Map 3d 2008 Sp1 como el cliente de la base de datos, aun le falta evolucion a la tecnologia geoespacial para poder ser usada bien con los conceptos de SOA, pero va por buen camino...
La estrategia que se usa dentro del cliente para manipular los datos es mixta, es decir se usa FDO que contiene AutoCAD para manipular toda la parte grafica, y .NET para poder modificar los datos alfanumericos asociados, claro entre estos dos existira un vinculo que es la clave unica que identifica al registro que mantiene los datos, como planteamos antes estos estan juntos y es bastante sencillo hacer este tipo de operaciones por cuanto FDO se basa en la arquitectura de los Proveedores de Datos .NET, es decir uno los usa como usar SQL Sever u Oracle!!
En la base de datos como comente antes se deben tomar una serie extensa de consideraciones pero lo que si recomiendo por completo es que para la creacion del esquema de datos completo se use las herramientas de AutoCAD Map, esto es por que este genera ciertas columnas para su uso y asi mismo alimenta ciertas tablas especificas de la base de datos (especialmente en Oracle) para que los datos graficos esten siempre consistentes, y debe ser todo esl esquema!! Ahora si existen tablas que se planifica que no contengan datos graficos si no sirvan para otros propositos entonces pueden ser creadas en los administradores de la base de datos elegida...
Para operaciones simples es tambien una muy buena opcion evaluar los controles que provee ThinkGeo (http://www.thinkgeo.com), son realmente una excelente opcion y en mas de un caso un buen reemplazo para AutoCAD Map!!!