06
abr 12

Visualizar/Ocultar la consola en una aplicación.

No Gravatar

Hemos estado desarrollando varias aplicaciones de consola que hagan diversas funcionalidades (conectarse a un servidor sFtp, Ftp, Ftps, a WebServices, a Bases de Datos, etc) y el cliente quiere que dependiendo de un parámetro de  configuración se pueda visualizar o no la consola para fines de monitoreo.

Para realizar la visualización u ocultar la pantalla de consola en una aplicación hay que realizar los siguientes pasos:

1.- Crear un nuevo proyecto “Aplicación de Consola”.

2.- Ir a la ventana de propiedades del proyecto que acabamos de crear.

3.- En la pestaña de aplicación, en la opción “Tipo de resultado” seleccionar “Aplicación para Windows” y cerrar la pantalla de propiedades.

4.-  Agregar los métodos AllocConsole y FreeConsole a la clase principal como se muestra a continuación:

    class Program
    {
        [DllImport("kernel32.dll")]
        static extern bool AllocConsole();
 
        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();
 
        static void Main(string[] args)
        {
 
        }
    }

5.- En el método Main se puede permitir la visualización de la consola dependiendo de algún parámetro configurado en el archivo App.config

   static void Main(string[] args)
        {
 
            if (Convert.ToBoolean(ConfigurationManager.AppSettings["activarVisualizacionEventosEnConsola"]))
                AllocConsole();
 
            //[Tú código]
 
            if (Convert.ToBoolean(ConfigurationManager.AppSettings["activarVisualizacionEventosEnConsola"]))
            {
                Console.WriteLine("Presione enter para terminar el proceso");
                Console.ReadLine();
                FreeConsole();
            }
        }

 

Esperando que les sea útil esta información y recuerden que la compartir la información enriquecen a todos.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

03
abr 12

RESTful API Frameworks en PHP

No Gravatar
REST vs SOAP

RESTful services

La semana anterior liberé la versión 0.4.0 de Celestic y una cosa que había prometido y que al final no logré hacer era escribir una API en REST para  utilizarla desde equipos móviles.. Bueno, al menos hay una versión preliminar pero decidí no subirla a los respositorios de código porque eran pruebas .. y es que durante varios días estuve investigando y probando herramientas para el desarrollo de esta API, al final no utilicé ninguno de estos frameworks y estoy escribiendo mi propia extensión para Yii la cual funcionará tomando datos de los modelos y exportando los resultados a json y xml..

Entonces al grano, esta es una lista de frameworks o librerías que podrían ayudarte a construir tu propia API en REST sobre PHP ..

FRAPI – Fue una de mis primeras opciones.. pero después de pocos minutos revisando como instalarlo y configurarlo lo abandoné porque al ver que tenía una parte de administración y otra de consumo me desanimé.. en realidad lo que buscaba era algo más simple.. Desde la interfaz de administración y también consola se pueden crear acciones (esto viene hererado del MVC donde solicitas a un controlador una accion específica que termina siendo un método a ejecutarse).

APIFY – Muy parecido a Frapi, incluso al descomprimirlo vemos una estructura de carpetas tipo MVC.. lo probé pero por alguna razón que aun desconozco nunca funcionó.. su documentación es muy escasa.. en realidad toma muchas cosas de Zend Framework y la librería base para crear REST se reduce a clases Request y Response.

Recess – No tuve oportunidad de probarlo a fondo, al igual que los demás utiliza el patrón de diseño MVC, su interfaz para el desarrollo del servicio esta basado en web a través del navegador. Creo que es de los mejores, pero tiene bastantes archivos y eso no me gustó mucho. Utiliza PDO y mapeo de basee de datos, punto negativo creo que son las consultas entre tablas anidadas.

Slim – No tuve ganas de probarlo, aunque a diferencia de los demás Slim no es un framework, sino más bien una librería o un set de librerías.. Me gustó cuando ví el código pero me desanimó el hecho de que utilizan sus propias rutas y la ausencia de activeRecords.

Tonic – También es una librería, es bastante simple para lo que buscaba y de las cosas que alcancé a probar pues de eso decidí mejor construir mis propias clases para generar REST, me dió la impresión de que me ahorra muy pocas cosas..

En general todos los frameworks y librerías son muy buenos para trabajar utilizando su propio esquema o estructura de carpetas.. Un punto negativo que tienen todos es que los que utilizan PDO y model mapping no es muy bueno con los join y las consultas complejas puede que sea un dolor de cabeza.. Ninguna utiliza un esquema de autenticación compleja como OAuth o al menos Basic Auth .. y si utilizan seguridad lo hacen mediante un parámetro extra que se envia por la url..

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

30
mar 12

La Web Tridimensional : WebGL

No Gravatar

WebGL Es una especificación estándar en desarrollo que permite mostrar gráficos tridimensionales acelerados por hardware en navegadores web sin necesidad de instalar software adicional al navegador (plug-ins).

En realidad es una API para javascript que permite usar OpengGL incorporado en los navegadores.[1]

WebGL utiliza un elemento de HTML5 llamado Canvas el cual permite mostrar gráficos 2D e imágenes de una manera dinámica, canvas consiste de una región dibujable definida en código HTML con los atributos de altura y espesor, el código javascript permite acceder a esa región a través de un conjunto completo de funciones de dibujo 2D, esto es lo que permite generar los gráficos dinámicamente. [2]

Esta especificación es gestionada por el consorcio de tecnología Kronos Group.

http://www.khronos.org/webgl/

Para comenzar hay unos muy buenos tutoriales para aprender a usar WebGL [3], que son referencia obligada para entender como funciona esta tecnología.

Para acelerar las cosas existe una biblioteca 3D en javascript llamada three.js, la biblioteca provee <canvas>, <svg> y render WebGL.[4] creada por mrdoob : https://github.com/mrdoob

demos

Demos de mrdoob

En esta biblioteca se incluyen funcionalidades para manejo de camaras (ortografica y perspectiva), funciones para manejar la geometria, el color, vertices, splines, matrices, luces, materiales, objetos (esqueletos, modelos, modelos animados, particulas, etc), renders (canvas, dom, svg, webgl), escenas, texturas y muchas otras mas : http://mrdoob.github.com/three.js/docs/48/#Camera

Y este es un ejemplo de un trabajo muy bueno usando esta tecnología Web3D.

http://www.ro.me/

Una cuestión interesante sobre WebGL es que es un estandar que ha sido adoptado para integrarlo en las nuevas versiones de los navegadores web de Google (chrome) y Mozilla (firefox) incluso de Apple (safari) pero no así en internet explorer de Microsoft pues menciona cuestiones de seguridad para no hacerlo. Por el momento WebGL sigue avanzado.

Nota:

“Los gráficos vectoriales escalables (svg) es una especificación para describir gráficos vectoriales bidimensionales estáticos o anímados en formato xml.” [5] 

Referencias:

[1]http://en.wikipedia.org/wiki/Canvas_element


[2]http://en.wikipedia.org/wiki/WebGL


[3]http://learningwebgl.com/blog/?page_id=1217


[4]https://github.com/mrdoob/three.js/


[5]http://en.wikipedia.org/wiki/Scalable_Vector_Graphics


[6]http://es.wikipedia.org/wiki/Khronos_Group

Imagen y demos:

http://mrdoob.github.com/three.js/


http://mrdoob.com/


http://alteredqualia.com/

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

28
mar 12

GNOME 3.4

No Gravatar

         La actualización del entorno de escritorio GNOME 3.4, fue  lanzado el dia 28 de , por la gente del proyecto GNOME.

GNOME 3.4 fue liberado después de  seis meses de desarrollo de su versión 3.2, con bastantes mejoras en diversas áreas, así como nuevas características y traducciones actualizadas.

