Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

Programación con SDL (III)


Aquí tenemos otro ejemplo de utilización de la librería SDL. En esta ocasión vamos a mover una imagen por la ventana. Además utilizaremos la técnica del doble buffer.

Para ello, nos basaremos en el ejemplo del post anterior, al que añadiremos una imagen que se repetirá por todo el fondo de la pantalla, y la captura del cursor del teclado para el movimiento de la imagen.


Si quieres descargarte el código fuente pulsa aquí.

Programación con SDL (II)


Aquí os dejo otro ejemplo de utilización de la librería SDL. En esta ocasión vamos a cargar una imagen en la ventana.

Para ello, crearemos una variable del tipo SDL_Rect para poder posicionar la imagen dentro de la ventana y un puntero a una variable del tipo SDL_Surface que almacena la imagen a mostrar.

La imagen la que cargaremos con la función SDL_LoadBMP, además utilizaremos la función SDL_SetColorKey, para el uso de transparencias.


Para terminar mostramos la imagen en la ventana utilizando la función SDL_BlitSurface, en la que indicaremos la imagen a insertar, el puntero a la pantalla y la posición en la que ubicaremos la imagen dentro de la pantalla.



Si quieres descargarte el código fuente pulsa aquí.

Programación con SDL


Para empezar explicaré que es Simple DirectMedia Layer (SDL). Es un conjunto de librerías multimedia, que se distribuye bajo la licencia LGPL, y proporcionan funciones para ofrecer acceso a bajo nivel de audio, teclado, ratón, joystick, hardware 3D mediante OpenGL, y framebuffer 2D de vídeo.

Además se han desarrollado una serie de librerías adicionales que complementan las funcionalidades.
  • SDL Mixer: Extiende las capacidades de SDL para la gestión y uso de sonido y música en aplicaciones y juegos. Es compatible con formatos de sonido como Wave, MP3 y OGG, y formatos de música como MOD, S3M, IT, y XM. 
  • SDL Image: Extiende notablemente las capacidades para trabajar con diferentes formatos de imagen. Los formatos compatibles son los siguientes: BMP, JPEG, TIFF, PNG, PNM, PCX, XPM, LBM, GIF, y TGA, 
  • SDL Net: Proporciona funciones y tipos de dato multiplataforma para programar aplicaciones que trabajen con redes. 
  • SDL RTF: Posibilita el abrir para leer en aplicaciones SDL archivos de texto usando el formato Rich Text Format RTF. 
  • SDL TTF: Permite usar tipografías TrueType en aplicaciones SDL.
Una vez terminada la introducción, vamos a crear el primer programa con SDL, y como no podía ser otro crearemos el "Hola Mundo".


Para simplificar la compilación he creado el siguiente makefile.

Si quieres descargarte el código fuente pulsa aquí.

Conectar con una BD de SQLite en C


Para empezar explicaré que SQLite es una BD transacional bajo la forma de una librería que se embebe en las aplicaciones, sin necesidad de contar con un servidor y sin configuración.

El programa utiliza la funcionalidad de SQLite a través de llamadas simples a funciones. De esta forma se reduce la latencia en el acceso a la base de datos, debido a que las llamadas a funciones son más eficientes que la comunicación entre procesos. El conjunto de la base de datos (definiciones, tablas, índices, y los propios datos), son guardados en un sólo fichero en la máquina.

Bueno una vez terminada la introducción y antes de empezar deberemos instalar el paquete "libsqlite3-dev" para poder desarrollar en C. Para ello, desde la consola ejecutaremos:
$ sudo apt-get install libsqlite3-dev

Ahora ya estamos preparados para conectarnos a una base de datos SQLite desde C. Aquí os dejo un código de ejemplo:


Para compilarlo ejecuta:
$ gcc SQLite.c -lsqlite3

Si quieres descargarte el código fuente pulsa aquí.

Too many columns. Some columns are omitted


Este mensaje de error me apareció hace algún tiempo y no le encontré solución. Pero como siempre los errores no resueltos, acaban por volver. Y esta vez tengo la solución.

