Agregador de canales de noticias
Inauguramos el blog del proyecto
¡Hola, bienvenido/a!
Este es el blog del proyecto How The World Works, una app Android creada por dos estudiantes de Ingeniería Electrónica y Automática Industrial de la Universidad Miguel Hernández de Elche. Aquí podrás encontrar novedades sobre HTWW, dificultades que hayamos encontrado en nuestro camino y en definitiva un espacio en el que esperamos que te encuentres a gusto.
Participamos en el Concurso Universitario de Software Libre (CUSL) por primera vez y esperamos disfrutar de la experiencia, además de adquirir nuevos conocimientos enfrentándonos a este reto.
En el siguiente post te contaremos cuáles son nuestros objetivos. Si no quieres perdértelo puedes suscribirte a nuestro blog o seguirnos en nuestros perfiles de Twitter:
Abel Aldeguer Pérez (@AbelAldeguer)
Lanzamiento del ejecutable
Se me ha hecho tarde, así que seré breve. Os pongo los enlaces del repositorio que acabo de crear del ejecutable y del proyecto.
Enlace del ejecutable -> https://github.com/LucrasArt/SavingGranny-Jar
Recordad que hay que tener instalado previamente Java Development Kit (JDK) para poder jugar.
-> http://www.oracle.com/technetwork/es/java/javase/downloads/index.html
Repositorio del código -> https://github.com/LucrasArt/SavingGranny
En breve más,
Lucra.
¡Nos mudamos!
Con la nueva Release de la Pre-Alpha de GitGaming, hemos decidido mudar también el blog a nuestro sitio, para tenerlo todo mejor controlado. Así pues, te invitamos a que comiences a probar GitGaming (Se irán añadiendo badges poco a poco en los próximos días) y guardes las nuevas direcciones!!
- GitGaming: http://gitgaming.com/
- Blog: http://gitgaming.com/weblog/
Nos vemos por GG!
El enganche básico: nexo e4s y arista e50 (I)
Ya teníamos la idea y sólo nos faltaba el sistema. ¿Cómo crear un enganche que sirviera también para la conducción eléctrica? Habíamos hecho un poco de estudio de mercado: ¡Horas jugando a K’nex, Construx y Lego en nuestra infancia tuvieron que servir para algo!
Estuvimos algunos días repasando de nuevo estos juguetes y como adultos e ingenieros de la curiosidad, cualquier elemento del diseño cuya función antes nos había pasado desapercibida, ahora nos fascinaba. Nervios, vaciados, perforaciones, agujeros… ¡Todo era una auténtica genialidad!
Así pues, comenzamos lo que no parece que vaya a acabar pronto: El desarrollo de nuestro primer prototipo de arista y enganche. Después de muchas consideraciones quisimos probar con “clics” y creamos una pestaña en la arista básica que cedería al ejercer una fuerza perpendicular. Además, por en medio queríamos introducir un cable que más tarde pudiera conducir la electricidad, soldado a dos conectores en los extremos de la pieza. Para facilitar la soldadura, debíamos dividir la pieza en dos partes. Tras hacer varios diseños en base a distintos tamaños, finalmente nos decantamos por un estándar de 10mm x 10 mm y una longitud inicial de 50 mm. Nuestra primera idea (Sin pestaña y tope) fue la siguiente:
Cuando vimos el diseño y pensamos que podría funcionar, procedimos a colocar una pestaña en una de las partes para ver cómo quedaría. En el siguiente post os contaremos las conclusiones que sacamos a partir del ensayo-error con las pestañas, y cómo el proyecto continua evolucionando.
¡Un saludo!
Creando coches para el juego
En esta entrada se va a hablar acerca del componente de dinámica de vehículos que incorpora Bullet Physics, el motor de físicas que se está usando en este proyecto. Se explicará como inicializar el vehículo y los elementos mas relevantes de éste módulo de Bullet. Por último, mostraremos un pequeño ejemplo que servirá para ejemplificar lo hablado en esta entrada.
Pero para empezar, vamos a introducir brevemente los principios físicos que permiten el movimiento de un coche.
Un poco de teoríaA grandes rasgos, el movimiento de un coche radica en un conjunto de fuerzas que se aplican sobre las ruedas y el chasis del vehículo. En la dirección del movimiento del coche se aplica una fuerza longitudinal, compuesta por la fuerza que aplican las ruedas, la fuerza de frenado, la resistencia que oponen los neumáticos y la resistencia del aire. Por otro lado, en giros existen fuerzas laterales causadas por la fricción lateral de las ruedas, además del momento angular del coche y el esfuerzo de torsión causado por las fuerzas laterales.
Nota: este apartado es un resume del siguiente artículo
Movimientos rectilíneosLa primera fuerza que entra en juego es la fuerza de tracción. La fuerza de tracción es ocasionada por la fricción del neumático contra la superficie del asfalto, que es provocada por el desplazamiento del neumático contra el asfalto debido al par motor aplicado por el motor.
El par motor es el momento de fuerza que ejerce el motor del coche sobre el eje de transmisión, expresado en N.m. El par motor que puede entregar depende de la velocidad a la cuál este gira, típicamente expresada en rpm. La relación momento torsor/rpm no es lineal, pero se representa normalmente como una curva llamada función del momento torsor (La curva exacta de cada motor viene determinada por los test que los fabricantes los someten estos motores). Aquí vemos un ejemplo para el motor del Corvette LS1(5.7 litros V8).
El eje de abscisas está expresado en revoluciones por minuto(rpm) y el de ordenadas en Caballos de potencia. La curva anterior sólo esta definida en el rango de rpm en el que trabaja el motor, que para el ejemplo es en el intervalo 1000 y 6000 rpm. La curva de par motor representa la máxima potencia que puede entregar el motor para unas rpm dadas.
El par motor se transmite a través de los engranajes hasta llegar a las ruedas, que se acaba conviertiendo en una fuerza a través del giro de estas sobre la carretera, dividido por el radio. La siguiente imagen ilustra el proceso:
A continuación podemos ver la formula que convierte el par motor proporcionado por el motor en fuerza de "conducción"; es decir, la fuerza longitudinal que ejercen las ruedas del eje de tracción sobre la carretera:
\begin{equation*} Fconducción = \frac{u * Pmotor * Xg * Xm * n}{Rw} \end{equation*}Donde:
- u es el vector unitario que refleja la orientación del coche
- Pmotor es el par motor del motor para unas rpm dadas. Expresado en en N.m
- xm es la relación de transmisión de las marchas
- xd es el coeficiente del diferencial
- n es la eficiencia de la transmisión
- Rw es el radio de la rueda.
Si esta fuera la única fuerza que influye en el movimiento, el coche aceleraría hasta alcanzar una velocidad infinita. Aquí es donde entran en juego las resistencia. A altas velocidades la mas importante es la resistencia del aire. Esta fuerza es muy importante porque es proporcional al cuadrado de la velocidad.
\begin{equation*} Fdrag = - Cdrag * v * |v| \end{equation*}Donde:
- Cdrag es una constante de resistencia del aire.
- v es el vector de velocidad.
- |v| el módulo del vector.
El módulo del vector velocidad es la velocidad a la que nos referimos comunmente, expresada en km/h cuando hablamos de vehículos.
La siguiente resistencia que encontramos es la resistencia al giro. Es causada por la fricción entre la goma del neumático y la superficie de contacto debido al desplazamiento de las ruedas.
\begin{equation*} Frr = -Crr Frr = - Crr * v \end{equation*}Donde:
- Crr es una constante de rozamiento.
- v el vector de velocidad.
A bajas velocidades la resistencia al giro es la mayor resistencia que encuentra el coche, mientras que a altas velocidades sería la resistencia del aire.
La fuerza logitudinal total es la suma de estas tres fuerzas:
\begin{equation*} Flongitudinal = Fconducción + Fdrag + Frr \end{equation*} Transferencia de pesoUn efecto importante cuando se acelera o frena es el efecto de la transferencia dinámica de peso. Cuando se frena el coche baja el morro hacia adelante. Durante la aceleración, el coche se inclina hacia atrás. Esto es debido a que el centro de gravedad el coche cambia. El efecto de esto es que el peso sobre las ruedas traseras aumenta durante la aceleración, mientras que las ruedas delanteras deben soportar menos peso. La distribución de peso afecta dramáticamente a la tracción máxima por rueda. Esto es debido a que el límite de fricción es proporcional a la carga en esa rueda:
\begin{equation*} Fmax = mu * Pesocoche \end{equation*}Donde:
- mu es coeficiente de rozamiento del neumático.
Para vehiculos estacionados el peso total del coche se distribuye sobre las ruedas delanteras y traseras de acuerdo a la distancia entre el eje delantero y trasero al centro de masa:
\begin{equation*} Peso ruedas traseras = \frac{c}{L} * M \end{equation*} \begin{equation*} Peso ruedas delanteras = \frac{b}{L} * M \end{equation*}Donde:
- b y c son la distancia al centro de gravedad de los ejes delanteros y traseros.
- L es el grosor de las ruedas.
Si el coche acelera o desacelera en un factor a, el peso frontal y trasero se calculan como sigue:
\begin{equation*} Peso ruedas traseras = \frac{c}{L} * W - \frac{h}{L} * M * a \end{equation*} \begin{equation*} Peso ruedas delanteras = \frac{c}{L} * W + \frac{h}{L} * M * a \end{equation*}Donde:
- h es la altura del centro de gravedad,
- M es la masa del coche y
- a la aceleración
Una cosa a tener en cuenta cuando estamos simulando giros es que la simulación de las propiedades física a baja velocidad es diferente de la simulación a alta velocidad. A velocidades bajas (aparcamiento, maniobras), las ruedas giran mas o menos en la dirección en la que éstas apuntan. Para simular estos giros no se necesita considerar las fuerzas y ni masas. En otras palabras, es un problema de cinética no de dinámica.
A velocidades más altas, puede ocurrir que las ruedas apunten en una dirección mientras que se muevan en otra. En otras palabras, las ruedas a veces pueden tener una velocidad que no esté alineada con la orientación de la rueda. Esto significa que hay una componente de velocidad que está en un ángulo recto a la rueda. Por supuesto, esto causa mucha fricción. Después de todo una rueda está diseñado para rodar en una dirección particular sin demasiado esfuerzo. En giros a alta velocidad, las ruedas están siendo empujadas hacia los lados y tenemos que tomar estas fuerzas en cuenta.
Vehículos en BulletEl componente de dinámica de vehículos de Bullet ofrece una implementación basada en rayqueries, de tal manera que se lanza un rayo por cada rueda del coche. Usando como referencia el punto de contacto del rayo contra el suelo, se calcula la longitud y la fuerza de la suspensión. La fuerza de la suspensión se aplica sobre el chasis de forma que no choque contra el suelo. De hecho, el chasis del vehículo flota sobre el suelo sustentándose sobre los rayos. La fuerza de fricción se calcula por cada rueda que esté en contacto con el suelo. Esto se aplica como una fuerza hacia los lados y adelante por cada rueda; es decir, por cada rayo.
Hay una serie de clases que son importantes a la hora de utilizar vehículos en Bullet:
- btRaycastVehicle: Es la clase que modela el comportamiento del coche.
- btVehicleRaycaster: clase que proporciona una abstracción a la clase btRaycastVehicle para la gestión de rayqueries.
- btRigidBody: clase que representa un cuerpo rigido.
- btVehicleTuning: clase que sirve como estructura de datos para el almacenamiento de algunos de los atributos mas importantes del vehículo. Los atributos son:
- btScalar m_suspensionStiffness: La rigidez (stiffness) de la suspensión. Se recomienda asignarle el valor de 10.0 para Todoterrenos, 50.0 para coches deportivos y 200.0 para coches de formula 1.
- btScalar m_suspensionCompression.
- btScalar m_suspensionDamping*: Coeficiente de amortiguación en el caso de que esté comprimida. Toma valores entre 0 y 1. El valor mínimo hace que la amortiguación rebote, mientras que el valor máximo sea lo mas rígida posible. Entre 0.1 y 0.3 la amortiguación se suele comportar correctamente.
- btScalar m_maxSuspensionTravelCm*: La distancia máxima que puede ser comprimida la suspensión, en centímetros.
- btScalar m_frictionSlip: El coeficiente de fricción entre el neumatico y el suelo. Para coches realistas debería tener el valor de 0.8, pero aumentando el valor mejora la conducción. Para coches de kart se aconseja asignarle un valores muy altos (10000.0).
- btScalar m_maxSuspensionForce: fuerza máxima que puede ejercer la suspensión sobre el chasis.
Para ampliar mas acerca de este tema, el autor de la implementación del módulo de vehículos escribió un documento en el que hablaba de los aspectos mas relevantes.
Veamos algo de códigoA continuación vamos a explicar cómo inicializar un vehículo en Bullet, así como las operaciones mas importantes. En este ejemplo me voy a apoyar del gestor de físicas que he escrito para mi proyecto, que me abstrae a la hora de crear cuerpos rígidos, formas de colisión, etcétera. El código completo relativo al coche se puede encontrar en la clase Car de mi proyecto.
Los pasos que hay que seguir para inicializar un coche en bullet son:
- Creamos un cuerpo rígido
En el fragmento anterior se crean dos formas de colisión: una caja y una forma compuesta(btCompoundShape), a la que asociamos la primera. Esto permite desplazar la caja una unidad en el eje Y, de forma que esté un poco alzada, indicandolo a través de la variable origin.
Tras esto se crea un cuerpo rígido. El primer atributo es una estructura de datos que almacena las rotaciones y la posición inicial. El segundo es un nodo de ogre, dado que mi gestor de físicas integra Bullet con Ogre. El tercer argumento es la forma compuesta que hemos creado antes y, por último, la masa del vehículo expresada en kilogramos.
El último paso consiste en indicarle a Bullet que el cuerpo rígido que acabamos de crear nunca debe ser desactivado; es decir, debe tenerlo en cuenta en todo momento en cada iteración de la simulación física. Bullet ignora algunos cuerpos rígidos que considera que no van a interaccionar en algún momento con otros cuerpos rigidos. Sin embargo, esto tiene como contrapunto que puede que el motor ignore acciones por parte del usuario, como una invocación al método de aceleración. Haciendo que nunca se desactive evitamos esto.
- Añadimos las ruedas. Para esto, usamos el método addWheel de la clase btRaycastVehicle(la clase que modela el vehículo):
Este método recibe:
- const btVector3 &connectionPointCS0: la posición de donde va a salir el rayo que representa la rueda. Esta posición debe estar dentro del chasis del coche o de lo contrario esa rueda no aplicará fuerza de tracción.
- const btVector3 &wheelDirectionCS0: El vector dirección de la rueda.
- const btVector3 &wheelAxleCS: El eje sobre el que estará el eje de la rueda.
- btScalar suspensionRestLength: La longitud máxima de la suspensión, en metros.
- btScalar wheelRadius: radio de la rueda,
- const btVehicleTuning &tuning: Ver explicación anterior.
- bool isFrontWheel: indica si la rueda está en el eje delantero o el trasero.
- Creamos el coche:
Como vemos, el último paso consiste en crear un objeto de tipo btRaycastVehicle y añadirlo al mundo a través del método addVehicle de la clase btDiscreteDynamicsWorld. Bullet ofrece una implementación por defecto de la intefaz btVehicleRaycaster, lo que nos ahorra tener que implementarla nosotros.
Explicado el proceso de inicialización, sólo nos queda mostrar las operaciones básicas de nuestro vehículo.
Para que el coche acelere se ejecuta la siguiente función, que aplica par motor a las ruedas del coche
- void btRaycastVehicle::applyEngineForce( btScalar force, int wheel): aplica par motor a la rueda con ese índice. Los valores estan expresados en N.m.
- void btRaycastVehicle::setBrake( btScalar brake, int wheelIndex): aplica frenado a la ruedas con ese índice.
- void btRaycastVehicle::setSteeringValue (btScalar steering, int wheel): gira la rueda con ese índice los grados que indica el primer argumento.
En este artículo he intentado explicar de la forma mas clara posible con qué problemas he tenido que lidiar a la hora de configurar e implementar la clase Car en mi proyecto. He dejado muchas cosas en el tintero, pero creo que lo mas importante ha quedado reflejado en este post.
Un saludo y nos vemos en el siguiente artículo.
Participando en el hackathon.
CommandFinder participará en el hackathon de proyectos que organiza la OSL. La fecha es del 13 al 16 de marzo. La participación es abierta a toda persona que quiera.
Dejo la web de la OSL: http://osl.ugr.es/2015/03/04/hackathon-de-proyectos-2015/
En desarrollo
¿Alguien pensó de pequeño, jugando a Lego o K’nex, en el trabajo que hay detrás de cada pieza y cada enganche? No siendo poco, nosotros hemos querido meter corriente de por medio y hacer algo más grande.
Así pues, nos encontramos creando nuestro juego ideal de construcciones robóticas libre y abierto al desarrollo de la comunidad. ¡No se trata de un trabajo fácil, pero nadie dijo que fuera a serlo!
Tiny World en desarrollo…
El circuito electrónico (2). El sensor ACS712.
En este post vamos a continuar la explicación del circuito electrónico empezada en el post anterior y tratar de explicar como funciona el sensor de corriente ACS712 que hemos usado en nuestro proyecto.
Este sensor de efecto Hall devuelve una tensión proporcional a la corriente que circula a través de sus terminales. En el datasheet nos muestran la conexión:
Siguiendo este esquema al final podremos leer la corriente que circula entre los terminales IP+ e IP- a través del pin 7, el cual estará a una tensión entre 0.5V y 4.5V. Para nuestro proyecto hemos cogido el sensor ACS712 capaz de medir entre +20A y -20A, el cual tiene una sensibilidad de 100mV/A. Esto quiere decir lo siguiente, para una corriente de -20A el pin7 estará a 0.5V e irá subiendo 100mV por cada amperio que suba la corriente circulante hasta alcanzar los 4.5A, que corresponderán una corriente de +20A. Esto se ve más claro en la siguiente gráfica: Entonces, conectando el pin7 de este sensor a una entra analógica de nuestro arduino podremos saber que corriente está consumiendo el electrodoméstico y , por estar conectado a una tensión de valor efectivo constante, la potencia.
Análisis de requisitos.
Después de muuuuucho tiempo me digno a actualizar el proyecto. Aquí dejo el análisis de requisitos.
1. Objetivos.OBJ-1. Búsqueda eficiente de comandos.
OBJ-2. Convertir la frase que introduce el usuario en palabras clave.
OBJ-3. Capacidad de que cada usuario pueda personalizar el programa, es decir, pueda ampliarlo con las librerías que se quiera.
2. Descripciones de los implicados.Nombre: Usuario
Descripción: Representa al usuario que va a hacer uso de CommandFinder.
Tipo: Usuario producto.
Responsabilidad: Hacer uso completo del sistema. Buscar comandos y ampliar librerías.
3. Requisitos Funcionales.RF-1. Gestión de librerías: El sistema debe realizar una gestión sobre las librerías que están añadidas en cada momento y si no hay automatización, de las librerías que están disponibles para incluir.
RF-1.1. Mostrar una lista de las librerías que están añadidas en las que busca los comandos actualmente.
RF-1.2. Poder cargar diferentes librerías (de forma automática si se puede). RF-1.2.1. Si no se pueden cargar de forma automática, mostrar una lista de librerías que están disponibles para añadir al sistema.
Nota: “De forma automática” viene a ser que se pueda cargar cualquier librería sin ningún tipo de tratamiento antes por alguien para sacar las palabras clave, pudiendo así añadir cualquier librería que se quiera.
RF-1.3. Eliminar librerías que ya han sido añadidas al sistema.
RF-2. Consulta y gestión de comandos:
RF-2.1. Buscar comando, el usuario introduce una cadena de strings especificando que es lo que necesita hacer y el sistema devuelve una lista con los comandos ordenados por probabilidad (mayor número de coincidencias en palabras clave)
RF-2.2. Nuevo comando, debe facilitarse el nombre del comando y las palabras clave de este.
RF-2.3. Mostrar manual en línea del comando escogido.
RF-2.4. Eliminar comando del sistema de búsqueda de CommandFinder.
RF-3. Sacar las palabras clave de la frase que introduzca el usuario.
Nota: Sobre automatizar. Cuando se facilita una librería que se tiene en el sistema, se buscará los manuales disponibles que se tienen en el sistema sobre esa librería y se busca en el manual de cada comando el apartado de NOMBRE, en la parte que sale después del nombre del comando palabras clave de éste. El nombre y el comando serían facilitados a la orden nuevo comando que lo introduciría en el sistema de búsqueda.
4. Requisitos no funcionales.RN-1. Rapidez/eficiencia en las búsqueda.
5. Requisitos de Información.Se necesita almacenar los siguientes datos:
RI-1. Librerías disponibles.
RI-2. Comandos con manual disponible.
_________________________________________________________________________________________________________
Enfilar la Tesis de Máster
Workshops: new educational resources for ViSH!
We are happy to announce that the first version of the Workshops (https://github.com/ging/vish/issues/89) has been finished and deployed at http://vishub.org.
A live example of a Workshop can be seen here: http://vishub.org/workshops/1 .
This new educational resource allows to design full learning experiences using other ViSH resources such as interactive presentations, videos and so on.
New enhancements will come with future ViSH releases.
Saving Granny ya parece un juego de verdad
Hoy por fin puedo decir que mi proyecto ya se puede calificar de videojuego. Ya no es solamente un personaje que se mueve a través de los mapas. Con el control de vidas añadido de la semana pasada, he añadido esta semana más cosas, como el hecho de recoger ítems, en concreto, manzanas. Cuando Caperucita recoje una manzana en el mapa, ésta desaparece, y en el marcador superior se modifican dos cosas: el contador de manzanas en sí y además en la puntuación, por cada manzana capturada se consiguen 10 puntos.
Exteriormente no se nota pero para que esto sea posible, en esta semana, he añadido también los estados de juego: Start – Running – Game Over. ¿Por qué? Es interesante que cuando Caperucita pierda las 3 vidas con las que dispone, ésta vuelva a la casilla de salida, pero que las manzanas obtenidas anteriormente estén de nuevo disponibles.
Otra novedad muy interesante para que Saving Granny sea un juego con todas las letras es eliminar a los enemigos, opción que ya está disponible. Si está Caperucita saltando y el enemigo está justo abajo se eliminará dicho enemigo aumentando el marcador en 30 puntos. Análogamente, si Caperucita pierde todas las vidas, al reiniciar la fase las ovejas volverán a aparecer.
El proyecto no está finalizado ni mucho menos, quedan muchas cosas por añadir y mejorar, pero lo básico está.
Para la semana que viene sin falta estará disponible un enlace para descargar el juego y poder probarlo.
Hasta la semana próxima!
Lucra.
Lanzamiento de la versión 1.0
¡Buenísimas tardes!
Hoy les traemos una noticia. Noticia no, NOTICIÓN. Tampoco es para tanto, pero creemos que es importante avisarles de que hemos lanzado la versión 1.0 de la aplicación y que con ella, les ofrecemos de manera gratuita y exclusiva el primer ejecutable de la misma.
Exacto, les estamos ofreciendo sólo a ustedes que están viendo esto el programa que les hará ser los más guays de la clase por vuestra primera y única vez en la vida. Además si encuentran fallos y nos encuentran por la calle pueden reírse de nosotros y mirarnos por encima del hombro. O eso o abrir un issue, que es más elegante y constructivo (y obtendrás +1 de karma en la vida).
Sin más dilación aquí les ofrecemos los enlaces:
- Descarga del archivo .jar ejecutable: DESCARGA
- Descripción del lanzamiento y enlace a la descarga del código fuente en GitHub: https://github.com/MazeSolver/MazeSolver/releases/tag/v1.0
Esperamos que les guste y lo disfruten, estamos a la espera de escuchar vuestras opiniones y sugerencias. Si tienen cualquier problema para ejecutar el programa significa que no tienen correctamente instalado Java. Esto es sencillo, tan sólo hay que acceder a esta página y seguir las instrucciones.
Un saludo,
El equipo de MazeSolver.
Calendario
¡Hola a todos!
La primera parte del proyecto ya está realizada. Esta parte trataba en la realización de dos funciones:
- A la izquierda debe de estar un horario de lunes a domingo, al cual se le pudieran arrastrar las distintas tareas que hay que realizar a lo largo de la semana.
- En la derecha una ventana con las distintas tareas las cuales podemos ir desplazando al horario anteriormente mencionado.
La imagen revela una versión simplemente funcional no teniendo en cuenta todavía la interfaz final de la aplicación.
Mongo DB & Celery
Nueva versión: 0.10.0
Buenas :) , aquí llega una nueva versión con novedades interesantes, tanto en la gestión como en la propia biblioteca.
Mejoras en la gestión del proyectoEn primer lugar, estoy haciendo algunos esfuerzos para facilitar que desarrolladores externos puedan y/o quieran contribuir al desarrollo de ColorSharp.
El primer cambio interesante, aunque ha supuesto ningún esfuerzo, es integrar el repositorio de ColorSharp en Github con el servicio Gitter; desde ahora ColorSharp tiene una sala dedicada de chat, tipo IRC. Se puede acceder a este chat a tanto a través de su página web como a través de diversas aplicaciones móviles.
Otro cambio menor es que finalmente tenemos una guía para contribuir al proyecto. Es muy probable que esta guía tenga que cambiar mucho dado que hasta ahora ColorSharp ha sido un proyecto fundamentalmente unipersonal.
Como extra, y por el momento sólo de forma experimental, estoy empezando a trastear con Gitcolony para gestionar la revisión de commits y “pull requests”. Parece una herramienta muy interesante (aunque privativa :(, todo sea dicho) para gestionar las revisiones de código de forma más o menos automatizada y bien organizada.
Cambios interesantes- Añadidos los illuminants B, C, D50 y D55.
- Añadida una clase para generar espectros lumínicos de cuerpos negros para una temperatura dada.
- Añadidas las funciones de matching de 1964 (10º) de la CIE.
- Reemplazado las funciones de matching ed 1931 (2º) de la CIE con datos más precisos.
- Mejoras menores en la conversión espectro->color:
- Separadas las estrategias de conversión espectro->color de las estrategias para conversiones color->color.
- Ahora es posible escoger entre las funciones de matching de 2º y 10º.
- Mejorada la documentación XML.
- Eliminada la dependencia de la biblioteca MathNet.Numerics.
Durante estos días en que he estado realizando los cambios de esta versión he descubierto un proyecto muy interesante: Public Lab, en especial uno de sus subproyectos, Spectral Workbench. Esto me ha hecho pensar que podría ser interesante integrar en la biblioteca una forma de interactuar con la API de Spectral Workbench para importar o exportar espectros.
Bien, de momento no hay muchas más novedades que comentar. Os dejo con esto, y como siempre, os invito a colaborar :) , y más ahora que os lo estoy poniendo más fácil.
Qué es libreBORME
LibreBORME es mi apuesta como Proyecto de Fin de Carrera y estará tutorizado por Carlos Canal de la Universidad de Málaga y David Cabo de la Fundación Ciudadana Civio.
El progreso se puede ir viendo en el repositorio de GitHub: libreborme, aunque ahora mismo el último commit es de octubre, de cuando ni siquiera me habían aprobado el anteproyecto. En los próximos días subiré los últimos cambios para que reflejen el estado actual.
He presentado libreBORME a dos concursos de software libre: al Concurso Universitario de Software Libre y al Certamen de Proyectos Libres que celebra este año la Oficina de Software Libre de la Universidad de Granada (UGR). ¡Espero tener una versión funcional y bonita para las fechas de entrega!
Y ahora sí, para saber de qué va, os dejo a continuación con el texto del anteproyecto que me fue aprobado el pasado mes de noviembre.
Plataforma web para la consulta y el análisis del Boletín Oficial del Registro Mercantil MotivaciónDurante los últimos años la transparencia es un tema en auge en el ámbito político-institucional. Sin embargo, el diablo está en los detalles y muchas veces la palabra "transparencia" se usa de forma viciada por ser un tema que está de moda y suena bien, independientemente de si la institución en cuestión es transparente o no. O quizás simplemente la definición de este término que manejan unas y otras partes es distinta.
Otro problema muy común es confundir "datos abiertos" con "transparencia", cuando la realidad es que lo primero puede usarse como una herramienta para conseguir lo segundo, pero no necesariamente: publicar los horarios de autobuses como datos abiertos no mejora la transparencia (aunque tenga otros beneficios).1
En el momento en el que se redacta este documento hace menos de un año que España ha aprobado su Ley de Transparencia2. Hasta entonces era el único país europeo con más de un millón de habitantes sin una.
La aprobación fue sin duda una noticia importante y esperada. Sin embargo, ya durante el periodo de debate empezaron a oírse voces desacordes con esta ley.
La Open Knowledge Foundation3, una de las organizaciones internacionales sin ánimo de lucro más importantes y referentes por su trayectoria en la lucha por la transparencia, proporciona en su «Manual de Datos Abiertos» una definición, con una serie de condiciones que un conjunto de datos (o en inglés, dataset) debe cumplir para poder ser considerado "Datos Abiertos".45 La definición es extensa pero se puede resumir en:
- Disponibilidad y acceso. La información debe estar disponible como un todo y a un costo razonable de reproducción, preferiblemente descargándola de Internet. Además, debe estar disponible en una forma conveniente y modificable.
- Reutilización y redistribución. Los datos deben ser proporcionados bajo términos que permitan reutilizarlos y redistribuirlos, e incluso integrarlos con otros datos.
- Participación universal. Todos deben poder utilizar, reutilizar y redistribuir la información. No debe haber discriminación alguna en términos de esfuerzo, personas o grupos. No están permitidas las restricciones "no comerciales" que prevendrían el uso comercial de los datos ni las restricciones de uso para ciertos propósitos (por ejemplo sólo para educación).
En la actualidad no hay una apuesta seria por ello y son pocas las instituciones españolas que cumplen esta definición cuando hablan de datos abiertos.
Sin embargo, en los últimos años ha quedado demostrado que una de las fortalezas más claras de nuestro país es que a pesar del descontento generalizado en la política institucional, en la sociedad civil surgen grupos que se organizan y especializan para trabajar de forma proactiva y cambiar las cosas.
En este caso, la sociedad civil lleva tiempo organizándose para exigir transparencia de verdad, poniendo como ejemplo la que existe en países de nuestro entorno que se consideran referentes en cuestión de datos abiertos como Reino Unido, y está consiguiendo acelerar el proceso de la transparencia en las instituciones haciendo el trabajo que ellas no hacen, creando conjuntos de datos abiertos de verdad.
Algunos ejemplos de estas organizaciones son OpenKratio6, Fundación Ciudadana Civio7, y Qué Hacen Los Diputados8 (la primera, con sede en Sevilla y las dos últimas con sede en Madrid). A nivel internacional nos encontramos, entre otras, con Sunlight Foundation9, y Open Knowledge Foundation (OKFN), ya citada anteriormente.
Su programa de actividades es público y en él encontramos reuniones con técnicos de gobiernos regionales para ofrecer asesoramiento y colaboración de forma altruista; organización de conferencias sobre transparencia y datos abiertos en universidades con ponentes internacionales que explican la perspectiva desde otros países; colaboración con administraciones públicas para liberar y visualizar datos; organización y participación en concursos y hackatones para desarrollar nuevas APIs, aplicaciones de móvil, etc.
En este contexto se plantea el siguiente proyecto con el objetivo de abordar los datos públicos del Registro Mercantil de España para abrirlos de una forma más cercana a la definición de la OKFN y ofrecerlos a cualquiera (sea persona o robot de Internet) que quiera hacer uso de ellos.
El Boletin Oficial del Registro Mercantil (BORME)El Registro Mercantil Central (RMC) es el organismo encargado de la publicación del BORME, que por sus siglas responde al "Boletín Oficial del Registro Mercantil".
El BORME es «el BOE de las empresas» y en él se publican las nuevas inscripciones, las bajas, y otra serie de actos que las sociedades están obligadas a comunicar.
Desde 2009 se publica en formato electrónico. Es un gran paso, pero el BORME contiene únicamente los cambios, es decir, que si leemos el BORME podemos conocer que una sociedad se ha disuelto hoy, pero nos será muy difícil saber cuándo se constituyó, ya que la web no incorpora un buscador que nos permita encontrarlo. Además, si la fecha de constitución fue anterior a 2009, sería aún más difícil, ya que no existe el documento en formato electrónico y tendríamos que solicitar al RMC una fotocopia del documento en papel, indicándoles previamente el número de BORME, que también necesitaremos conocer. Sin embargo esos datos están ya informatizados en algún sitio. Para acceder al historial de una empresa podemos acudir al servicio ofrecido del Colegio de Registradores de la Propiedad y Mercantiles de España (o simplemente Colegio de Registradores) y pagar en concepto de honorarios por él, en función de las consultas que queramos realizar.
Este procedimiento no cumple la definición de datos abiertos de la OKFN y además es contradictorio y contraproducente por los siguientes motivos:
- No tiene sentido que sea un servicio cerrado, ya que la función primordial del Registro Mercantil es ser un instrumento de publicidad (hacer público) de las empresas.10
- El simple hecho de cobrar por él dificulta y contradice su propia función de publicidad.
- Es una forma de funcionamiento obsoleto que tendría que haber sido renovada hace más de una década. Entonces se precisaba pagar a una persona encargada de buscar en miles de folios de cientos de tomos la información solicitada, pero hoy vivimos en la Sociedad de la Información, donde ya existe Internet, donde esa información la tenemos en algún sitio ya informatizada y el coste de la consulta de estos datos tiene un coste real cercano a 0€.
Sin embargo, sí que sigue teniendo sentido que cobren por los servicios de expedición de certificados (otro de los servicios ofrecidos por el Colegio de Registradores) ya que en él precisan de un Registrador Mercantil que certifique los datos.
Desafortunadamente por otra parte,el buscador del BORME solo está activo para la sección II, que es en la que se publican "Anuncios y avisos legales", cuando la realmente interesante es la sección I, donde se publican los actos de inscripción y otros actos relativos a las empresas. Por último, a esto le sumamos que mientras que el BOE ya se publica en los formatos PDF y XML, el BORME se continua publicando únicamente en PDF (la sección II sí que se publica en XML) y que antes de comenzar este proyecto el autor contactó con el webmaster del BORME, quien manifestó la voluntad de que esto no iba a cambiar al menos a corto plazo «por el convenio y legislación actual del Registro Mercantil».
Objetivos y alcance del proyectoEl objetivo del presente PFC es crear una plataforma que de forma automatizada descargue los BORME desde el 2 de enero de 2009, que fue el día que se comenzaron a publicar en formato electrónico, para procesarlos y generar una base de datos propia con los datos que estos contienen.
El procesado automático extraerá la información útil de los PDF, identificando entidades y acciones. Una vez se haya generado esta base de datos, el potencial estará en la posibilidad de hacer consultas por campos o incluso semánticas.
Por ejemplo:
¿Qué otras sociedades administran los administradores de esta otra empresa? ¿Cuántas empresas se crearon/destruyeron en 2011?
Para facilitar las consultas se desarrollará también una plataforma web alojada en la nube usando el framework Django con el lenguaje de programación Python.
La plataforma será compatible con OpenStack y Cloud Foundry, soluciones de computación de la nube IaaS y PaaS respectivamente. Se han escogido ambas soluciones de entre todas las que coexisten actualmente por ser software libre y por las organizaciones que las respaldan como "estándar de la nube".
Otro objetivo es que el servicio siga online tras la finalización del proyecto. Para ello el autor contactó con la Fundación Ciudadana Civio, y ésta mostró su conformidad en mantener y explotar el servicio de forma conjunta. El sistema será autónomo y quedará programado para buscar diariamente los nuevos boletines publicados e incorporar esta información a la base de datos. De este modo las consultas se podrán realizar con la última información disponible hasta el momento.
El código de la plataforma se publicará con una licencia de software libre, ya que la idea es que el proyecto se reutilice y se cree comunidad con él.
Por último se facilitarán a OpenCorporateslos datos recopilados. OpenCorporates es una iniciativa que pretende liberar datos de sociedades a nivel mundial y "asignar una URL a cada empresa del mundo", ya que los datos sobre compañías y corporaciones españolas con los que cuenta actualmente son muy pobres en comparación con los de otros países.111213
Referencias-
The New Ambiguity of "Open Government", 2012: http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2012489 ↩
-
http://www.20minutos.es/noticia/1991399/0/ley-de-transparencia/actitudes-politicas/congreso/ ↩
-
Definición completa de "Abierto": http://opendefinition.org/od/ ↩
-
http://www.mjusticia.gob.es/cs/Satellite/es/1215197983369/Estructura_P/1215198328530/Detalle.html ↩
-
Zara España SA: https://opencorporates.com/companies/es/15022510 ↩
-
Google Inc.: https://opencorporates.com/companies/us_ca/C2474131 ↩
What is libreBORME
LibreBORME is my dissertation and it will be mentored by Carlos Canal from Universidad de Málaga and David Cabo from Fundación Ciudadana Civio.
Progress can be seen in the GitHub repository: libreborme, although right now the last commit is from October, when my draft hadn't even been approved. In the coming days I will upload the latest changes to reflect the current state.
I have submitted libreBORME to two different competitions about Free Software, that is, Concurso Universitario de Software Libre and Certamen de Proyectos Libres which is organized this year by the Free Software Office of Universidad de Granada (UGR). I expect to have a functional and pretty version for the deadlines!
The following is the text of the draft that was approved last November.
BORME queries and analysis web platform MotivationIn recent years, transparency is a booming subject in the political-institutional field. However, the devil is in the detail and most of the times the word "transparency" is used in a corrupted way because it's a fashion subject and sounds well, independently if the institution is considered to be transparent or not. Or maybe it's just because the definition of this term is different for both parts.
Another common problem is misunderstanding "open data" with "transparency", when reality is that the first one can be used as a tool to get the second, but not necessarily: publishing bus timetables as open data doesn't improve transparency (but it has other benefits).1 In the moment where this document was written, it's less than one year that Spain passed its own Transparency Act2. So far it was the only European country with more than a million inhabitants without one.
The passing was without any doubt an important and long waited fact. However, during the debate period they started to hear conflicting voices about this Act.
The Open Knowledge Foundation3, one of the most important international non for profit organizations and model for its background in the fight for transparency, provides in their «Open Data Handbook» a definition, with a number of conditions that a dataset must accomplish in order to be considered "Open Data".45 The definition is large but it can be summed up as three facts:
- Availability and Access. the data must be available as a whole and at no more than a reasonable reproduction cost, preferably by downloading over the internet. The data must also be available in a convenient and modifiable form.
- Reuse and Redistribution. the data must be provided under terms that permit reuse and redistribution including the intermixing with other datasets.
- Universal Participation. everyone must be able to use, reuse and redistribute - there should be no discrimination against fields of endeavour or against persons or groups. For example, 'non-commercial' restrictions that would prevent 'commercial' use, or restrictions of use for certain purposes (e.g. only in education), are not allowed.
Nowadays there isn't a serious bet about it and only a few institutions apply to the definition when they speak about open data.
Nonetheless in the last years, we have seen that one of the clear strengths of our country, Spain, is that in spite of the general dissatisfaction of institutional politics, civil society organizes and they start to form groups to specialize and work in a proactive way to change things.
In this case, civil society has been organizing for a while to demand true transparency, giving as example transparency exiting in our surrounding countries that are considered model in regards of open data as is the United Kingdom, and they are achieving to speed up the process of transparency in public institutions by doing the work that they should be in the charge of but unfortunately don't do, by making true open datasets.
Some examples of these organizations are OpenKratio6, Fundación Ciudadana Civio7 or Qué Hacen Los Diputados8 (the first one, based in Seville and the rest based in Madrid). At international level we can find, among others, Sunlight Foundation9 or Open Knowledge Foundation (OKFN), previously quoted.
Their activities program is public and we can find in it: meeting with regional government staff in order to offer advising and collaborate in an altruistic way; organizing conferences about transparency and Open Data in public universities with international speakers that explain the point of view from other countries; collaboration with public administrations to open and visualize datasets; organizing and participating in competitions and hackathons for developing new APIs, mobile apps, etc.
In this context the following project is planned with the goal of address public data of the Mercantile Register in order to open them in a way closer to the OKFN definition and offer them to everyone (be it a human or a Internet robot) willing to make use of them.
Boletín Oficial del Registro Mercantil (BORME)Registro Mercantil Central (RMC) is the organization in charge of publishing BORME, which in Spanish stands for "Mercantile Register Official Bulletin".
BORME publishes newly created societies, societies that have broken up, and some other data the companies must communicate.
Since 2009 it is also published in electronic format. This is a big step, but BORME only contain changes, that is, if we read BORME we can know that a a society has dissolved today, but it will be really hard to know when it was established, since the website doesn't provide a search engine that allows us to find it. Besides, if the constitution date is previous to 2009, it will be even more difficult, since there doesn't exist a document in electronic format and we should request to RMC a paper photocopy of the original document, indicating previously the page number in the BORME, which is also something we must know beforehand. However these datasets are already computerized somewhere. In order to access the history of a company we can use a service provided by _Colegio de Registradores, _which are the Official Registrars and to pay them in concept of professional fees, depending on how many requests we can to realize.
This procedure doesn't meet the definition of open data by OKFN and is contradictory and counter-productive because of the following reasons:
- It doesn't make sense that it's a closed service, since the main goal of Registro Mercantil is to be a public advertisement instrument of the companies.10
- The fact of collecting money makes it harder and contradicts its own function of advertisement.
- It is an obsolete model of work that should have been renewed more than a decade ago. In those days you had to pay a person in charge of finding the requested information in thousand of sheets of hundreds of volumes, but nowadays we live in the Information Society, where it already exists the Internet, where this information is already computerized somewhere and the real cost of that request is near 0€.
Nonetheless, it keeps making sense that they collect money for the services of certificates expedition (another service offered by Colegio de Registradores) since they require a mercantile registrar to certify the data.
Unfortunately on the other hand,the search engine of BORME is only active for section II, which is where they publish Legal Notices, when the really interesting part is section I, where they publish registration data and other data concerning to companies. Finally BORME publishing format is only PDF, where other official documents are published also in XML format and before the beginning of this project the Author contacted the webmaster of BORME, who claimed that this behavior was not going to change in a short time because of «the current agreement and legislation of the Mercantile Register».
Goal and scope of this projectThe goal of this project is developing a platform that automatedly downloads BORME files from January 2nd 2009, the day when they started to publish BORME in electronic format, in order to process them and build its own database with the contained data.
The automatic processing will extract every useful information of the PDF files, by identifying entities and actions. Once the database is generated, the potential will be in the ability of performing queries by fields or even semantic queries.
For example:
What other societies do administer the administrators of this company? How many companies closed in 2011?
In order to ease the queries it will be developed additionally a web platform hosted in the cloud using the Django framework with the programming language Python.
The platform will be compatible with OpenStack and Cloud Foundry, both solutions for cloud computing, IaaS and PaaS respectively. Both solutions were chosen of among all existing solutions because these are free software and because of the trust on the organizations supporting them as "cloud standards".
The goal is that the service will be kept online after the project is finished. The author contacted to Fundación Ciudadana Civio and they showed their interest in maintaining the service and to make use of it together with the author. The platform will be autonomous, in the sense that it will be developed and will remain ready to look for new BORMES daily to incorporate new information to the database. This way it will be possible to query the website with the latest information available to the moment.
The source code of the platform will be released with a free software license, since the idea of this project is that as many entities as possible make use of it and we create a community around it.
Eventually, collected data will be given to OpenCorporates. OpenCorporates is an initiative that aims to free companies data worldwide and to "assign an URL to every company in the world", since data from Spanish companies and corporations available are poor compared to those available for other countries.111213
References-
The New Ambiguity of "Open Government", 2012: http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2012489 ↩
-
http://www.20minutos.es/noticia/1991399/0/ley-de-transparencia/actitudes-politicas/congreso/ ↩
-
Definición completa de "Abierto": http://opendefinition.org/od/ ↩
-
http://www.mjusticia.gob.es/cs/Satellite/es/1215197983369/Estructura_P/1215198328530/Detalle.html ↩
-
Zara España SA: https://opencorporates.com/companies/es/15022510 ↩
-
Google Inc.: https://opencorporates.com/companies/us_ca/C2474131 ↩