Planet

Logo II

No hay nada mejor que tener un amigo artista  .Viendo que el nombre del proyecto cambio de red clovcer a red clover BI , me modifico el logo , y ahora es mejor que el anterior.
Así que ahí queda el ultimo y definitivo logo para el concurso.
Dentro de unos días subiré los archivos a la forja para que lo puedan bajar , el logo esta bajo licencia CC
      

Problema solucionado + problema

Hoy he solucionado el problema mencionado en el anterior artículo haciendo llamadas de “keep alive”, de lo cual hablé en dicho artículo.
El problema es que ha surgido (no sé si ya estaba o ha aparecido con el arreglo del otro problema) otro fallo, relacionado al leer el asunto de los mensajes de la bandeja de entrada, que parece que no los lee del todo.
Espero tener en breve una solución a este problema y cuando la tenga publicaré la versión 0.3.
      

Código subido a la forja

Buenas a todos, por fin he subido el código de Libgann a la forja. Libgann estaba siendo desarrollada en un repositorio local, así que le solicité a la administración que me subiera el repositorio a RedIris, al día siguiente ya estaba hecho, desde aquí les agradezco su celeridad.
En el repositorio SVN solo se han subido los ficheros fuentes, por tanto para construir la biblioteca es necesario ejecutar autoreconf.
Espero que os guste el proyecto.
      

Primer Screencast

Tucan descargando en paralelo desde links intercambiables de rapidshare y megaupload:
      

I have returned!!

De vuelta al trabajo. El pasado martes me opere de queratono en el ojo izquierdo, por lo que he estado una semana ausente del pc, pero hoy he vuelto al trabajo. Ahora mismo estoy, una vez terminada la traducción al ingles de la guia de usuario, estoy liado con la traducción de la guia del diseñador.
Estas son tareas un poco “aburridas”, pero creo que necesarias e imprescindibles a la hora de intentar crear una comunidad. Una vez terminada esta tarea, me voy a centrar en la pagina web www.gcalfaces.com, a la que intentare darle una apariencia un poco más conseguida, darle vida un poco al foro y la wiki.
Despues de esto, se volverá a acometer las múltiples mejoras sobre la aplicación, pero considero necesario asentar las bases de la aplicación, centrarse un poco en el ‘marketing’ para despues darle un buen empujon al sistema.
      

Creació del contingut

Avui he començat a crear el contingut de la pàgina (les pàgines estàtiques).El que he fet ha estat aprofitar el contingut actual de la pàgina, traspassar-lo a la nova pàgina i adaptar la resta (principalment el TinyMCE) perquè sigui funcional.El contingut que he creat és:

  • Ajuntament: Benvinguda, Regidors.
  • El municipi: Introducció, Història, Serveis i Entitats.
  • Turisme: Com arribar-hi.
  • Enllaços.
  • Blogs.

En principi, no hi he posat res més.Demà més.

Subida algunas mejoras

Hoy he subido algunas mejoras y he hecho algunos cambios en el menú, os dejo aquí una foto para que veais como va quedando, ya funcionan , más o menos salir, los créditos y el mezclador, lo demás poquito a poco irá apareciendo, ya hay algo hecho pero ya subiré los cambios cuando los termine y vea que estén bien.
He aquí una imagen de como va el menú:
Saludoss!!! Espero que os guste.
PD: Si veis que podría cambiar algo avisad, estoy abierto a cualquier tipo de sugerencia o críticas
      

ORM (Object-relational mapping) un poquito de sqlalchemy

En el esquema de la arquitectura de GECO aparece como una parte bastante importante en el demonio "gecod" SQLObject.
Un ORM simplifica el acceso a una base de datos por parte del programador convirtiendo toda sentencia sql a operaciones con objetos. Así por ejemplo añadir una fila a una tabla es tan fácil como crear un objeto.
Después de algún tiempo pensandolo he decidido que sería mejor opción utilizar SQLAlchemy, ¿por qué este cambio? Bueno, son varias razones las que me han llevado finalmente a explorar este nuevo ORM:

  1. Es más potente que SQLObject
  2. Ya conocía SQLObject, una oportunidad de conocer otro ORM

He estado mirando un poco la documentación de SQLAlchemy y voy a explicar de forma breve la manera más sencilla de utilizar este ORM en python.
Definición de una tabla/objeto

  1. from sqlalchemy import *
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import relation, backref, sessionmaker
  4.  
  5. Base = declarative_base()
  6. metadata = Base.metadata
  7.  
  8. class User(Base):
  9. __tablename__ = 'users'
  10.  
  11. id = Column(Integer, primary_key=True)
  12. name = Column(String(20))
  13. fullname = Column(String(50))
  14.  
  15. def __init__(self, name, fullname):
  16. self.name = name
  17. self.fullname = fullname
  18.  
  19. def __repr__(self):
  20. return "<User('%s','%s')>" % (self.name, self.fullname)
  21.  
  22. db = create_engine('sqlite:///database.sqlite', echo=False)
  23. metadata.create_all(db)