Este mensaje se produce al intentar acceder a una tabla por ODBC que tiene más de 255 columnas, y aunque quieras mostrar una sola columna da este error.

Por lo que he leído, este es el valor por defecto para el número de columnas, pero puede cambiarse siempre que el driver ODBC soporte un número mayor. En mi caso, el driver es el de "MS Dynamics NAV Database", que soporta hasta 5000 columnas, por lo que he decidido modificar el valor para que no de error la consulta.

Para solucionarlo tuve que modificar el registro de Windows y cambie el valor de la siguiente clave "HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\MS Dynamics NAV Database\MaxColSupport" e indique 1000. Con mil columnas ya voy sobrado...


Si el driver ODBC fuese otro se debería la clave "HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\\MaxColSupport"

Control del flujo en procedimientos almacenados en MySQL


Antes de empezar con las instrucciones propias para el control del flujo, vale la pena indicar el uso de las variables dentro de los procedimientos.
DECLARE nombre_variable tipe [DEFAULT valor]
Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la variable, se incluye la cláusula DEFAULT. El valor puede especificarse como una expresión, es decir, no necesita ser una constante. Si no se indica la cláusula DEFAULT, el valor inicial será NULL. Una variable local sólo es visible dentro del bloque BEGIN ... END donde está declarada.

Para cambiar el valor de una variable se usa SET de este modo:
SET nombre_variable = expresion
Y para terminar este rápido repaso, recordar también que para poder acceder a una variable local a la finalización de un procedimiento se tiene que usar los parámetros de salida.

Bueno y ahora a lo que quería explicar:
IF condicion THEN sentencia
  [ELSEIF condicion THEN sentencia]
  [ELSE sentencia]
END IF

Ejemplo:
> DELIMITER //
> CREATE PROCEDURE miProcedimiento(IN p1 INT)
> BEGIN
>   DECLARE miVariable INT;
>   SET miVariable = p1 * 2;  
>   IF miVariable = 2 THEN
>     INSERT INTO lista VALUES(22);
>   ELSEIF miVariable = 4 THEN
>     INSERT INTO lista VALUES(4444);
>     ELSE
>     INSERT INTO lista VALUES(1);
>   END IF;
> END;
> //

CASE valor
  WHEN cuando_el_valor THEN sentencia
  [WHEN cuando_el_valor THEN sentencia]
  [ELSE sentencia]
END CASE

o
CASE
  WHEN condicion THEN sentencia
  [WHEN condicion THEN sentencia]
  [ELSE sentencia]
END CASE

Ejemplo:
> DELIMITER //
> CREATE PROCEDURE miProcedimiento(IN p1 INT)
> BEGIN
>   DECLARE miVariable INT;
>   SET miVariable = p1 * 2;  
>   CASE miVariable
>     WHEN 2 THEN INSERT INTO lista VALUES(22);
>     WHEN 4 THEN INSERT INTO lista VALUES(4444);
>     ELSE INSERT INTO lista VALUES(1);
>   END CASE;
> END;
> //
REPEAT
  sentencia
  UNTIL condicion
END REPEAT
Ejemplo:
> DELIMITER //
> CREATE PROCEDURE miProcedimiento()
> BEGIN
>   DECLARE miVariable INT;
>   SET miVariable = 1;  
>   REPEAT
>     INSERT INTO lista VALUES(miVariable);
>     SET miVariable = miVariable + 1;
>     UNTIL v >= 5;


>   END REPEAT;
> END;
> //
WHILE condicion DO
  sentencia
END WHILE
Ejemplo:
> DELIMITER //
> CREATE PROCEDURE miProcedimiento()
> BEGIN
>   DECLARE miVariable INT;
>   SET miVariable = 1;  
>   WHILE v >= 5 DO
>     INSERT INTO lista VALUES(miVariable);
>     SET miVariable = miVariable + 1;
>   END WHILE;
> END;
> //
[Etiqueta:] LOOP
  sentencia
END LOOP [Etiqueta]