Los principales objetivos de GNOME 3.4 fue mejorar los menús de  y acciones, para mejorar los paneles de Wacom y la Red, para volver a agregar alto  y los temas de accesibilidad, y para mejorar la aplicación de los documentos.

GNOME Boxes es una nueva aplicación que ahora es parte del entorno de escritorio GNOME 3.4, permitiendo a los usuarios acceder a otros sistemas informáticos o imágenes virtuales.

Aspectos destacados de GNOME 3.4:

Documentos:

  • Se ha quitado la barra lateral
  • Nueva interfaz de búsqueda
  • Se han añadido las colecciones
  • Soporte para la impresión de documentos
  • Menú  de aplicaciones

Contactos:

  • Se ha añadido nueva barra lateral y el diseño de panel de contacto
  • Se ha añadido un diálogo de una nueva conexión
  • Añadido menú de aplicaciones
  • Se ha añadido un nuevo selector de avatar

Boxes:

  • Permite ver y acceder a máquinas remotas
  • Permite ver y acceder a máquinas virtuales a distancia
  • Posibilidad de instalaciones automatizadas completamente de  Linux, Windows 7 y Windows XP
  • Capacidad para eliminar, publicar y cargar máquinas virtuales
  • Posibilidad de conectarse a pantallas remotas utilizando VNC o SPICE

 Epiphany:

  • Soporte para WebKitGTK + 1,8
  • Nueva barra de herramientas de diseño
  • Añadido menú de aplicaciones

 

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

27
mar 12

Consumiendo REST desde C#.NET

No Gravatar
Consumir RESTful en .NET

Consumir RESTful en .NET

Hace algunos días atras buscaba una forma decente y elegante de crear mi propia api utilizando RESTful para Celestic .. de esa forma fue que llegue a StackOverflow y muchas preguntas de usuarios necesitando código para consumir servicios basados en REST.. En este sitio todavía no colaboro por lo que no quize responder, ya pensándolo bien fue que decidí escribir este artículo.

Sé que hay otra manera de hacerlo.. pero para este ejemplo utilizaremos el objeto HttpWebRequest y HttpWebResponse, entonces comenzamos:

var postString = new {clave1:valor1, clave2:valor2};
byte[] data = UTF8Encoding.UTF8.GetBytes(postString);
 
HttpWebRequest request;
request = WebRequest.Create("http://localhost/ejemplo/api") as HttpWebRequest;
request.Timeout = 10 * 1000;
request.Method = "POST";
request.ContentLength = data.Length;
request.ContentType = "application/json; charset=utf-8";

Básicamente lo que se hace es instanciar de HttpWebRequest y setear algunos parámetros, entre ellos y mas importante el método (Method), la longitud de la petición (ContentLength) y el tipo de dato a enviar (ContentType). No pierdan de vista que estoy enviando postString que a su vez es un objeto tipo Json.

La mayoría de servicios basados en REST requieren autenticación básica.. y pues es una de las más fáciles de utilizar.. inclusive desde el navegador se puede hacer, lo único que se requiere es un usuario y una clave de acceso..

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("usuario:clave"));
request.Headers.Add("Authorization", "Basic " + credentials);

Esto es como algunas páginas en internet que piden autenticación para entrar, donde puedes escribir la url y esperar a que aparezca el formulario de inicio de sesion o escribirlo directamente en la url.. de la forma: “usuario:clave@http://localhost/ejemplo/api”

Ahora lo siguiente y último paso es enviar los datos y obtener la respuesta..

Stream postStream = request.GetRequestStream();
postStream.Write(data, 0, data.Length);
 
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(response.GetResponseStream());
string body = reader.ReadToEnd();

Y para finalizar body es el contenido de lo que ha respondido el servicio, recuerden que la respuesta es tipo Json.. por lo que pueden interpretarla facilmente con javascript o hacer algo más complejo si desean parsearlo desde .NET.

