jueves, 19 de febrero de 2015

Conceptos básicos de Asp.Net MVC

Hola amigos, hace algún tiempo dicté una charla de conceptos básicos de Asp.Net MVC, aquí les comparto la presentación, espero sea de utilidad. Saludos!

domingo, 8 de febrero de 2015

!Apunte semanal - Problemas al depurar tareas en paralelo?


Hola amigos, en anteriores artículos tuvimos una introducción al paralelismo, y mucho más enfocado en lo que Microsoft .Net nos ofrece para trabajar con él, en resumidas cuentas tenemos la TPL que es la librería que nos permite trabajar con paralelismo de una forma muy sencilla, y que nos ofrece varias formas de trabajo como lo son el trabajo con datos a través de ciclos paralelos, paralelismo a través de tareas (Task), Plinq que nos permite realizar consultas linq en paralelo, entre otras. Y entre estas formas de trabajo hay una en particular que se convierte en transversal para todas, y es la depuración de procesos en paralelo, de suma importancia y utilidad para llevar un paso a paso de las instrucciones en las cuales estemos empleando el paralelismo, ya que en este tipo de instrucciones en paralelo podemos tener problemas a la hora de depurar, ya que cuando estamos haciendo paso a paso de una instrucción en ocasiones el depurador se salta y va a otra instrucción que se está ejecutando en simultánea, y luego vuelve a anterior, con lo cual tenemos un gran problema para comprender y seguir la depuración de una tarea en específico, yo por ejemplo he tenido este problema cuando trabajo referenciando dlls de otros proyectos de los cuales no tengo los proyectos agregados en la solución que estoy depurando.


Pues bueno para solucionar este problema si es que se nos presenta, podemos usar la clase Debugger del NameSpace System.Diagnostics, la cual nos permitirá hacer un punto de ruptura a través del método Break(), veamos cómo lo podemos hacer:

Primero vamos a crear en una aplicación de consola con una ejecución de tareas que invoquen diferentes métodos, tal como vemos a continuación:

        static void Main(string[] args)
        {
            Task t = new Task(TareaA);
            t.Start();
 
            Task t2 = new Task(TareaB);
            t2.Start();
 
            Task t3 = new Task(TareaC);
            t3.Start();
 
            Task.WaitAll(new Task[] { t, t2, t3 });
            Console.Write("Terminó la ejecución de las tareas A, B y C.");
        }

 Y ahora vamos usar un punto de ruptura en alguna de las tareas:

        private static void TareaA()
        {
            Debugger.Break();
            Thread.Sleep(2000);
            Console.Write("Se ejecutó la tárea A");
        }

Con este Debugger.Break() ahora podemos depurar el contenido de la tarea A, sin tener problemas de con las otras tareas que se ejecutan en paralelo, adicional también nos podría ser de utilidad cuando tenemos instrucciones muy tediosas de depurar, por ejemplo si estamos recorriendo una lista de 10000 ítems y tenemos un error que solo se genera con alguno de los ítems, podríamos realizar una condicional y usar el Debugger.Break para capturar con mayor facilidad el problema (aunque también lo podríamos hacer con las condicionales que nos ofrecen los puntos de interrupción de Visual Studio).

Bueno y eso es todo de este apunte semanal, espero sea de utilidad.

Saludos y buena suerte!

sábado, 31 de enero de 2015

!Apunte semanal - Configurando el pool de conexiones de Entity Framework.


Sin lugar a dudas uno de los aspectos más importantes y que pueden afectar favorablemente o desfavorablemente el rendimiento de nuestras aplicaciones, es el acceso a fuentes de datos, ya que implica un costo considerable establecer conexión con dichas fuentes. Es por eso que una técnica muy utilizada para lidiar con este problema es el connection pooling o pool de conexiones, el cual permite mantener un número definido de conexiones abiertas  y disponibles para que la aplicación o aplicaciones puedan usarlas sin tener que esperar a abrir una conexión, y es el pool quien se encarga de mantener estas conexiones y distribuirlas según se requiera.


Entity Framework a diferencia de otros ORM's no maneja directamente el pool de sesiones, sino que lo hace a través de ADO.Net, quien se encarga de manejar los pool para los diferentes Data Providers.