Ejemplo:
> DELIMITER //
> CREATE PROCEDURE miProcedimiento()
> BEGIN
>   DECLARE miVariable INT;
>   SET miVariable = 1;
>   loop_label : LOOP
>     INSERT INTO lista VALUES(miVariable);
>     SET miVariable = miVariable + 1;
>     IF v >= 5 THEN
>       LEAVE loop_label;
>     END IF;
>   END LOOP;
> END;
> //

Google+ abierto a todo el público


Despues de casi tres meses en periodo de pruebas de Google+, se lanza abierto a todo al público, ya no tendrás que tener invitaciones, sólo entra, registrate y listo.

Durante ese periodo de pruebas se han realizado 91 mejoras y con este lanzamiento se añaden nuevas características. Entre las nuevas características esta el soporte de Hangouts (Lugares de reunión) para Android y un nuevo tipo de Hangouts on Air, para las retransmisiones en grupo.

Además se han añadido nuevas funcionalidades a la API de Google+ para integrar Hangouts en aplicaciones de terceros, tras la primera versión de la API publicada hace unos días.

API para Google+

Ya esta disponible la API oficial para que los desarrolladores tengan acceso a la red y puedan crear sus propias aplicaciones. Es una API REST y usa OAuth para autenticar a los usuarios.

De momento no son muchas las opciones que brinda esta API, en esta primera versión sólo ofrece acceso a los datos públicos de los usuarios, pero con el tiempo irá seguro que se añadirán nuevas funcionalidades y caraterísticas para enriquecer a las aplicaciones que hagan uso de ella.

Para los programadores deciros que los manuales, tutoriales y demás información la tenéis aquí. Por cierto para ayudar Google ha creado librerías de código abierto de Google+ para Java, GWT, Ruby, Python, PHP y .NET .

Fuente: Google+ Platform Blog

Conectar con una BD de SQLite en Monodevelop


Para empezar explicaré que SQLite es una BD transacional bajo la forma de una librería que se embebe en las aplicaciones, sin necesidad de contar con un servidor y sin configuración.

El programa utiliza la funcionalidad de SQLite a través de llamadas simples a funciones. De esta forma se reduce la latencia en el acceso a la base de datos, debido a que las llamadas a funciones son más eficientes que la comunicación entre procesos. El conjunto de la base de datos (definiciones, tablas, índices, y los propios datos), son guardados en un sólo fichero en la máquina.


Bueno y después de esta pequeña introducción empecemos con la práctica. Para ello, crearemos un nuevo proyecto. abrimos MonoDevelop y creamos una solución nueva.


Al crearse la solución nos dirigimos a las Referencias del proyecto y desde allí seleccionamos el paquete "Mono.Data.Sqlite". Para ello seleccionáis pulsamos con el botón derecho sobre "Referencias" y seleccionamos "Editar referencias...".


De las tres opciones que aparecen en el diálogo entramos en "Paquete", buscamos la referencia "Mono.Data.Sqlite" y lo añadimos a las referencias de la solución.


Ahora ya estamos preparados para conectarnos a una base de datos SQLite desde la solución de MonoDevelop.

Aquí os dejo un código de ejemplo:


Si quieren ver el código fuente completo, aquí les dejo el código.

El patron de diseño singleton


Muchos problemas de rendimiento y de escalabilidad suceden cuando se utilizan las conexiones a las bases de datos. Hay que tener en cuenta que las conexiones son un recurso que consume memoria y tiempo de procesador, por lo que sólo se deben crear las conexiones necesarias y estas deben cerrarse tan pronto como se a posible.

Una buena práctica es que todas las clases accedan a los recursos de la base de datos usando siempre una única conexión sin importar el número de instancias que estas clases generen al ser ejecutadas en una aplicación.

El patrón Singleton (instancia única) es el más sencillos, conocidos y utilizados. Está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto, asegurando de que sólo exista una única instancia de la clase sin importar el número de veces que se intente crear y proporcionando un punto de acceso global.

Se podría suponer que utilizando miembros estáticos obtendríamos el mismo resultado, pero no es así, ya que en este caso la responsabilidad de tener una única instancia recae en el cliente de la clase.

El patrón Singleton hace que la clase sea responsable de su única instancia y se implementa creando en nuestra clase un método para la creación de la instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).

Resumiendo, el patrón Singleton, provee una única instancia global ya que:
  • La propia clase es responsable de crear la única instancia.
  • Permite el acceso global a dicha instancia mediante un método de clase.
  • Declara el constructor de clase como privado para que no sea instanciable directamente.
El diseño clásico de un es el siguiente:

Analizando la clase se puede observar el uso de los modificadores "private" y "static" en el constructor que hacen que no se pueda crear la clase de forma directa, sino a través del método public GetInstance() que devuelve la instancia creada.

A continuación voy a mostrar un ejemplo en c# en el que tendremos dos clases, que al crearse se guardan la fecha y hora de creación:
  • "Instancia1", en la que no se utiliza el patrón Singleton
  • "Instancia2" en la que implementaremos el patrón Singleton.
    Para utilizar esta clase se deberá invocar mediante el método "GetInstance()".
Aquí les dejo el pantallazo del programa en el que se utilizan ambas clases, es muy básico con la opción "a" se crea una instancia de la clase que no tiene implementado el patrón Singleton y con la opción "b" se crea la instancia con el patrón implementado y estas instancias se guardan en una lista para mostrarlas.


Como se puede observar cada vez que se crea una instancia sin el patrón Singleton obtenemos una fecha y hora diferente, es decir, son instancias diferentes que se crean en cada llamada. En cambio, utilizando el patrón Singleton obtenemos la misma fecha y hora, ya que se crea una sola instancia de acceso global.

Si quieren ver el código fuente completo, aquí les dejo el código.

Encriptar texto con Monodevelop


Las contraseñas e "información sensible" en una base de datos es muy importante, por lo que deben estar protegidas mediante algún algoritmo de encriptación.

Hoy os explicaré en pequeño código para poder encriptar y desencriptar texto.

Primero definiremos una variable global para tener acceso a los servicios criptográficos.

En esta la siguiente función se define la clave para la codificación e inicializan la variable que nos dará acceso a los servicios criptográficos.


Las siguientes funciones realizaran la codificación y decodificación de los datos.


La función "Initkey" la debes llamar antes de utilizar a las funciones "Codificar" o "Decodificar", de lo contrario el programa fallará. Como alternativa puedes llamar a "InitKey" desde las funciones "Codificar" y "Decodificar", así seguro que no se te olvida.

Sencillo verdad? Pues ya no tienes excusa para guardar contraseñas sin encriptarlas.

Aquí os dejo el enlace al proyecto. Encriptar.zip

Greenfoot 2.1

Greenfoot es un entorno de programación multiplataforma de aplicaciones y juegos en Java sin conocimientos de programación.

En la web oficial encontrarás tutoriales y ejemplos para iniciarte en este entorno. Además de imágenes y fondos para poder utilizar. Cabe destacar que podrás utilizar Microsoft Kinect, he aquí el ejemplo:

Crear un Web Service con Monodevelop

Antes de explicaros el ejemplo, explicaré ¿Que es es un Web Service?

Un Web Service es un componente de software que utiliza un conjunto de protocolos y estándares para permitir el intercambio de datos entre aplicaciones.

La comunicación se realiza mediante métodos que al ser invocados por otros sistemas vía una URL devuelven información usando protocolos estándares como HTTP, XML, SOAP, WSDL, UDDI, WS-Security

Este documento de información devuelto por el Web Service puede ser procesado por cualquier aplicación o sistema en cualquier sistema operativo con cualquier lenguaje de programación que tenga las capacidades de procesarlo.

Como inconveniente se encuentra su rendimiento "bajo" si se compara con otros modelos de computación distribuida, tales como RMI (Remote Method Invocation), CORBA o DCOM (Distributed Component Object Model). Es el inconveniente "a pagar" por adoptar un formato basado en texto (XML).

A nivel de programación un Web Service es una clase que generalmente heredada de System.Web.Services.WebService y que contiene métodos que se publicaran en una página .asmx que es la extensión predeterminada de las páginas donde se ejecutan los Web Service.

Los Web Service, como he explicado en la introducción están pensados para ser utilizados por aplicaciones, por lo que no requieren una interfaz gráfica. Aunque para probar su ejecución de forma local Monodevelop provee una plantilla.

Bueno y después de esta explicación vamos al ejemplo.


Lo primero será instalar Monodevelop. Y además se requiere tener el servidor de pruebas, para ello:
$ sudo apt-get intall mono-xsp2
Para crear el Web Service, abre MonoDevelop, para ello ve a Aplicaciones -> Programación -> MonoDevelop.


Ahora pulsamos sobre "Iniciar nueva solución". Elegimos "Aplicación web" e indicamos el título "WebService"


Una vez creada la estructura de la aplicación Web, deberemos añadir el archivo de los Web Service, para ello encima del proyecto "WebService", hacemos click con el botón derecho y vamos a Añadir -> Nuevo archivo...


y seleccionamos ASP.NET -> Servicio web con CodeBehind y le asignamos el nombre del Web Service, en nuestro caso “WebService”.


Las páginas ASP .NET (aspx) y los páginas de los Web Service (asmx) pueden programarse como Server Side Scripting que es una mezcla de etiquetas aspx con código C# dentro de una misma página con extensión .asmx. Es más recomendable utilizar Code Behind ya que permite separar el funcionamiento o sea la lógica de programación en un archivo de clase C# y la presentación en la página .asmx, a la cual se asociada el archivo de clase C#.

En el archivo de clase que se crea contiene la estructura mínima necesaria para tener la clase como Web Service. A la que deberemos añadir los métodos.


En el ejemplo he creado un método que devuelve la suma de dos enteros. Observa que el método lleva el atributo [WebMethod()] antes de su declaración, es obligatorio. Además he añadido la propiedad Description, que se mostrará en el método cuando se publique.
La propiedad tiene otros atributos:
  • BufferResponse, true o false para indicar o no si la respuesta del Web Service es serializado en un buffer de memoria hasta ser completada o hasta que el buffer este lleno.
  • CacheDuration, establece el número de segundos que la respuesta estará contenida en el cache.
  • EnableSession, false o true para el soporte de sesiones.
  • MessageName, identifica mediante un alias los métodos sobrecargados. 
  • TransactionOption, habilita al método para participar o no en una transacción, si ocurre una excepción en el método la transacción es abortada.
Para terminar y antes de ejecutar el proyecto deberemos editar el fichero Default.aspx para que enlace con nuestro Web Service.

Ahora ya podemos ejecutar el proyecto tecleando F5 y si instalamos bien el servidor de pruebas, se abrirá el navegador web y mostrará una página en donde sólo aparecerá un enlace que dice WebService.



Al hacer doble click en el enlace, aparecerá la plantilla que genera Monodevelop de pruebas. Para probar el método haz click en el enlace correspondiente, para que se muestren las opciones del método enlaces en la parte superior y como overview nos muestra sus parámetros y el tipo de dato que devuelve.



Si quieren ver el código fuente completo, aquí les dejo el código.

Trabajar con el conector de MySQL en MonoDevelop

Después de pelearme con el conector de MySQL os voy a explicar como se referencia dentro de una solución con MonoDevelop.

Lo primero será instalar Monodevelop y un servidor de MySQL si no lo tenemos todavía. Después tendremos que descargarnos del conector desde la página web de MySQL. Elige la opción .NET & Mono, como se indica en la imagen.


Una vez descargado, descomprime el archivo y busca el archivo mysql.data.dll, (Si estas trabajando desde Linux como es mi caso el archivo lo deberás renombrar a MySql.Data.dll, recuerda que Linux es "case sensitive") el cual deberemos instalar en la caché de ensamblados global de Mono. Para ello ejecuta, desde la carpeta donde se encuentra el archivo ejecuta:

$ sudo gacutil -i MySql.Data.dll
Con esto ya tendremos instalado el ensamblado para utilizarlo desde MonoDevelop. Y sólo nos queda crear el proyecto.

Ahora abrimos a MonoDevelop y creamos una solución nueva.


Al crearse la solución nos dirigimos a las Referencias del proyecto y desde allí importamos el ensamblado. Para ello seleccionáis pulsamos con el botón derecho sobre "Referencias" y seleccionamos "Editar referencias...".


De las tres opciones que aparecen en el diálogo entramos en "Ensamblado .NET", buscamos el fichero MySql.Data.dll que acabamos de descargar y lo añadimos a las referencias de la solución.


Ahora ya estamos preparados para usar el conector de MySQL desde la solución de MonoDevelop.

Aquí os dejo un código de ejemplo:

yEd, una buena alternativa a Visio

yEd es una alternativa a Ms Visio, muy completa y fácil de manejar. Con este editor y generador de diagramas podrás realizar gráficos profesional en pocos pasos.


Con yEd puedes trabajar a partir de un diagrama partiendo de cero o creando uno automático, moldeable totalmente gracias a la paleta de símbolos, flechas, globos y figuras que incorpora. Admite distintas estructuras, como jerárquico, orgánico, circular, en forma de árbol o por etiquetas, así como la posibilidad de agrupar elementos de manera automática o manual. Además desde el propio programa podrás navegar por el diagrama a pantalla completa.

Entre las principales características de la aplicación se puede destacar:
  • Disposición automática. yEd se encarga de ordenarte de forma automática el diagrama.
  • Conexiones. Con estilo orgánico u ortogonal.
  • Ubicación de etiquetas.
  • Agrupación de elementos del diagrama.
  • Un espacio de trabajo adaptable que te permite ajustar la ventana de herramientas a tus necesidades.
  • Se puede abrir varios proyectos de forma simultánea.
  • Un editor de propiedades tipo tabla, que te permite configurar fácilmente las porpiedades.
  • Un sofisticado sistema de presentación preliminar.
  • Permite agregar tus propios simbolos lo que la transforma en una herramienta definitiva.
Esta escrito en Java por lo que tendrás que tenerlo instalado.

Para instalarlo descárgate el script de instalación y desde la consola ejecuta:
$ sudo ./yEd-3.6.1.1.sh
Una vez terminada la instalación desde el directorio donde lo hayas instalado ejecuta:
$ ./yEd

Native Client SDK


Google publica el SDK Native Cliente, un entorno de desarrollo para que los programadores que deseen puedan crear aplicaciones de navegador capaces de aprovechar todos los recursos del sistema (ejecución con varios núcleos, 3D de alto rendimiento, acceso directo a la memoria del sistema) eso sí, protegido con el sistema de sandboxing de Chrome para que nadie pueda utilizar estas funcionalidades para entrar al sistema desde el navegador.

De momento esta en el canal beta de Chrome y hay versiones para Windows, Mac y Linux. Al estar en versión beta, Google advierte que puede cambiar evolucione el SDK.

Fuente: electronista

Instalar monodevelop y mi primer programa


Mono es una implementación libre del lenguaje C# y MonoDevelop es un IDE para GNOME diseñado para programar en C# y otros lenguajes .NET.

Para instalarlo simplemente, desde la consola, ejecuta el siguiente comando:
$ sudo apt-get install monodevelop

Para crear el primer programa, abre MonoDevelop, para ello ve a Aplicaciones -> Programación -> MonoDevelop.


Ahora pulsamos sobre "Iniciar nueva solución". Elegimos "Proyecto de consola" e indicamos el título "HelloWorld".


y pulsamos "Adelante". Se mostrará una pantalla en la que dejaremos en blanco las opciones que nos propone.

Y ya tenemos nuestro primer programa el código de Hello Wordl! en C#.


Para ejecutarlo pulsa "Ctrl + F5.