lunes 6 de julio de 2009

Nocturnal Initiative Events (1/2): Introducción

0 Comentarios

En la siguiente mini-serie de entradas estudiaremos la implementación de un sistema de Eventos en C++ que ha seguido el código de Nocturnal

Introducción Eventos

En este caso concreto, por evento me refiero a una implementación del patrón Observer: Observer Pattern (tamaño original)

El patrón Observer define una relación uno-muchos entre objetos, de forma que un objeto (el sujeto, subject) envía una notificación a uno o varios objetos (los observadores, observer) cuando ocurre un cambio de estado en el subject.

Para ello los observers han de registrarse previamente con el subject, para establecer que quieren ser notificados. Con este patrón evitamos que los observers tengan que realizar un pooling periódico para preguntarle al subject si ha cambiado su estado, y a la vez tenemos acceso al estado de los objetos observer, pues el código que se ejecuta cuando ocurre el cambio de estado es parte de los observers.

¿Cómo implementar ésto en C++? Para responder a ésto, antes debemos sentar algunas bases.

Punteros a función

En C/C++ una implementación parcial del patrón observer se consigue con punteros a función. Un puntero a función es una variable que almacena un puntero a la dirección de memoria donde empieza una función, de forma que al llamar a la variable con la sintaxis de una función, se ejecuta aquella a la que apunta

//Punteros a función en C/C++. 

//Puntero a función que recibe un entero como argumento y retorna un std::string
(std::string) (*MyFunctionPointer) ( int entero);

//definimos un par de funciones que cumplen la firma anterior
std::string Funcion1(int integer)
{
return "null";
}

std::string Funcion2(int integer)
{
std::ostringstream oss;
oss << integer;
return oss.Str();
}

//Declaramos una variable que almacenará el puntero a la función que queramos
MyFunctionPointer variableQueAlmacenaUnPunteroAFuncion;

//asignamos el valor de Function1 al puntero a función
variableQueAlmacenaUnPunteroAFuncion = Funcion1;

//prints "null"
std::cout << variableQueAlmacenaUnPunteroAFuncion (5) << std::endl;

//asignamos el valor de Function2 al puntero a función
variableQueAlmacenaUnPunteroAFuncion = Funcion2;

//prints "5"
std::cout << variableQueAlmacenaUnPunteroAFuncion (5) << std::endl;


Con los punteros a función sólo podemos almacenar una única función. Si quisieramos almacenar un conjunto de funciones, tendríamos que crear una lista de punteros.


Punteros a Método


El problema es que los punteros a función sólo pueden almacenar, bien funciones tradicionales C, o bien métodos estáticos de una clase. Esto sucede porque un método de una clase siempre tiene un parámetro oculto, el puntero this. Por ello en C++ existen los punteros a métodos:


class MiClase
{
public:
int MiMetodo(int entero1, int entero2){return entero1 + entero2;}
};

//Puntero a método de la clase MiClase
typedef int (MiClase::*MiPunteroAMetodo) (int entero1, int entero2);

Sin embargo una importante limitación es que para invocar un puntero a método, se requiere una instancia de la clase para la cual se ha definido el puntero a método:

MiPunteroAMetodo variableQueAlmacenaUnPunteroAMetodo = &MiClase::MiMetodo;
MiClase* miClase = new MiClase();
(miClase->*variableQueAlmacenaUnPunteroAMetodo)(5, 5);


Es decir, que necesitarmos guardar tanto la función método, como una instancia del objeto a la hora de implementar eventos en C++



Delegados y Eventos en C#


En C# tenemos la figura del delegate (delegado) que básicamente es lo mismo que un puntero a función y un puntero a miembro, ya que admite funciones y metodos de clase. A su vez permite "de serie", el registrar varias funciones al mismo delegate, de forma que cuando éste es llamado, se ejecutan todas las funciones registradas, y no sólo una como ocurre con los punteros a función o los punteros a método de C/C++ Un evento en C#, no es más que un delegado ya instanciado y con una sintaxis especial. Por ello los eventos en C# son una implementación de libro del patrón observer.



Para la siguiente entrada veremos cual ha sido la aproximación seguida en el código de Nocturnal para implementar eventos en C++.

domingo 31 de mayo de 2009

Contrato NDA simple y sencillo

0 Comentarios

Contrato NDA (No Divulges Amigo)
El presente acuerdo se realiza en el día __ de ___ de ____, reunidos_____________ (en adelante "El Consejero") y _____________ (en adelante "El Artífice" o "Yo") sobre el trato de la información (en adelante "La Idea") que El Artífice ha decidido compartir con El Consejero.