Espero les sirva el código.. y si encuentran algun error, recuerden que el formulario de comentarios no muerde.. :D

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

22
mar 12

Recibir SMS a través de DcodSMS

No Gravatar

Antes de cualquier cosa necesitan tener una cuenta de DcodSMS y para eso nos la pueden solicitar mandándonos un correo a info@qbit.com.mx

Adicionalmente, es importante mencionarles que este ejemplo es para consumir unos WebServices directamente desde su aplicación desarrollada en Delphi pero puede utilizar nuestra aplicación Paloma (https://qbit.com.mx/dcodsms/paloma/)

Ahora manos a la obra con nuestro ejemplo de Delphi 10 2006.

1.- Crear un nuevo proyecto de Delphi.

2.- Agregar un componente TMemo con las siguientes propiedades:

  • Name: smsRecibidos.
  • Lines: vaciar los valores por omisión.

3.- Agregamos un componente TButton con las siguientes propiedades:

  • Caption: Recibir.

4.- Ahora vamos a importar el WSDL para poder consumir los Web Services. Esto se hace en el menú que se muestra en la siguiente imagen:

5.- A continuación nos aparecerá una pantalla en la que debemos escoger el tipo del item nuevo, en este caso un nuevo WSDL Importer.

6.- Damos clic en Aceptar y aparece la pantalla siguiente, en donde debemos colocar la URL del WSDL de DcodSMS, esta url es http://sms.mexhico.com/smsdcodserver.php?wsdl

7.- Presionamos el botón Finish y aparece la siguiente pantalla de confirmación.

8.- Regresamos a nuestra forma y agregamos un componente más, hay que tomarlo de la pestaña de Web Services en la paleta de componentes, el componente que usaremos es de tipo THTTPRIO como se muestra en la siguiente imagen:

9.- Ahora vamos al código y agregamos la referencias hacia el recién creado smsdcodserver.pas, esto lo hacemos debajo de la línea implementación:

uses smsdcodserver;

10 .- Nuestro código lo pondremos en el evento clic del Botón, pondremos lo siguiente:

procedure TForm1.Button1Click(Sender: TObject);
var
  Respuesta: ArrayOfReceiveds;
  cont : integer;
begin
 
  cont := 0;
  HTTPRIO1.WSDLLocation := 'http://qbit.com.mx/dcodsms/smsdcodserver.php?wsdl';
  Respuesta := (HTTPRIO1 as ServicePortType).getAnswersHistory('miusuario','micontrasegnia');
 
  while cont &lt; Length (Respuesta) do
  begin
    smsRecibidos.Lines.Add(Respuesta[0].message_);
    Inc(cont);
  end;
end;

11 .- Cambien el usuario y la contrasegna por los datos de su cuenta.

12 .- Ahora es momento de echar a arrancar nuestra aplicación.

 

Pueden descargar el código

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

20
mar 12

Phalcon PHP

No Gravatar
Phalcon PHP

Phalcon PHP

Hace algunos días atras leía sobre un nuevo framework de PHP.. como si no hubieran muchos para elegir.. pero este específicamente tenía algo diferente que llamó mi atención.. lo guarde en mis favoritos y por fin!!! este fin de semana pude probarlo.

Pues bien, este nuevo framework se llama Phalcon PHP, esta escríto en C y funciona como una extensión adicional al lenguaje PHP utilizando el patrón de diseño MVC .. lo más interesante de que presumen es la velocidad con que este framework funciona a diferencia de la competencia.

Como cultura general, PHP es un lenguaje interpretado, básicamente Apache que es el servidor debe traducir todo el código php y entregarlo al cliente en forma de HTML, lo que hace de PHP un lenguaje algunas veces lento.. buuu!!! si a eso le agregan el uso de frameworks pues puede que el desempeño se vea un poco afectado, ya que los frameworks deben cargar inicialmente un set de librerías para funcionar lo cual se traduce en tiempo de compilación de recursos extras. Phalcon siendo una extensión del lenguaje, se carga automáticamente de tal manera que ofrece casi las mismas funciones que los demás frameworks, o al menos para trabajar utilizando el patrón MVC.

Definitivamente el resultado es muy bueno, la respuesta del servidor es superior en comparación de los frameworks tradicionales, entre los puntos negativos de Phalcon es que quizás le falten muchas cosas para llegar al nivel de CodeIgniter, Zend o Yii .. digamos algunas validaciones sobre los modelos, uso de eventos sobre el controlador, actions, etc..  y sobre todo documentación (porque hay cosas que no estan muy claras como el uso de las relaciones :S), pero la idea es genial.. Si tienen oportunidad de probarlo, no dejen de hacerlo.

Por cierto, el código lo encuentran en github.. hay que descargarlo y compilarlo.. además de la guía de instalación previa.. yo les recomendaría tener instalado build-essential..

Fuente: http://phalconphp.com/

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

19
mar 12

Sigleton (Patrones de diseño I)

No Gravatar

C++ es mi lenguaje favorito. Por eso ademas de escribir en el quiero escribir sobre el, una forma de hacerlo es escribir sobre Patrones de diseño, que como seguramente ya sabes son formas de escribir código para resolver algún problema que se presenta con regularidad. Estos problemas son de desarrollo de software y no de algo aplicable directamente.

Es decir a veces el hecho de programar es por si mismo un problema, aqui es donde tienen utilidad los patrones de diseño. Veamos el primer ejemplo:

Seguro te haz topado con el siguiente problema, imagina que debes crear una clase que guarde en un archivo o en una base de datos lo que el sistema va haciendo, una especie de log, hay que tener cuidado de no instanciar mas de una vez la clase porque no queremos a dos objetos accesando a la vez al mismo archivo o BD, digamos que se ve mas o menos asi:

class log {
	public:
	log()
	{
		// Aqui abrimos el archivo o abrimos la conexion a la DB
	}
 
	virtual ~log()
	{
	}
 
	void Add(string Linea)
	{
		// Aqui almacenamos el texto en el archivo o la DB
	}
};

Tenemos muchas opciones para usarlo, por ejemplo podemos crear una variable global asi:

log MiLog;

en nuestro primer archivo digamos main.cpp y en cada archivo y clase que vallamos creando ponemos un:

extern log MiLog;

lo cual le indica al compilador que no valla a crear una nueva instancia de nuestro objeto MiLog, en lugar de ello use la primera instancia que se creo. Mmmm, funciona pero la variables globales no son muy bonitas, y son difíciles de mantener.

Tambien podríamos arrastrar la referencia a la variable por todos lados, pasándola como parámetro en cada función que vallamos creando, o como una propiedad de todas las clases que vallamos creando. Algo asi como:

void main (void) {
	log * MiLog = new log();
 
	MiFucion(5, "hola", MiLog);
 
	miclase MiClase(3.14, MiLog);
	MiClase.miMetodo(3);
 
}
 
int MiFucion (int Parametro1, string Parametro2, log * Milog) {
	MiLog->Add("Guarda este texto");
}
 
class miClase {
private:
	float Propiedad1;
	log * MiLog;
public:
	miClase(float Propiedad1, log * MiLog) {
		this->Propiedad1 = Propiedad1;
		this->MiLog = MiLog;
	}
 
	void miMetodo(int Parametro1) {
		MiLog->Add("Guarda este texto");
	}
}

Funciona, pero como ves hay que poner la referencia en todos lados, en cada clase y funcion en donde queramos ocupar nuestro log.

Otra forma de hacerlo es creando un Singleton. Un Singleton es una clase que:

  • Solo puede instanciarse una vez.
  • Solo tiene un punto de acceso a ella.

Es decir si nuestra clase log fuera un Singleton, solo se intanciaria una vez, con lo que  una y solo una instancia del objeto podría acceder a nuestro archivo o DB y ademas tendriamos un solo punto de acceso a ella, como si fuera una variable global, la cual no tenemos que arrastrar o pasar como parámetro cada vez.

Hay muchas formas de hacer un Singleton, sobre todo en C++.

La que mas me gusta es la siguiente, veamos el código:

class log {
public:
	static log * instance()
	{
		static log * Yo = NULL;
		if (Yo == NULL) {
			Yo = new log();
		}
		return Yo;
	}
 
	virtual ~log()
	{
 
	}
private:
	log()
	{
		// Aqui abrimos el archivo o abrimos la conexion a la DB
	}
};

Lo primero que hay que notar es como el constructor es privado, por lo que no podemos crear una instancia del objeto. Solo el mismo puede instanciarse :) . Luego hay que ver que hemos creado el metodo estatico intance() que retorna un apuntador de tipo log. Dentro hay una variable estática llamada Yo que, si recordamos como funcionan las variables estáticas, nos damos cuanta de que solo se crea una vez y el valor no se pierde. La primera vez Yo vale NULL y la instanciamos por primera vez, pero el resto de las veces Yo ya esta instanciada.

