Hace un poco más de un mes mi madre me dejó un libro de Lincoln Child llamado “Armonia Perfecta”. Trata de una empresa llamada Eden que ofrece servicios de búsqueda de la pareja perfecta. Esos servicios cuestan 24.000 dolares y a base de una serie innumerable de tests psicologicos y de otros tipos y un super-ordenador con complejos algoritmos de inteligencia artificial va combinando los “especimes” hasta que encuentra una pareja lo más compatibles posible.
Yo, como ingeniero informatico pensé enseguida la viabilidad de algo parecido. Esta claro que el libro es muy peliculero pero quizá se pueda hacer algo parecido con muchos menos recursos. Y me puse manos a la obra.
Encontré en Facebook la plataforma perfecta para la aplicación. La gente puede darse de alta y lo primero que tiene que hacer es introducir sus parametros de busqueda (edad, sexo y localizacion geografica). Cada poco tiempo incluiré nuevos tests para que intente conocer más el perfil de cada persona: gustos, personalidad, hobbies… Y cuando haya suficiente gente en el sistema, empezaré una busqueda por semana. Buscará las mejores coincidencias en entorno local (20 km), cercano (40 km) y lejano (100 km) indicando cual es el mejor porcentaje de compatibilidad encontrado. Cada persona puede entonces elegir una de los resultados y concertar una cita. Si ambas partes estan de acuerdo se sugiere un sitio en el que se encontrarán fisicamente.
A cualquiera que esté interesado en encontrar su pareja perfecta en facebook sólo tiene que entrar en Eden y esperar que empiece a dar resultados. Todo el mundo está invitado.
Octubre 4, 2009
Busca tu pareja perfecta en facebook
Octubre 21, 2008
Framework para objetos Mock propuesto
Ahora estamos peleando con Unit Testing y claro, a no ser que tu codigo solo calcule series fiabonacci o algoritmos de ordenación, existe una serie de elementos externos como bases de datos, hardware especializado, uso de ficheros y del sistema operativo. Para aislar el codigo a probar de esta serie de elementos se usa los objetos Mock.
Un objeto Mock es un objeto que es llamado por el codigo a probar y que permite especificar su comportamiento al detalle para forzar todas las situaciones posibles. El codigo a testear no debe tener logica que sea distinta segun sea en situacion de testeo o en produccion. Despues de darle muchas vueltas y un par de intentos fallidos se ha llegado a este framework. Esta diseñado en C++ que es el lenguaje que uso más que el castellano.
Se creará una clase abstracta que tendrá todos los metodos necesarios para simular la clase. De esta clase heredaran una clase que será la que realmente haga el trabajo en situacion real y otra clase que será la Mock.
Se pueden definir estas clases para simular DLL’s, acceso a bases de datos, acceso a ficheros, llamadas al api de windows (GetProfileInt, MessageBox, Sleep,…), tambien se puede crear una clase para las peticiones de datos con dialogos al usuario.
Ejemplo: Clase que simula al API de Windows
// Clase abstracta
class CWinApiBaseClass {
CWinApiBaseClass();
virtual CWinApiBaseClass();
virtual int MessageBox(HWND ventanaPadre,LPCTSTR mensaje,LPCTSTR title,int flags)=0;
}
//Clase real (wrapper sobre el codigo llamado)
class CWinApiWrapper:public CWinApiBaseClass {
CWinApiWrapper ();
virtual CWinApiWrapper ();
virtual int MessageBox(HWND ventanaPadre,LPCTSTR mensaje,LPCTSTR title,int flags);
}
int CWinApiWrapper::MessageBox(HWND ventanaPadre,LPCTSTR mensaje,LPCTSTR title,int flags){
return ::MessageBox(ventanaPadre,mensaje,title,flags);
}
//Clase mock
#define WinApiMock_MaxCalls 100 // Permite definir el maximo de los arrays de datos
class CWinApiMock:public CWinApiBaseClass {
CWinApiMock();
virtual CWinApiMock();
virtual int MessageBox(HWND ventanaPadre,LPCTSTR mensaje,LPCTSTR title,int flags);
//Para MessageBox
unsigned int m_nCallsMessageBox; // Permite saber si se ha llamado o no a la funcion
HWND m_ListMessageBoxHWND[WinApiMock_MaxCalls];
CString m_ListMessageBoxMessage[WinApiMock_MaxCalls];
CString m_ListMessageBoxTitle[WinApiMock_MaxCalls];
int m_ListMessageBoxFlags[WinApiMock_MaxCalls];
int m_ListMessageBoxRetValue[WinApiMock_MaxCalls]; //Permite indicarle qué va a retornar
}
CWinApiWrapper::CWinApiWrapper(){
// Se inicializa los contadores a 0 y todos los arrays que lo necesiten a 0 con ZeroMemory
}
int CWinApiWrapper::MessageBox(HWND ventanaPadre,LPCTSTR mensaje,LPCTSTR title,int flags){
m_nCallsMessageBox++;
m_ListMessageBoxHWND[m_nCallsMessageBox]=ventanaPadre;
m_ListMessageBoxMessage[m_nCallsMessageBox]=mensaje;
m_ListMessageBoxTitle[m_nCallsMessageBox]=title;
m_ListMessageBoxFlags[m_nCallsMessageBox=flags];
return m_ListMessageBoxRetValue[m_nCallsMessageBox];
}
Es importante tambien definir una variable global por cada clase que contenga el objeto wrapper real. Este objeto se usará para iniciar por defecto todos los usos al uso el produccion.
// En el WinApiBaseClass.h
#ifndef CWINAPIMOCK_CPP
#define CWINAPIMOCK_CPP
extern CWinApiWrapper glWinApiWrapper;
#endif
// En el WinApiBaseClass.cpp
CWinApiWrapper glWinApiWrapper;
// En el .h la clase a testear
protected:
CWinApiBaseClass *m_winapi;
//En el constructor de la clase a testear se inicia el puntero
CClaseATestear::CClaseATestear(){
m_winapi=&glWinApiWrapper;
}
//Cada vez que el codigo llame a MessageBox se usa el puntero a la clase abstracta, iniciada por defeco a la
// real para que no haya problemas en produccion
…
int ret=m_winapi->MessageBox(GetSafeHwnd(),_T(“¿Quiere continuar?”),_T(“Mi aplicacion”),MB_YESNO);
//Cuando se testea el codigo hay que cambiarle el puntero para que apunte al objeto mock
CTestClaseATestear::TestFuncionATestear(){
CWinApiMock mock;
CClaseATestear miClase;
miClase.m_winapi=&mock;
mock.ListMessageBoxRetValue[0]=IDYES; //Forzamos el retorno del messagebox
CPPUNIT_ASSERT(miCLase.FuncionATestear());
CPPUNIT_ASSERT(mock.m_nCallsMessageBox==1); // Comprobamos que realmente se ha llamado
}
Y esto es todo. Espero vuestros comentarios
Marzo 17, 2008
Masoca’s tools
Así llamabamos a los juegos y aplicaciones que instalabamos hace 15 años con una pila de 20 discos de 3 1/2. Eran epocas gloriosas. Para hacer funcionar un juego (backup o con los discos originales) teniamos que trastear el autoexec.bat para cargar unas cosas sí y otras no. Todo esto para liberar las 640 K de memoria base y el juego arrancara.
Aplicaciones como el ‘a.exe’ que le autocompletaban directorios cuando cambiabas usandolo en lugar del ‘cd’, comprimiendo y descomprimiendo con el pkunzip, arj, formateando los discos con el 2MF para lograr que los discos de 1,4 se conviertieran en 2MB, … Habia que complicarse para lograr pequeños hacks que ibamos necesitando para el dia a dia.
Ahora la administracion de los PCs se ha vuelto mucho más intuitiva, con el boton derecho del raton tienes acceso a todas las opciones que te brinda el sistema operativo, en Internet tienes informacion de cómo mejorar tu sistema operativo hasta hacerlo tan rapido como si tuviera la version anterior del mismo
Sin embargo en cuestiones de administracion uno se vuelve muy perezoso. Puedo aguantar meses y meses pulsando una tecla al arranque para que no me analice mi C: porque tarda la vida, el escritorio se me va llenando de iconos, tengo el mismo wallpaper desde hace más de 2 años,…
Sin embargo en cuestion de programación aun tengo esa costumbre de intentar saber bien que hace exactamente el código que escribo. Desde hace más de 5 años programo en C++ con Visual Studio 6. Me manejo con mucha soltura con MFC, que es una pesadilla para los programadores de Visual Basic pero para los que sabemos que habria que hacer para programar lo mismo con el API de Win32 es una maravilla. Pero el tiempo avanza…
Llegan nuevas tecnologias y APIs de programacion: Windows Presentation Fundation, Windows Communication Fundation, las clases ya trabajadas que se usan en .NET,.. Todo un mundo de tecnologias ya hechas que, aunque quiera resistirme (que no es el caso), noto que necesito aprender y adaptarme. Donde trabajo tenemos mucho, mucho codigo en proyectos como he comentado (C++ con MFC). Hemos decidido dar el gran paso, pero darlo como Dios manda. Cuando empezamos no sabiamos de .NET, de patrones Modelo-Vista-Controlador (MVC) y practicamente nada de Unit Testing. ¿Que hacer para arreglarlo? Hacerlo todo a la vez mientra migramos a Visual Studio 2008.
En este blog voy a intentar ir publicando las cosas que vamos descubriendo que espero que le sirva a otros programadores, tan “masocas” como yo que prefieren seguir usando C++ con toda la parafernalia de nuevas tecnologias que nos llegan.
Empezamos el viaje…
Noviembre 26, 2007
Windows CardSpace, breve descripción y comentarios
Como se habrá visto en mi anterior post de programación, estoy haciendo el curso de desarrollador 5 estrellas de microsoft (www.dce2005.com). El primer curso de la cuarta estrella trata de Windows CardSpace. Esto es una idea de Microsoft para intentar reducir el problema de phising (peticion de password al usuario creando una web haciendose pasar por la original).
El uso de password lo sustituye por tarjetas de identificacion que se almacenan en el ordenador del usuario. Estas tarjetas no contienen informacion del usuario sino que se usan para pedir esa informacion de modo cifrado a una tercera entidad llamada proveedor de identidad (identity provider). Esta entidad le devuelve el grupo de informacion en un token al usuario que a la vez lo envia a la web para identificarse. El token esta formado por una serie de claims que cada uno es un dato, puede ser usuario, dirección, … De estos datos la web coge los que necesita para identificar al usuario.
De aqui surgen varios inconvenientes.
Primero que la informacion se almacena en el ordenador del usuario y necesita exportarlo por ejemplo a un USB e instalarlo en el ordenador que vaya a usarlas, por ejemplo un Cybercafe. Microsoft entiende que esto es un problema e informa que en la proxima version se podrá usar directamente del USB sin instalarla. Esto sí es una buena idea ya que igual que tus llaves de casa puedes llevar encima tus tarjetas de identidad para usar en distintas webs.
Segundo que tampoco eliminan el problema del phising al completo, ya que una persona maliciosa podria crear una web falsa que solicitara el token del usuario. Es el usuario es que debe distinguir la web original de la copia y no aceptar a entregarle la informacion si no es de su confianza. Si el usuario es un poco avispado puede darse cuenta que si ya ha entrado en esa web anteriormente no deberia pedirle el sistema confirmacion para entregar la informacion ya que se hace de forma automatica. Microsoft informa que para evitar esto se esta estudiando el certificar las imagenes de la web (logos) para que el usuario confirme que realmente son de la web que espera. Aqui mi pregunta es: ¿por que no se hace eso directamente con el sistema de password actual?
Me parece que es un buen intento pero no soluciona nada y complica demasiado el sistema de autentificación sobre todo para el desarrollador de la web. Para el usuario se le presenta un sistema muy intuitivo y bonito con tarjetas e imagenes pero aun tiene un par de flecos por mejorar.
Espero vuestros comentarios y correcciones.
Enlaces:
White paper de Microsoft. http://msdn2.microsoft.com/en-us/library/aa480189.aspx
Un pdf de cómo implementarlo (hands on labs) http://www-sor.inria.fr/~galland/papers/HOL07techdays.pdf
Noviembre 17, 2007
Al fin la quinta estrella de desarrollador .NET
Hola.
Existe un curso de programacion online hecho por Microsoft en el que van enseñando las tecnologias .NET de más interes: ASP .NET, Windows Presentation Fundation, Windows Communication Fundation, etc… Es totalmente gratuito y segun vas aprobando examenes te van concediendo estrellas hasta llegar a un total de cinco. Hace unos pocos dias por fin han puesto el contenido para llegar a la quinta estrella y además si haces despues otros cursos te asignan el titulo de Desarrollador Gold o Platinum. Yo por el momento estoy estudiando el primer curso de la cuarta estrella (CardSpace). Se lo recomiendo a todo aquel que quiera estar a la ultima en desarrollo para Windows. El link es www.dce2005.com Date prisa que si sacas la 5ª estrella antes de fin de febrero te envian un diploma a tu casa.