Exposición
El Artífice tiene una gran idea que elige compartir a El Consejero, con el conocimiento mutuo de que El Consejero es amigo de El Artífice y no le va a joder.
Posibilidades de jodienda incluyen, sin limitarse a:
1. Adaptar parte o toda La Idea por parte de El Consejero para propósitos propios.

2. El Consejero comparte parte o toda La Idea con otros que no están adheridos a este contrato.
3. El Consejero no ha intentado con todas tus fuerzas proteger La Idea

Esto es un acuerdo de buen rollo, donde al pedir a El Consejero que se adhiera al mismo, se espera que El Artífice consiga dormir con algo de tranquilidad por las noches al introducir un poco más de formalidad a la hora de compartir La Idea. El Artífice cree solemnemente que La Idea sólo podrá mejorar por medio de las opiniones honestas y sinceras de El Consejero.

Alcance
Los términos de este acuerdo continuarán hasta que La Idea no sea considerada confidencial por El Artífice.

Ruptura de los términos
Este acuerdo no tiene un ápice de base legal. Sin embargo, en caso de cualquier ruptura o violación del acuerdo, El Artífice será libre de realizar todas o parte de las siguientes acciones, sin limitarse exclusivamente a ellas:
1. Maldecir a El Consejero y posiblemente mentar a la Madre que lo Parió, o cualquier otro familiar cercano.

2. Contarle a todo el mundo la manera en que el Consejero le ha jodido.
3. Escribir al respecto de la traición de El Consejero en el blog de El Artífice, y con MAYÚSCULAS.
4. Dejar de considerar a El Consejero como una persona en la que se le puede confiar a la hora de compartir información.


Compartir
El Consejero podrá compartir parte o toda La Idea con terceros, siempre que El Artífice sea previamente notificado y que dichos terceros se adhieran a los términos y principios de este acuerdo NDA.


Cancelación
La cancelación de este contrato puede realizarse unilateralmente por cualquiera de sus participantes, pero El Artífice espera que El Consejero no se comporte como un capullo.

Comprendes y aceptas los términos de este acuerdo al leerlo. Si encuentras parte de este acuerdo incómodo o confuso, tampoco te preocupes mucho. Podemos hablar de otro tema.


Traducción libre de http://www.friendda.org/

viernes 15 de mayo de 2009

Gamelab 2009 inscripción abierta

La Feria Internacional del Ocio Interactivo, es decir, el Gamelab 2009 ya admite inscripciones, y hacerlo es tan sencillo como registrarse en un formulario. Entre otras novedades este año el acceso es gratuito, lo que es de agradecer. Además el evento cambia de lugar, celebrándose esta vez en la Universidad Laboral de Gijón, los días 1, 2 y 3 de Julio.

Este año, además de los “tradicionales” Premios a la industria del videojuego, hay un evento muy interesante, el Gamelab Challenge.

El Gamelab Challenge es una competición para que un equipo de máximo 4 personas cree un juego en 48 horas dos días.

Es interesante que el código de los proyectos se publicará con licencia libre, aunque la propiedad intelectual seguirá perteneciendo a los participantes.

Seguro que se verán cosas muy interesantes, talento no falta. Además, si te inscribes además te pagan el alojamiento. :)

Podéis estar al tanto de las últimas novedades por medio del twitter del Gamelab, ver las fotos del evento que se irán publicando en Flickr, así como asistir virtualmente a las conferencias por medio del canal de youtube.

miércoles 29 de abril de 2009

Nuevo dominio para el blog

1 Comentarios

Una corta entrada para estrenar el nuevo dominio del blog: http://www.crazypointer.com aprovechando el alta en Google Apps
Ahora a sacarle partido e intentar meter más de una entrada al mes :)

domingo 26 de abril de 2009

Cómo usar el DNI electrónico (2/2)

0 Comentarios

Ya ha pasado casi un mes desde la anterior entrada, así que creo que ya va siendo hora de finalizar con esta mini-serie y ponernos a instalar y configurar el hardware y software necesario para poder utilizar nuestro DNI-e.

El lector

Lector LTC31Lo primero que necesitamos es configurar el lector en nuestro sistema. Obviamente esto dependerá por un lado del sistema en cuestión y por el otro del modelo del lector escogido. En mi caso el lector tiene el aburrido nombre de LTC31, que contrata con el curioso nombre de su fabricante, una empresa española denominada C3PO que no se cómo habrá pasado desapercibida a atenta mirada de George Lucas y sus abogados. La elección del mismo ha sido simple: bajo precio y disponibilidad en la tienda más cercana a mi casa.