Nuestra clase Singleton se usa asi:

log::instance()->Add("Guarda este texto");

Tomando el ejemplo anterior se veria asi:

void main (void) {
 
	MiFucion(5, "hola");
 
	miclase MiClase(3.14);
	MiClase.miMetodo(3);
 
}
 
int MiFucion (int Parametro1, string Parametro2, log * Milog) {
	log::instance()->Add("Guarda este texto");
}
 
class miClase {
	private:
	float Propiedad1;
public:
	miClase(float Propiedad1, log * MiLog) {
	this->Propiedad1 = Propiedad1;
}
 
	void miMetodo(int Parametro1) {
		log::instance()->Add("Guarda este texto");
	}
}

¿Apoco no es mas padre que una variable global? O que andar llevando la referencia por todo el código. El Singleton en uno de los patrones mas utilizados y como comentaba hay muchas formas de hacerlos. No solo en C++ sino tambien en otros lenguajes. Dale un vistazo a la Wiki.

 

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

16
mar 12

Mundos Virtuales

No Gravatar

Desde hace mucho tiempo me interesa el desarrollo de aplicaciones 3D supongo que fue por ver muchas peliculas de ciencia ficción en especial “El jardinero, asesino inocente” y Tron, también creo que por leer artículos de una revista que colecciono de hace mas tiempo, en especial un número de 1995 que habla sobre los próximos 100 años de la tecnología. En este número mencionan “En la sociedad del conocimiento, buena parte de nuestra vida transcurrirá en mundos sintéticos y hasta buscaremos pareja en ellos. Las computadoras imitarán el cerebro humano, habrá granjas moléculares, llevaremos tarjetas de crédito bajo la piel y unos microrrobots se encargarán de quitar el polvo a la computadora cuando la apaguemos” [1]