¿Y cómo puedo configurar este pool de Ado.Net?

ADO.Net maneja un pool de conexiones por cada cadena de conexión que tengamos en nuestra aplicación, quiere decir que si nos conectamos a dos bases de datos diferentes habrá un pool para cada una de ellas, o si generamos cadenas de conexión dinámicamente en tiempo de ejecución tendremos N pools de conexiones dependiendo de las que generemos (Esto de generar cadenas de conexión en tiempo de ejecución, es muy contraproducente para el manejo del pool), es por esto que si queremos configurar el pool de conexiones debemos hacerlo modificando los siguientes parámetros:

Parámetros a modificar en la cadena de conexión:

<add name="ConnectioName" connectionString="data source=TAVOPC;initial catalog=PoolDemo;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework;
Connection Lifetime=120; Max Pool Size=20; Min Pool Size = 1; Pooling=True;" providerName="System.Data.SqlClient" />

Como podemos ver hacemos uso de cuatro parámetros en la cadena de conexión que corresponden a la configuración del pool, aunque sus nombres son muy dicientes veamos de que se trata cada uno:

Connection LifeTime: Define el tiempo de duración de las conexiones abiertas, se compara la hora en que se creó la conexión con el tiempo actual, para determinar según esta variable si se destruye la conexión o si permanece en pool, su valor esta dado en segundos y su valor por defecto es 0 que indica configurar el mayor tiempo de duración permitido.

Max Pool Size: Define el número máximo de conexiones gestionadas por el pool.

Min Pool Size: Define el número mínimo de conexiones gestionadas por el pool.

Pooling: Define si se va a utilizar el pool para gestionar las conexiones o no.

Bueno y eso es todo de este apunte semanal, espero sea de utilidad.

Saludos y buena suerte!

viernes, 16 de enero de 2015

!Apunte semanal - Utilizar nombres de variables con palabras reservadas de C#

Hola amigos, en este apunte semanal les quiero compartir un truco bastante sencillo, que si bien no es una buena práctica puede servir en algún caso extremo que tengamos y que por motivos de fuerza mayor necesitemos utilizar, sin embargo solo lo recomiendo en un caso extremo que tengamos.

Sabemos que en C# y en los diferentes lenguajes no podemos usar las palabras reservadas del lenguaje para el nombramiento de variables como por ejemplo, using, namespace, int, string y un lago etcétera, ya que obtendremos un error como el siguiente:



Como en este caso se quiere utilizar el nombre de variable int, se debe anteponer el carácter @ al nombre de la variable, como se muestra a continuación:


Como podemos apreciar no es una buena práctica ni muy cómodo para escribir, leer o mantener el código, sin embargo como digo puede servir en un caso de fuerza mayor, o por ejemplo si queremos interactuar con código escrito en otro lenguaje, es decir si por ejemplo tenemos una librería de clases escrita en VisualBasic .net y en esta librería tenemos escrita alguna palabra reservada de C# pero que no es reservada en Vb, nos compilaría perfectamente la librería, pero al momento de invocarla desde C# tendríamos un error de compilación, en este caso podemos resolver el problema usando el carácter @ para referirnos a la palabra reservada.

Bueno y eso es todo de este apunte semanal, espero sea de utilidad.

Saludos y buena suerte!

jueves, 15 de enero de 2015

Microsoft MVP .Net 2015


Hola amigos, al inicio de este año recibí una gran noticia por parte de Microsoft, más específicamente del programa Microsoft MVP, que es un programa en el cual se reconocen a líderes excepcionales de la comunidad por sus aportes en ella y por su especialidad en algún producto de Microsoft. Pues bien, esa gran noticia es que he sido reconocido este año como Microsoft MVP en la especialidad de .NET.


Es para mí un orgullo pertenecer a este selecto grupo y no quería dejar pasar la oportunidad para
agradecerles a ustedes, Comunidad, quienes hacen esto posible, gracias a ti, que lees mis post y aportas a ellos, pues ustedes son quienes fortalecen la labor de apasionados por la tecnología como yo y como muchos otros, que buscan aportar su granito de arena para que la comunidad tecnológica siga creciendo y cambiando el mundo.