La configuración del lector no es complicada. En la página de soporte del fabricante instalamos los drivers para que el sistema lo reconozca, conectamos el lector a un puerto USB y localizará los drivers automáticamente. Me encontré con una sorpresa en el caso de Mac, donde el lector no necesita instalación de driver alguna, ya que el lector sigue el estándar USB CCID (la norma USB para lectores de smart-cards, que es lo que es en el fondo un lector de DNIe) y funciona perfectamente con los drivers del sistema sin instalar nada. Mola.

Módulos criptográficos

Ahora toca instalar este software de genérica denominación. Permitiéndome un poco de deformación profesional -y para reflejar que de verdad he mirado un poco este tema- comentar que un módulo criptográfico no es más que una norma que define un API que permita comunicarse con dispositivos criptográficos, que en nuestro caso es el lector.

Hay dos implementaciones, una para windows, denominada CAPI y otra para Mac y Linux, llamada PKCS11. Ambas pueden obtenerse desde el portal oficial para el DNI-e, en la sección de descargas.

Con esto ya está casi todo preparado. Sin embargo hay un problema. Como explicamos en la primera entrada sobre el DNI-e, en el proceso de crear una comunicación segura entre ambos usuarios tenemos que poder identificar a ambas partes. Nosotros nos identificaremos usando el certificado de autenticación contenido en el DNI-e. El que nos presta un servicio necesitará validarse también usando un certificado que será contrastado con una Autoridad Validadora que será la encargada de verificar que los certificados de dicho servicio son válidos.

Por esto hay que realizar un par de pasos. Lo primero informar al sistema qué Autoridades Validadoras tendremos que usar para comprobar que esos certificados son válidos. Lo segundo es obtener los certificados de los prestadores de servicios.

Instalar Autoridades Validadoras en eL sistema.

Esto también está disponible en el portal del DNIe. Esa página nos muestra los tres principales servicios de validación, que serán la Fábrica nacional de moneda y timbre, el Ministerio de Administraciones Públicas, y el Ministerio de Industria Turismo y Comercio. Para cada uno de ellos tenemos disponible un link de descarga de su certificado (en ficheros .zip que contienen el fichero de certificado .cer)

Debemos descargar los tres y guardarlos en alguna carpeta para instalarlos en el sistema y que sean reconocidos por nuestro navegador.

Internet Explorer

Instalar el certificado no puede ser más fácil. Doble clic en el fichero de certificado y aparecerá una ventana como la que muestro un poco más abajo. Pulsáis el botón “Instalar certificado” y a seguir el asistente. La única duda puede aparecer cuando pregunte por el almacén de certificados donde debería instalarse. Basta con dejar la opción por defecto, que le indica al sistema que lo seleccione automáticamente.Instalación de fichero de certificado para una Autoridad Validadora

Podremos comprobar que los certificados están correctamente instalados iniciando Internet Explorer, y pulsando en el menú Herramientas / Opciones de internet, pestaña Contenido, botón Certificados.

 Certificados instalados en IE

Firefox

En firefox el proceso es un poco más largo, ya que no obtiene los certificados instalados en el sistema, y deberemos indicarle cuales usar. Sigue siendo muy sencillo en cualquier caso.

Vamos al menú Herramientas / Opciones, y pulsamos en la pestaña Avanzadas en la ventana que aparece, para obtener esto:

ff_opciones_avanzadas Pulsamos el botón Ver certificados. En la ventana que aparece pulsamos la pestaña “Servidores”, y una vez seleccionada esta pulsaremos el botón Importar. Ahora buscamos y seleccionamos los ficheros de certificado que hemos descargado del portal del DNIe (hay que hacerlo uno por uno) y pulsamos abrir. Con eso ya tendremos instalados los certificados, y deberíamos obtener algo parecido a esto:

vista_certificados_ff

Comprobando que todo funciona

Ahora ya estamos listos para probar el DNIe desde la página de prueba que nos proporciona el portal del DNIe. Recuerda que antes de hacer click deberás tener el DNIe insertado en el lector. También al hacer clic el sistema nos pedirá el PIN del DNIe por medio de una de estas dos ventanas, dependiendo del navegador que uses:

solicitud_pinff_password_dnie 

Clic para probar tu DNIe

Si puedes ver tus datos es que tu DNIe funciona correctamente.

No te olvides de probar también la firma en esa misma página. En el cuadro de texto pones cualquier palabra y pulsas el botón firmar. Te volverá a pedir tu PIN del DNIe, y si todo ha sido correcto debería crear una firma válida.

Si todos los pasos han sido correctos ya podrás acceder a las ventajas del mismo desde las páginas oficiales del estado, a la falta de obtener los…

Certificados de prestadores de servicios

Los prestadores de servicios utilizan certificados para identificarse, igual que nosotros con el DNIe, como hemos explicado. Sin embargo nosotros no hemos instalado esos certificados en el sistema. Lo que hemos instalado son unas herramientas que nos permitirán validar que esos certificados son correctos y que podemos confiar en ellos. Sin embargo podemos encontrarnos con certificados que no usan uno de esas tres Autoridades Validadoras para certificar su validez, pero dándose el caso de que nosotros confiemos en ellas igualmente. Eso nos puede hacer saltar una alerta de seguridad en el navegador, y es posible que nos pille con la guardia baja sin saber qué es lo que pasa o qué hacer.

Hum, explicando esto me estoy haciendo un lío yo mismo, lo que es bastante triste, así que expliquémoslo de otra manera:

Imaginemos que tenemos un amigo, Pepín, que es un fiera en esto del networking y tiene una base de datos que ríete tú de la lista de amigos de Obama en Facebook. El tío además tiene todos los datos posibles de sus contactos: nombre, apellidos, residencia, DNI, una foto, la huella dactilar, su firma manuscrita, sus datos bancarios, edad, altura, peso, el número que calza (de pie)… vamos todo lo que puedas averiguar de una persona, Pepín lo tiene. Sin embargo Pepín es una persona íntegra, que nunca da esos datos a terceros, por tanto se ha ganado la confianza de todos sus contactos y todo el mundo confía en su honradez y principios. Los servicios que ofrece Pepín se basan en esa confianza: tú le das los datos que una supuesta persona te ha dado y el te indica si esos datos son correctos, y además lo hace gratis porque es todo un filántropo. Pepín es por tanto nuestra Autoridad Certificadora.

Supongamos que conocemos a una persona, Juan, que nos da unos datos personales de referencia para certificar su identidad. Como queremos hacer negocios con él y nos hemos llevado malas experiencias anteriores, nuestras alarmas saltan: hemos de asegurarnos de que Juan es realmente Juan, y no otra persona haciéndose pasar por él. Por ello enviamos esos datos a Pepín, y el nos contesta diciéndonos que son correctos. Como quiera que confiamos en Pepín, ahora tenemos la certeza de que Juan es quien dice ser. Juan hace lo mismo con los datos que nosotros le hemos proporcionado para probar nuestra identidad, y todos contentos.

Sin embargo imaginemos que Juan es un tío asocial, que no está en la red de contactos de Pepín, pero que nosotros conocemos de toda la vida. Pues aunque Pepín no pueda certificar que Juan es quien dice ser, nosotros haremos una excepción al procedimiento y simplemente confiaremos en los datos que nos ha proporcionado.

Pues algo parecido pasa cuando queremos acceder a los servicios y usamos nuestro DNIe. El DNIe contiene un certificado digital que nos identifica, y el prestador de servicios tiene el suyo. Ese certificado digital hemos de obtenerlo de alguna parte. Como esto es internet, el futuro y todo eso,la obtención del certificado es automática, y el prestador de servicios nos lo enviará automáticamente en el proceso de crear una conexión segura. Sin embargo si no fuera posible validar ese certificado con las Autoridades instaladas anteriormente, es posible que una alarma de seguridad nos aparezca dependiendo de nuestro nivel de seguridad del navegador,  ya que estamos obteniendo un certificado automáticamente que a priori no sabemos de quién es. Sin embargo puede que no nos importe porque confiamos en que esa página web es quien dice ser.

Lo más probable es que nos salte en firefox antes que en IE (sorpresa!), y sea una ventana como esta:

certificado Si sabemos que la página a la que accedemos es correcta en general podremos añadir la excepción de seguridad (que lo que hace es descargar el certificado y añadirlo a la lista de certificados seguros) sin problema.

En este caso la página que hace saltar esa identificación es la del INEM.

 

Y eso es todo, a partir de ahora podremos utilizar los servicios del DNIe, y con suerte evitarnos tiempo perdido haciendo cola en las administraciones públicas.

No olvidéis visitar la página de vuestro ayuntamiento ya que muchas competencias relativos a estos servicios están descentralizadas y es responsabilidad de cada región proporcionarlas. Por ejemplo, datos de empadronamiento o catastro son datos que deben ser solicitados a tu ayuntamiento.

Feliz uso del DNIe!