Como sabéis Infant, para almacenar los objetos aprendidos utilizará SQLite y siguiendo con los últimos posts de tutoriales hoy le toca el turno a la integración de SQLite en aplicaciones C\C++.Abrir y cerrar la base de datosEn C\C++ una base de datos SQLite es manejada por el objeto sqlite3, que no es otra cosa que un puntero a la base de datos. Para abrir una base de datos cuya ruta es ruta_bd tan solo tenemos que llamar a la función sqlite3_open tal y como en el ejemplo siguiente: sqlite3* MemoryDb; ... if (sqlite3_open(ruta_bd, MemoryDb) != SQLITE_OK) return -1; } else { return 0; }Por otro lado analogamente para cerrar una base de datos tan solo hay que llamar a la función sqlite3_close como por ejemplo en: if (sqlite3_close(this->MemoryDb) == SQLITE_OK) return 0; else return -1;Consultas de lecturaUna vez abierta la base de datos si queremos realizar una consulta deberemos trabajar con un puntero al objeto sqlite3_stmt y con las funciones sqlite3_prepare_v2 para preparar la consulta que se desea realizar y sqlite3_step para ejecutarla sobre la base de datos. Además y una vez terminadas las operaciones deberemos utilizar sqlite3_finalize que libera los recursos utilizados por sqlite3_stmt.Por otro lado si queremos obtener los datos que obtenemos de una consulta debermos utilizar las siguentes funciones según el tipo de dato leido:
Un ejemplo con con todo ello es el siguinete: sqlite3_stmt* stmt; if (sqlite3_prepare_v2(this->MemoryDb,"SELECT * FROM things;",-1,&stmt,NULL) == SQLITE_OK) { while (sqlite3_step(stmt) == SQLITE_ROW) // Mientras que se reciban filas... { int ID = sqlite3_column_int(stmt, 0); string Name = string(reinterpret_cast(sqlite3_column_text(stmt, 1))); // Convertir desde unsigned const char* a string double AvAng = sqlite3_column_double(stmt, 2); cout .... } sqlite3_finalize(stmt); return 0;} else { return -1; }Consultas de escritura y paso de parámetrosEn el caso de querer insertar o actualizar datos en una tabla SQLite desde nuestra aplicación es que ahora a la consulta en SQL (con el signo ? donde irá el parametro) deberemos pasarle parámetros con los datos que queremos insertar o modificar. Para ello la API de SQLite dispone de una serie de funciones según el tipo de dato del parámetro:
Un ejemplo básico, en el que se pasan dos parametros en una consulta de insercción en una base de datos abierta es el siguiente: sqlite3_stmt* stmt; int id = 999; string name = "Infant" if (sqlite3_prepare_v2(MemoryDb, "INSERT INTO tags VALUES (?, ?);", -1,&stmt,NULL) == SQLITE_OK) { sqlite3_bind_int(stmt, 1, id); // Se añaden los parámetros. sqlite3_bind_text(name.c_str(),-1,SQLITE_STATIC); sqlite3_step(stmt); // se ejecuta sqlite3_finalize(stmt); // y finaliza. return 0; } else { return -1; }Para más información no dudeis en conslutar la API de SQLite y los tutoriales de la página web.
El puente se acaba y , entre otras cosas, me ha permitido darle un pequeño pero importante impulso a IberOgre. Ligeras correcciones o ampliaciones en varios artículos y un par completamente nuevos. La wiki va sobre ruedas y no hemos tenido problemas de disponibilidad desde el cambio de servidor, ¡gracias de nuevo a la OSLUCA!
Es increible la cantidad de páginas web externas que hay con html “mal formado”, tags sin cerrar, carácteres sueltos en la sección de atributos de los tags, textos fuera del html… Los navegadores habituales son capaces de construir la página ignorando o corrigiendo estos pequeños fallos, pero a la hora de ponerse a parsearla, no es sencillo.
Python trae libreras para parsear html, sencillas y fáciles de usar, como por ejemplo HTMLParser. En un contexto específico puede ser muy útil, pero por ejemplo, no distingue los tags que pertenecen al documento y los que forman parte de una cadena de javascript. En el momento que detecta que el siguiente tag de cierre no es el que debería aparecer, muere inevitablemente.
Para tratar de mitigar todo esto he tratado de utilizar “Beautiful Soup“. Beautiful Soup es una librería para python que permite reconstruir documentos html mal formados en base a una serie de heurísticas. Aun así no he conseguido lograr los resultados deseados, sigue rompiendo con demasiada facilidad y es relativamente lento.
Finalmente, he encontrado una librería para python: “lxml” con licencia BSD, en parte escrita en C, que además de ser muy sencilla de utilizar, necesita pocos recursos y es bastante más eficiente que el resto de librerías. De momento me está dando muy buenos resultados al parsear. Además trae bastantes funciones muy útiles para “jugar” con el html, por ejemplo limpiar ciertos tags, eliminar el código javascript, autogenerar links …
Animado por el primer boceto de pytweetclin y los comentarios de David, me bajé Pencil (no el de animar, el otro) e hice un esquema de la interfaz de la ventana principal. Aunque pensándolo un poco, podría haber hecho directamente un prototipo en python, total, si hacer una ventana con pyGTK es un ratillo.
Boceto de la ventana principal
De hecho, ya se puede descargar desde la forja, en el paquete sandbox. Ahí iré subiendo pruebas y chorradillas que no tendrán que ver con el código final.
Para ejecutarlo son necesarios python, pygtk y python-gdl. Y ahí quería llegar.
GDL es una biblioteca de widgets que se pueden reordenar y despegar de una ventana a voluntad del usuario, lo que da lugar a interfaces muy versátiles y cómodas. La pega es que el wrapper para python usa una nomenclatura un tanto… peculiar, la documentación es muy escasa y los programas de ejemplo… no funcionan.
Sin embargo, tras corregir uno de los ejemplos y hacerme a la idea de cómo funciona al menos la clase DockItem, escribir el prototipo fue bastante fácil. Miento, la verdad es que fue un auténtico calvario conseguir que el programita se ejecutase sin escupir bonitos mensajes de error al salir. como éste:
(gui_prototype.py:17778): Gdl-CRITICAL **: gdl_dock_master_get_controller: assertion `master != NULL' failed
Segmentation fault
¿Violación de segmento? ¿En mi python? Eso sí que no, ¿eh?
Vídeo de la criatura en acción:
Comento un poco la funcionalidad que tiene: puedes arrastrar los widgets de un lado a otro y si lo haces fuera de la ventana principal, flotan, creándose su propia ventana. También puedes redimensionarlos, minimizarlos (pasan ser un botón en una barra a la izquierda de la ventana) y cerrarlos.
Al salir del programa, se guarda un fichero layout.xml con la disposición de los widgets, así que cuando vuelves a ejecutarlo, la ventana (tamaños de widgets aparte) se queda como estaba. Si quieres volver a dejar los widgets como estaban por defecto, basta con borrar layout.xml. No es una opción demasiado limpia pero es un prototipo, en la versión final no creo que haya problemas porque siempre podrás usar el menú Ver para volver a activar los widgets que has cerrado.
GDL se me resistió tanto en python que estuve a punto de cambiar el lenguaje de programación a Vala. Pero eso da para otra entrada…
Buenas,
despues de este parón (en parte producido por exámenes,trabajos,entregas etc…) continuo con el sensor.Parte principal y más importante del proyecto.
Hace dos post comenté todo lo que necesitaría para montar el sensor, sin embargo como todo proyecto de ingeniería, este ha sufrido modificaciones.
Las partes del proyecto definitivamente serán:
TOTAL: 137€+7€=144€
La verdad todo esto tendria un precio aproximado de 140 euros si os lo montais bien. Si estos sensores fueran creados en cadena y para una empresa, como todos sabemos los gastos serían sustancialmente menores.
En los siguientes post trataré a fondo cada sensor y las especificaciones en cada caso
Nos vemos!
Otra forma de pasar valores entre nuestra aplicación y un script Lua es mediante el uso de tablas. En Lua las tablas son una de las estructuras principales que define el lenguaje, de echo yo creo que todo son tablas y estas no son otra cosa que un array de pares clave - valor.Para trabajar con tablas desde C\C++ en primer lugar hay que definir la tabla (por su nombre) y a continuación irle añadiendo los valores con los que valla a trabajar el script sobre dicha tabla. Un ejemplo de estos dos pasos serían las siguientes líneas: lua_State *L = lua_open(); luaL_openlibs(L); // Se crea una tabla nueva. lua_newtable(L); // Se establece el elemento cuya clave es 1 el valor 45.56 lua_pushnumber( L, 1 ); lua_pushnumber( L, 45.56 ); lua_rawset( L, -3 ); // Escribe el valor // Se establece el elemento "2" cuyo valor el 99.99 lua_pushnumber( L, 2 ); lua_pushnumber( L, 99.99 ); lua_rawset( L, -3 ); // Se añade a las variable globales (que por cierto es la tabla G_) la nueva tabla llamada "infant" lua_setglobal( L, "infant" ); // ... aqui llamada al script y otras operaciones... // Se cierra Lua. lua_close(L);Como veis no es nada complicado y es por ello que va ha ser la forma de pasar argumentos entre Infant y Lua contenido en nuestro caso dicha tabla la definición de los diferentes niveles y vectores que componen cada nivel.Un ejemplo de script que podría hacer uso de estos valores pasados a Lua es el siguiente en el que se escriben todos los valores que contiene la tabla "infant" for i=0,table.getn(infant) do print(i,infnat[i]) end
Buenas!, despues de programar un par de dias en este puente, ya puedo decir que se libera Vidali 0.4.0 con las siguientes novedades: MEJORAS a 05/12/10: -Mejora del aspecto visual (Retorno al color verde por defecto). -Scrollbar en la zona del contenido, para no perder de vista el resto de elementos de la página. -Implementación [...]
Gestionar de forma eficiente el tiempo que le dedico al proyecto es complicado. Tras una dura mañana de trabajo, redactar un artículo para IberOgre o programar un módulo de Sion Tower se vuelve una carrera cuesta arriba. Aún así no me ha ido del todo mal hasta el momento, pues la wiki tiene varios artículos
Nowadays, I have been involved dealing with CAS.
What is CAS? Well, CAS is dubbed SSO Solution (Single Sign-On Solution), which means that you do only login once on an application. If you enter to another application you won’t have to enter again you username and password. This means that the user will be automatically logged on every application in which he has access.
There are some really good clients that have been fully developed. One of the more useful ones is phpCAS. I have dealt with it and once you understand how it works, you should be able to cope with it.
Why should I want to use it? This can be answered using an example. You know different open source applications and you would like to integrate all of them under one and only one web application. If you want to succeed on it, and do not want to redirect the user to a different login form each time he wants to use one of the applications that you provide as a whole package, then you would want to use CAS. Using CAS authentication, the user log in once and he has access to all the applications in which he has permissions.
CAS will be in charge of asking whether the user is allowed to use this application and logging in on or not. I am not going to explain all the details since they can be better understood on the website. The references are here: