viernes, 15 de octubre de 2010

Nos mudamos

Este blog se mudo a la siguiente direccion http://elcodigoyyo.applicationstudio.net/ disculpen por las molestias ocasionadas ...

jueves, 21 de enero de 2010

Factoría abstracta en acceso a datos con C#

Luego de mis largas vacaciones (y demasiado alcohol en la sangre luego de las fiestas de fin de año) les traigo este articulo que se me quedo en el tintero como muchos otros.

En proyectos medianos y grandes sucede muy a menudo que uno de los requerimientos sea el que la aplicación pueda cambiar de motor de base de datos a la medida que esta vaya creciendo, es decir si el proyecto inicio con una base de datos mysql y la cantidad de datos que esta maneja crece muy rápidamente entonces con el tiempo necesitara un motor de base de datos mas grande como Oracle por ejemplo. El problema en proyectos de este tipo es que si llegara a suceder lo mencionado tendrán que reescribir la capa de acceso a datos para que pueda acceder al nuevo motor, lo cual representa perdida de tiempo y dinero (que en ocasiones es lo único que le interesa a los jefes, jejeje).

La solución a este problema es usar el patrón Abstrac Factory o en buen español Factoría Abstracta al momento de escribir nuestro código de acceso a datos, para lograr nuestro cometido asumiré que el lector ya tiene conocimientos de acceso a datos con ADO.NET así es que no me centrare en ese punto sino en describir el patrón en si

ALGO DE TEORIA SOBRE EL ABSTRACT FACTORY

El Patrón factoría abstracta es un Patrón de creación lo que significa que ellos abstraen el proceso de creación de instancias de una clase, lo cual disminuye el acoplamiento entre clases en un proyecto. El Patrón factoría abstracta abstrae el proceso de creación de instancias de familias de productos relacionados sin necesidad de especificar las clases concretas a las que pertenecen.

AHORA SI LA SOLUCION

Tomaremos 4 métodos comunes en el manejo de bases de datos los cuales son:

        
  • Conectar (Realiza la conexión con el motor de BD)
  • Cerrar (Cierra la conexión con el motor de BD)
  • Ejecutar (Ejecuta una sentencia de tipo Insert, delete o update en la BD)
  • Consultar (Ejecuta una sentencia de tipo Select en la BD)

Para iniciar escribiremos una clase de acceso a un motor de base de datos Oracle con el cual realizaremos el ejemplo y obviamente en esa clase implementaremos los 4 métodos mencionados en la lista, el único detalle a considerar es que no utilizaremos las clases nativas de oracle como OracleConection u OracleCommand ni nada que se le parezca utilizaremos las clases bases que proporciona ADO.NET para el acceso a datos osea DBConnection, DBCommand, etc.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Data.Common;
   5: using System.Data.OracleClient;
   6: using System.Collections;
   7: using System.Data;
   8:  
   9: namespace csdatos
  10: {
  11:     public class oramsSgbd:Isgbd
  12:     {
  13:         public DbConnection MiConexion;
  14:  
  15:         public void conectar(String servidor, String basedatos, String usuario, String contrasena)
  16:         {
  17:             String NombreProveedor = "System.Data.OracleClient";
  18:             String ParametrosConexion = "Data Source=" + servidor + ";Persist Security Info=False;User ID=" + usuario + ";Password=" + contrasena + ";Unicode=True";
  19:             DbProviderFactory Factory = DbProviderFactories.GetFactory(NombreProveedor);
  20:             MiConexion = Factory.CreateConnection();
  21:             MiConexion.ConnectionString = ParametrosConexion;
  22:         }
  23:  
  24:         public void cerrar()
  25:         {
  26:             MiConexion.Close();
  27:         }
  28:  
  29:         public int ejecutar(string sentencia)
  30:         {
  31:             int resp;
  32:             MiConexion.Open();
  33:             DbCommand command = MiConexion.CreateCommand();
  34:             command.CommandText = sentencia;
  35:             resp = command.ExecuteNonQuery();
  36:             MiConexion.Close();
  37:             return resp;
  38:         }
  39:  
  40:         public DbDataReader consultar(string sentencia)
  41:         {
  42:             DbDataReader resp;
  43:             MiConexion.Open();
  44:             DbCommand command = MiConexion.CreateCommand();
  45:             command.CommandText = sentencia;
  46:             resp = command.ExecuteReader();
  47:             return resp;
  48:         }
  49:  
  50:     }
  51: }

       