Los primeros acercamientos a esta area que tuve fue con un libro de 1997 llamado Realidad Virtual. Construcción de Proyectos de Joe Gradecki.

“Los mundos virtuales son lugares donde experimentamos nuevas realidades. Contienen todos los objetos que podemos ver y manejar. Nos permiten además, experimentar cosas que no son posibles en el mundo real” [2]

“Un verdadero programa de realidad virtual debe contener dos componentes:

  1. El punto de vista de un usuario en primera persona que debe realizar movimientos completos a voluntad en tiempo real.
  2. La capacidad de visualizar y modificar el entorno virtual en tiempo real” [3]

Con el tiempo pude realizar algo relacionado con los objetos virtuales cuando conocí VRML (Virtual Reality Modeling Language)

En español “Lenguaje para Modelado de Realidad Virtual” curiosamente su primera especificación fue publicada en 1995.

http://en.wikipedia.org/wiki/VRML

Silicon

Primer acercamiento a web 3d con vrml 1999

Después vinieron los Proyectos 3D con OpenGL , Mesa,  Blender, Maya y mas recientemente

3D Studio,  GLScene y actualmente NeoAxis pero afortunada o desafortunadamente en desarrollos de escritorio.

Los primeros mundos virtuales que conocí vivian en la web, en internet, así que va siendo hora que