Así de fácil se declara un simple objeto. Esto se refleja en una base de datos con una tabla, de nombre 'users', con las columnas id, name y fullname.
Con metadata.create_all(db) se crea la tabla en la base de datos (La base de datos puede ser sqlite, mysql, postgresql,...).
Creación de objetos

  1. Session = sessionmaker(bind=db, autoflush=True)
  2. session = Session()
  3. u = User('dani', 'daniel garcia')
  4. session.add(u)
  5. session.commit()

De esta forma tan simple se pueden crear usuarios que se verán reflejados en la base de datos relacional como una nueva fila en la tabla de usuarios.
Es necesario crear un objeto de tipo session para interactuar con la base de datos.
Y para eliminar una entrada nada más simple que

  1. session.delete(u)
  2. session.commit()

Consultas

  1. session.query(User).filter(User.name == 'dani').all()

Se pueden hacer multitud de consultas con filter y además se pueden concatenar filters -> filter(User.name == 'dani').filter(User.fullname == 'daniel garcia')....
Relaciones

  1. class Address(Base):
  2. __tablename__ = 'addresses'
  3.  
  4. id = Column(Integer, primary_key=True)
  5. email_address = Column(String, nullable=False)
  6. user_id = Column(Integer, ForeignKey('users.id'))
  7.  
  8. user = relation(User, backref=backref('addresses',
  9. order_by=id, cascade='all, delete-orphan',
  10. passive_deletes=False))
  11.  
  12. def __init__(self, email_address):
  13. self.email_address = email_address
  14.  
  15. def __repr__(self):
  16. return "<Address('%s')>" % self.email_address

Si queremos declarar una tabla que esté relacionada con otra se utiliza ForeignKey. Además hay que definir una relación, y backref nos da la referencia en la tabla padre, es decir que la tabla padre tendrá este atributo. Con cascade y passive_deletes se consigue el borrado en cascada, cuando se borre un usuario se borraran todas los emails asociados a este.

  1. u = session.query(User).filter_by(name='dani').one()
  2. print u.addresses
  3. u.addresses.append(Address('dani@danigm.net'))
  4. print u.addresses
  5. session.commit()
  6. session.query(User, Address).filter(User.id == Address.user_id).filter(Address.email_address == 'dani@danigm.net').first()

Con este ejemplo se ve como se pueden hacer consultas sobre la unión de varias tablas.

Creación de mando para modo multijuador

Me ha llevado mucho tiempo decidir si crear un mando para el modo multijugador pero al final lo voy a realizar. Comento un poco como va a ser creado y cual será su funcionamiento. El mando será un estilo al de que podemos ver en juegos como buzz de ps2 (tan perfecto y con un estilo tan bonito no será aunque se intentará). El mando será un periférico que se conectará al puerto usb del pc. Este periférico estará implementado sobre arduino (quien no lo conozca comentaré abajo que es arduino).leer más

Un nodo CAN

Una red CAN se compone de una serie de dispositivos a los que denominaremos “nodos”, conectados a través de un bus serie. Su forma de transmitir como ya sabemos es en broadcast y por tanto, el nodo tiene que tener una cierta “inteligencia” para discernir entre mensajes que le son útiles y los que no. Así que un nodo CAN se compone de la siguiente estructura fundamental:

  • Host-Processor, elemento que se encarga de la “comprensión” de los mensajes recibidos y la elección de los mensajes a enviar.
  • CAN-Controller, se encarga de la recepción y envío de los mensajes. Básicamente su función al enviar, es almacenar la trama a transmitir e ir mandando los bits de la trama uno a uno. En la recepción va almacenando los datos de la trama bit a bit y una vez completa interrumpe al Host-Processor.
  • Transceiver, suele estar integrado junto al CAN-Controller, únicamente se encarga de ajustar los niveles lógicos entre el CAN-Controller y el Bus físico. También implementa algunos circuitos de protección para aislar en la medida de lo posible al CAN-Controller.

Aunque todavía pienso que quedan algunas cosas por saber antes de diseñar nuestro shield, he empezado a estudiar algunas alternativas, que en su mayoría son dispositivos programables, microcontroladores o procesadores, incluso más potentes que Arduino. Estoy preparando un pequeño resumen sobre las alternativas CAN en la actualidad, que publicaré próximamente.

Distribuir contenido