Dos detalles a los que prestaremos atención: el primero es que la clase oramsSgbd implementa la interface Isgbd que no es mas que la especificación de los métodos de los que hablábamos líneas arriba, hacemos esto para que las clases que gestionaran los motores de bases de datos implementen obligatoriamente estos 4 métodos. El segundo detalle al que debemos prestarle atención es que el método conexión tiene como datos de entrada los parámetros para la conexión a la base datos la cual se capturara mas adelante de un archivo de configuración.


Y ahora implementaremos nuestra fabrica (Ojo que esta fabrica es bastante sencilla por motivos didácticos )

       
   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Xml;
   5: using System.Configuration;
   6:  
   7: namespace csdatos
   8: {
   9:     public class fabricaSgbd
  10:     {
  11:         public Isgbd dameSgbd()
  12:         {
  13:             Isgbd msgbd=null;   
  14:             
  15:             String tipoorigen = ConfigurationSettings.AppSettings["tipoorigen"];
  16:             String servidor = ConfigurationSettings.AppSettings["servidor"];
  17:             String basededatos = ConfigurationSettings.AppSettings["basededatos"];
  18:             String usuario = ConfigurationSettings.AppSettings["usuario"];
  19:             String password = ConfigurationSettings.AppSettings["password"];
  20:  
  21:             if (tipoorigen == "oraclexe"){
  22:                 msgbd = new oramsSgbd();
  23:             }
  24:             if (tipoorigen == "mysql"){
  25:                 msgbd = new mysqlSgbd();
  26:             }
  27:             if (tipoorigen == "postgresql"){
  28:                 msgbd = new postgresqlSgbd();
  29:             }
  30:             msgbd.conectar(servidor, basededatos, usuario, password);
  31:  
  32:             return msgbd;
  33:         }
  34:     }
  35: }


Esta clase recoge los parámetros de conexión de un archivo de configuración que podría ser el web.config por ejemplo y tiene los siguientes parámetros: tipoorigen, que indica el tipo de motor de base de datos que se usara (oraclexe, mysql, postgresql, etc. Pueden generar las clases que deseen ), Servidor que es el dominio o ip del servidor de base de datos, basedatos, que es el nombre de la base de datos a usar (no valido para oracle que se maneja por esquemas), usuario, que es el alias del usuario con los privilegios de acceso a la base de datos y su respectivo password.


Como seguramente se dieron cuenta el único chiste es un if que al leer el tipo de base de datos a usar instancia la que cumpla con la condición pasándole los parámetros de conexión respectivos y devuelve un objeto que implementa los métodos definidos en la interface (ojo con eso).


Bueno ahora solo nos falta la interface que es la siguiente

       
   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.Data.Common;
   5: using System.Collections;
   6: namespace csdatos
   7: {
   8:     public interface Isgbd
   9:     {
  10:         int ejecutar(string sentencia);
  11:         void conectar(String servidor, String basedatos, String usuario, String contrasena);
  12:         DbDataReader consultar(string sentencia);
  13:         void cerrar();
  14:         
  15:     }
  16: }


y listo como se darán cuenta la interface solo declara los métodos que serán obligatorios para todas las clases que implementen accesos a motores de bases de datos.


La forma de usar nuestra factoría es la siguiente para empezar tenemos que ubicar en el web.config (asumiendo que es una aplicación web ), los parámetros de acceso al motor de base de datos mas o menos así



   1: <appSettings>
   2:         <add key="tipoorigen" value="oraclexe" />
   3:         <add key="servidor" value="orcl" />
   4:         <add key="basededatos" value="ORGANIC" />
   5:         <add key="usuario" value="organic" />
   6:         <add key="password" value="orga" />
   7: </appSettings>


y luego desde alguna parte de la aplicación que necesitemos instanciamos nuestra fabrica mas o menos así:


y listo cuando necesiten cambiar de base de datos solamente tienen que escribir una clase muy similar a la clase OramsSgbd que implemente la interfaz Isgbd por ejemplo MysqlSgbd y cambiar en el web.config oraclexe por mysql y debería de funcionar de la misma forma sin hacer mas cambios.


   1: DbDataReader resp;
   2: fabricaSgbd mifabrica= new fabricaSgbd();
   3: Utilitarios misutilitarios = new Utilitarios();
   4:             
   5: Isgbd msgbd = mifabrica.dameSgbd();
   6: resp = msgbd.consultar("select * from actividades where estado='H' order by fecha_inicio desc");
   7:  
   8: while (resp.Read()){
   9: //aqui el codigo para recorrer el dataset resultante
  10: }

Nota: Lo aquí presentado funciona con el lenguaje sql estándar que cumpla para todas las bases de datos. Si se va a utilizar modificaciones del sql estándar propias del motor de la base de datos existen otros métodos como por ejemplo crear un lenguaje intermedio que se traduzca al lenguaje propio del motor que se este utilizando y este lenguaje intermedio se implemente dentro de las clases que van en conjunto con la factoría abstracta (así funciona hibernate en java), pero eso ya es tema de otro post.


Por ahora me despido la otra semana posteo de nuevo

miércoles, 2 de diciembre de 2009

Coloreado de codigo fuente para blog en linux

Luego de escribir mi ultimo post buscando una herramienta que permita el coloreado de código fuente para nuestros blogs, y teniendo en cuenta que recomendé usar Windows Live Writer con el Plugin CodeSnnipet (Todo esto en entorno windows), quede en la tentativa de ofrecerles una solución del mismo tipo pero usando herramientas de linux, además de que en lo personal acostumbro a utilizar linux en el 70 por ciento de las tareas que realizo.

Ok, para nuestra buena suerte existe vim en el cual podemos editar nuestros archivos fuente sin ningun problema y que además de todo ofrece una herramienta que traduce todo el código fuente que estemos editando en código html directamente con la opción ":TOhtml" la cual nos arroja un resultado mas que suficiente para poder trabajar.

Para nuestro ejemplo utilizaremos un código bastante sencillo en php como el que muestro a continuacion:
<?php
function saludar{
echo "Hola a todos!!!";
}
?>

Este código lo estamos editando en vim con el nombre de prueba1.php, cuando ya lo tengamos escrito escribiremos ":TOhtml" en la linea de comandos de vim y nos mostrara el siguiente codigo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>~/temporal/prueba1.php.html</title>
<meta name="Generator" content="Vim/7.2">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#ffffff" text="#000000"><font face="monospace">
<font color="#ff40ff">&lt;?php</font><br>
<font color="#ff40ff">function</font>&nbsp;saludar<font color="#ff40ff">(){</font><br>
&nbsp;&nbsp;<font color="#ff40ff">echo</font>&nbsp;&quot;<font color="#ff6060">Hola a todos!!!</font>&quot;;<br>
<font color="#ff40ff">}</font><br>
<font color="#ff40ff">?&gt;</font><br>
</font></body>
</html>

Ahora tienen que retirar algunas lineas osea las 8 o 9 primeras dependiendo es decir retiran las lineas hasta la etiqueta que diga al final:
<span style="font-family:monospace;">
tambien deben retirar esa etiqueta, después van al final del archivo y retiran lo siguiente:
</font></body></html>
Luego de ello deben remover todas las etiquetas "<br>" del código, una forma rápida para ello es si es que todavía están en vim (para hacer esto podrían usar cualquier otro editor gedit por ejemplo), usen la siguiente opción en la linea de comandos de vim ":%s/nt><br>/nt>/g" esta sentencia retirara esas etiquetas por ustedes y listo lo que les queda es en si el código ya formateado y coloreado

Ahora lo siguiente es poner este código en una capa para que pueda contenerlo, la capa la pueden crear ustedes con las etiquetas <div> y asignándole un estilo a la misma pero yo ya les hice el trabajo, tome prestado la capa que genera el CodeSnippet y le hice algunas modificaciones para que puedan usarlo, el código de las capas es el siguiente, casi al final de ese código dejo una marca para que sepan donde pegar el código generado con el vim:
<div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;line-height:12pt;background-color:#ffffff;width:97.5%;font-family:'Courier New', courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;margin:20px 0 10px;padding:4px;" id="Wrapper"><div style="text-align:left;line-height:12pt;background-color:#ffffff;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0;" id="Snippet"><pre style="text-align:left;line-height:12pt;background-color:white;width:100%;font-family:'Courier New', courier, monospace;direction:ltr;color:black;font-size:12pt;overflow:visible;border-style:none;margin:0;padding:0;">AQUI INSERTEN EL CODIGOOOOO!!!!</pre></div></div>
y listo el código resultante lo pegan directamente en su editor de posts.

El código final que obtenemos lo probé tanto en Blogger como en Wordpress y funcionan bastante bien además de que el vim tiene coloreado de código para la mayoría de los lenguajes conocidos.

Como prueba final les dejo este código de un programa simple opengl con c++.
/* 
* File: main.cpp
* Author: yosel
*
* Created on 24 de noviembre de 2009, 10:49 PM
*/

#ifdef WIN32
#include <windows.h>
#endif
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

#include <unistd.h>
#include "sphere.h"

float * pos;
TSphere * sphere = NULL;