Aprovecho también para felicitar a los nuevos MVP`s de mi país Colombia, y a todos los nuevos MVP`s de todo el mundo, y a los demás MVP`s antiguos quienes aportan a la comunidad en su especialidad.

Muchas gracias a todos! y espero poder seguir escribiendo, aportando en los foros, dictando charlas y demás cosas que me apasionan y contribuyen y ayudan a las demás personas.

Saludos y buena suerte!

martes, 23 de diciembre de 2014

Usando ExistDB (No Sql) desde .Net con C#

ExistDB es una base de datos No Sql, de la familia documental, es decir es una base de datos basada en documentos, y estos documentos tienen notación Xml. A través de las bases de datos No Sql podemos llegar a suplir requerimientos de manejo de grandes volúmenes de datos sin afectar el rendimiento de nuestras aplicaciones, y pensadas para aplicaciones donde la consistencia y transaccionalidad de datos no sean la prioridad, al contrario de los sistemas de bases de datos relaciones RDBMS como Sql Server por ejemplo. Si no estás muy familiarizado con las bases de datos No Sql aquí te dejo esta presentación que te puede orientar un poco: Introducción a las bases de datos No Sql


Si quieres encontrar más información acerca de ExistDB, puedes observar su sitio oficial exist-db.org, adicional en la siguiente página toda la documentación del producto ExistDB Documentación y como no puede faltar también cuenta con una guía para desarrolladores.

Y después de esta breve introducción, ahora si vamos a ver cómo podemos guardar documentos Xml en una base de datos ExistDB desde .Net, con nuestro lenguaje preferido C#. Y este artículo surge básicamente por la falta de documentación del tema en Internet, ya que la verdad no pude encontrar ejemplos de esto y por eso les quiero compartir un ejemplo muy sencillo, de como interactuar con esta base de datos a través de unas Apis Rest que expone (de otras opciones que tiene)

var credenciales = new HttpClientHandler { Credentials = new NetworkCredential("user""pass")};
            
using (var httpClient = new HttpClient(credenciales))
{
     var request = new HttpRequestMessage(HttpMethod.Put, string.Concat("UrlExistDB""NombreColeccion""nombreArchivo"))
     {
        Content = new StringContent("DocumentoXML"Encoding.UTF8, "text/xml")
     };
     var response = httpClient.SendAsync(request).Result;
     //response.Content.ReadAsStringAsync();
}


Como podemos ver es algo bastante sencillo, en donde consumimos el Api expuesta por la instalación que hicimos de ExistDB, indicamos en que colección queremos almacenar el archivo, ExistDB agrupa en diferentes colecciones que creamos para almacenar los diferentes archivos xml el nombre del archivo y por último enviamos el archivo xml que queremos almacenar, y todo usando un httpClient o cualquiera de las otras opciones que nos ofrece .Net para realizar este tipo de peticiones.

Nótese que en esta ocasión usamos el verbo http Put, pero podríamos usar cualquier otro dependiendo de la operación que queramos realizar en la base de datos.

Cabe resaltar que el secreto está en estudiar las diferentes Apis que nos ofrece ExistDB y obviamente comprender REST, y al manejar esta filosofía es bastante eficiente el almacenamiento, lo puedo decir ya que he tenido óptimos resultados almacenando archivos xml bastante grandes.

Y bueno amigos eso es todo de este ejemplo de cómo interactuar con ExistDB desde .Net usando el lenguaje C#, espero sea de utilidad. saludos y buena suerte!

domingo, 7 de diciembre de 2014

Big Data & Hadoop & HDInsight

Hola amigos, el día de ayer 6 de diciembre de 2014, estuve en el evento CloudCamp Medellín organizado por Microsoft Colombia DX, en el cual estuve compartiendo sobre Big data en general, y acerca de una herramienta como lo es Hadoop, y obviamente compartiendo la propuesta por parte de Microsoft llamada HDInsight, la cual esta basada sobre Hadoop y nos permite tener una versión on premise y una versión en la nube, acá les dejo la presentación y espero sea de utilidad para ustedes. Saludos!