continuemos con el principio. “El final es en donde parti” dice una canción de La Renga.

http://www.youtube.com/watch?v=ozC9hETOt2I

Así que desde hace tiempo he estado aprendiendo un poco sobre WebGL y en un futuro no muy lejano espero tener algunas aplicaciones.

WebGL: Es una especificación estándar que está siendo desarrollada actualmente para mostrar gráficos en 3D en navegadores Web.

Los mejores ejemplos en Chrome Experiments http://www.chromeexperiments.com/tag/webgl/

 

Referencias :

[1]: Muy Interesante Especial Los próximos 100 Años. P 27.
[2,3]: Realidad Virtual Construcción de Proyectos. Joe Gradecki. 1997 AlfaOmega. P 2. y P 3

Mas Info : http://www.popsci.com/archive-viewer?id=S812DHiH7dUC

Bonus :   The Popular Science Archive Explorer

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

15
mar 12

Mis estimados rudos. Un poco de Java, Hibernate y T-SQL

No Gravatar

Bueno, ser rudo no es tan malo como suele decir. En este periodo QBit esta desarrollando un proyecto utilizando Java con Hibernate, Faces y Microsoft SQL; y necesitabamos tener un entidad cuya información se extraiga de un Procedimiento Almacenado o SP (por sus siglas en ingles Stored Procedure). Vayamos al grano mis estimados entusiastas de la programación:

Supongamos que tenemos la siguiente estructura:

public class MiTablaSP
{
private int id;
private String nombreTablaSP;
 
public int getId()
{
return id;
}
 
public void setId(int id)
{
this.id = id;
}
 
public String getNombreTablaSP()
{
return nombreTablaSP;
}
 
public void setId(String nombreTablaSP)
{
this.nombreTablaSP = nombreTablaSP;
}
}

Ahora veamos el mapeo que son los archivos con extensión hbm:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="MiTablaSP" table="MiTablaSP">
    <id column="id" name="id">
      <generator class="native"/>
    </id>
    <property column="nombreTablaSP" name="nombreTablaSP"/>
  </class>
</hibernate-mapping>
</xml>

Yo sé que para los expertos de la materia me podrían decir que puedo mapear el resultado del SP con los campos de mi objeto de la siguiente manera:

<sql-query callable="true" name="SP_MiTablaSP">
    <return alias="SP_MiTablaSP" class="MiTablaSP">
      <return-property column="id" name="id"/>
      <return-property column="nombreTablaSP" name="nombreTablaSP"/>
    </return>
 
    { call SP_MiTablaSP }
</sql-query>
</xml>

Pero tendría que invocarlo por SP en ves de que nativamente lo llene Hibernate. Continuemos, hay que crear el SP:

CREATE PROCEDURE SP_MiTablaSP
AS
SELECT 1 AS ID
'PRUEBA' AS nombreTablaSP

El penúltimo paso es crear un link:

EXEC sp_addlinkedserver
@server = 'local',
@srvproduct = '',
@provider='SQLNCLI',
@datasrc = @@SERVERNAME

Por útlmo solo hay que crear una vista:

CREATE VIEW MiTablaSP
AS
SELECT * FROM openquery(LOCAL, 'miBaseDatos.dbo.MiTablaSP')

Pues espero que les sea de mucha utilidad y recuerden “El conocimiento mutuo enriquece a todos” :D

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

Qbit Mexhico Blog is using WP-Gravatar