void initgl(){
glEnable(GL_DEPTH_TEST);
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,1.0,1.0,100.0);
// Proyección perspectiva. El ángulo de visualización es de 60 grados, la razón ancho/alto es 1 (son inguales), la distanciamínima es z=1.0, y la distancia máxima es z=100.0
sphere = new TSphere(5,0.1);
glMatrixMode(GL_MODELVIEW);
gluLookAt(3,3,14,0,0,0,0,1,0);
}

void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glutWireCube(10);
glPushMatrix();
glColor3f(0.0,0.0,1.0);
pos = sphere->getPosv();
glTranslatef(pos[0],pos[1],pos[2]);
glutSolidSphere(1,10,10);
glPopMatrix();
glFlush();
}

void idle(void){
sphere->test();
usleep(33);
glutPostRedisplay();
}

int main(int argc, char ** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(20,20);
glutInitWindowSize(500,500);
glutCreateWindow(argv[0]);
initgl();
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

PD: Olvide comentarles que todo este post lo escribi siguiendo el metodo que estamos comentando

Saludos y hasta la proxima

miércoles, 11 de noviembre de 2009

Coloreando código fuente en Blogger

Para empezar les contare que deje de escribir artículos en este blog ya que me resultaba tremendamente frustrante tratar de escribir código fuente que se muestre de forma aceptable y no lograr mi cometido, dado que el fin de este blog es hablar de acerca de programación en general, lo que implica escribir toneladas de código fuente y la manera en como lo estaba haciendo me tomaba mucho tiempo, trabajo extra, se veía muy mal, y al final me quitaban las ganas de hacerlo.

Cabe agregar también que la alternativa directa de solución era montarme un servidor web en casa con wordpress y un plugin que me permita realizar esta tarea (existen varios para wordpress), pero descarté la idea ya que los servidores que tengo en casa son de desarrollo y siempre los estoy reinstalandolos con lo necesario para realizar mis proyectos, y la idea de tener un blog en casa me impediría tocar el servidor.

Luego de pensarlo por muuuuuuuuuuuuuuuuuucho tiempo (después de mi ultimo post), decidí ponerle fin a este dilema para poder en adelante postear mas seguido (dado que tengo mucho en el tintero), entonces luego de 5 horas de encerrarme probando alternativas pude resolverlo medianamente y ahí va la solución para los que están sufriendo como yo.

Lo ideal para escribir en un blog como el nuestro es tener una herramienta que nos permita escribir código fuente con las siguientes características:

  • Permitir numeración de líneas
  • Permitir espacios y tabulaciones
  • Permitir scrollbars en los cuadros de texto donde se mostraran los códigos fuente
  • y lo mas importante, permitir coloreado de código de acuerdo al lenguaje especifico que se este utilizando

En el camino probamos varias herramientas online como por ejemplo SimpleCode que lo único que hace es tratar de reemplazar los saltos de línea y los espacios con sus códigos html estándar, lo malo que no obtenemos coloreado de código, ni numeración ni cuadros de texto con scroll. Las demás herramientas online creo que no vale la pena ni enumerarlas ya que no me convencieron en lo absoluto

Busque plugins que hagan esta tarea para blogger pero creo que no existen (si me equivoco corríjanme), al final la solución necesaria era instalarse una herramienta de escritorio que nos permita editar nuestros post, estas herramientas son llamadas Clientes Blog de los cuales existen decenas y de las cuales solo llegue a probar 10 y ¿que creen?, ninguno tiene herramientas que nos permitan lograr nuestro cometido.

Durante las pruebas con Windows Live Writer me encontré con un plugin para este cliente llamado Code Snippet el cual me dejo complacido solo tiene un pequeño problemita con el scroll horizontal (no funciona bien) y hace que las líneas de código muy extensas bajen a una segunda línea por lo demás acepta coloreado de múltiples lenguajes (c#, javascript, html, java, visual basic, y mas), también acepta numeración de líneas de código y genera cuadros de edición que poseen scrollbars el resultado es el siguiente:

   1: for(i=1;i<30;i++){
   2:     imprimir i;
   3: }

A menudo el Live Writer en conjunto con el Code Snippet suelen agregar líneas en blanco entre las líneas del código fuente esto se debe a las especificaciones de los estilos que ambos generan, la solución mas rápida si eso les sucede es utilizar otro cliente blog solo para corregir estas pequeñas deficiencias, el cliente que usaremos será Post2Blog que al parecer es el que mejor código genera solo tenemos que abrir nuestro post en el Post2Blog y volver a publicarlo nada mas no es necesario editar nada, lo que el Post2Blog hará es regenerar el código del post reparando deficiencias en el mismo

Bueno ahora que ya puedo postear código fuente es hora de sacar algunos artículos del tintero.

Saludos