Planet

Primera revisión del diagrama de entidad/relación de PIE

Se ha creado con la herramienta el siguiente diagrama de Entidad/Relación, aporto además los comandos SQL para que sea compatible con cualquier servidor con mySQL 5.0.
Es una primera aproximación para guardar todos los datos necesarios.
Se ...

Interfaces gráficas con pygtk y glade (usando gtkbuilder)

Hace ya algún tiempo que hice la interfaz gráfica de GECO y esto lo hice usando glade para generar un fichero xml que posteriormente se carga desde python y se trabaja con los controles. Así se consigue separar la capa de presentación de la lógica del programa y es muy simple cambiar casi cualquier aspecto gráfico sin tener que tocar código.
Para hacer aplicaciones de escritorio con gtk lo más simple es utilizar glade-3, en casi todas las distribuciones hay varios paquetes, glade o glade-2 y glade-3. En las versiones anteriores el editor glade presentaba varias ventanas dispersas, al estilo gimp, pero glade-3 presenta una interfaz unificada y mucho más intuitiva.
Es muy sencillo crear una interfaz con este programa, sólo tienes que ir pinchando en los controles que quieras añadir y se van dibujando sobre la marcha, luego cambias sus propiedades y le das el aspecto visual que prefieras.
La mayoría de los manuales de pygtk y glade indican que hay que hacer lo siguiente para cargar una interfaz creada con glade desde código python:

  1. import gtk.glade
  2.  
  3. class Ventana:
  4. def __init__(self):
  5. self.gladefile = "window.glade"
  6. self.glade = gtk.glade.XML(self.gladefile)
  7.  
  8. #accediendo a los controles
  9. self.button = self.glade.get_widget('button1')
  10. self.button.connect('clicked', action)

¿Qué simple verdad? pues en principio no funciona, cuando lo intentas hacer no funciona, a no ser que en el glade le des a guardar como libglade. Esto es porque desde hace algún tiempo, y yo no me había enterado, se utiliza otro formato que es gtkbuilder. Para utilizar interfaces generadas con glade y guardadas como gtkbuilder (que es como debería ser) hay que hacerlo de la siguiente manera:

  1. import gtk
  2.  
  3. class Ventana:
  4. def __init__(self):
  5. self.gladefile = "window.glade"
  6. self.glade = gtk.Builder()
  7. self.glade.add_from_file(self.gladefile)
  8.  
  9. #accediendo a los controles
  10. self.button = self.glade.get_object('button1')
  11. self.button.connect('clicked', action)

Como podrás observar no ha cambiado mucho la cosa, solo cambiar get_widget por get_object y poco más.
Una vez cargado un objeto ya se puede trabajar con él, modificándolo, obteniendo información de él, etc. Para conocer todos los métodos y señales disponibles lo mejor es mirar la documentación.
Más facilidades, connect_signals, antiguo autoconnect
Desde glade, además de poner los controles en su sitio y definir los nombres se pueden definir funciones asociadas a los diferentes eventos que el objeto en cuestión pueda recibir. Así podemos evitarnos el tener que enlazar todos los botones con sus correspondientes funciones con el método connect, como se puede ver en los ejemplos anteriores y se pueden enlazar todas las funciones con una serie de funciones o métodos definidos.
Supongamos que tenemos una interfaz con un par de botones y hemos enlazado la señal clicked de cada botón con dos funciones llamadas boton1 y boton2 respectivamente.

Para que estos botones hagan algo, tendríamos un código así:

  1. import gtk
  2.  
  3. class Ventana:
  4. def __init__(self):
  5. self.builder = gtk.Builder()
  6. self.builder.add_from_file('test.glade')
  7. self.window = self.builder.get_object('window1')
  8. self.window.show_all()
  9.  
  10. # Magia :P
  11. self.builder.connect_signals(self)
  12.  
  13. def boton1(self, widget):
  14. print "boton1"
  15.  
  16. def boton2(self, widget):
  17. print "boton2"
  18.  
  19. if __name__ == '__main__':
  20. v = Ventana()
  21. gtk.main()

Si al método connect_signals se le pasa una instancia, buscará el nombre de las funciones en sus métodos, sin embargo también puede recibir un diccionario, y en tal caso, buscará las funciones a enlazar en ese diccionario.
También es posible pasarle argumentos a las funciones, pasándole otro argumento al método connect_signals:

  1. ...
  2. self.builder.connect_signals(self, 'mas info')
  3. ...
  4. def boton1(self, widget, data):
  5. ...
  6. def boton2(self, widget, data):
  7. ...

Y con esto y un bizcocho, hacer interfaces gráficas con pygtk y glade es mucho más simple de lo que nunca pudieras imáginar :P

¡¡Hola!!Por fín parece

¡¡Hola!!Por fín parece que está todo subido. Se ha hecho lo que se ha podido y esperamos que a alguien le haya gustado la idea. Tanto el código como los documentos están actualizados.Un saludo y suerte :)

Esquema de paginación dinámica

Además de mostrar los contenidos de la plataforma mediante paginación dinámica de la Figura, que proporcionan los estándares HTML actuales, las páginas del gestor de contenidos utilizan la tecnología AJAX por lo que el ...

Avanzando a pasos agigantados.

Y es que no paramos de trabajar… Si bien todavía nos queda mucho para tener algo estable y usable, esta misma semana podremos llegar a tener incluso algo funcional.
AODV que funciona a través del puerto UDP 654 genera y puede recibir tres tipos de paquetes:

  1. Route Requests (RREQ): Cuando queremos queremos comunicarnos con un ordenador C, desde nuestro ordenador A, entonces generamos un paquete de este tipo. Lo mandamos en Broadcast, es decir, mandamos un paquete esperando que lo lean la más gente posible para que nos generen una respuesta. Este paquete contiene información sobre quien lo ha generado (A) y hacia donde quiere ir (C), además de otra información de control necesaria para el protocolo: números de saltos o tiempo de vida del paquete. El paquete ira saltando por todos los nodos intermedios B1, B2, B3, etc. buscando su destino.
  2. Route Replies (RREP): Cuando un ordenador recibe un paquete RREQ cuyo destino es el mismo, o sea, el paquete anterior llega a C, entonces se genera RREP. El paquete se envia por el mismo camino que ha llegado pero, obviamente en sentido inverso. Todos los nodos intermedios aprobecharan además para actualizar su tabla de rutas porque ya saben donde estan el resto de ellos. En nuestro ejemplo, a medida que vaya pasando por los distintos nodos C, B3, B2, B1 y A añadiran en su tabla de rutas los nodos correspondientes.
  3. Route Errors (RERR): Son mensajes de error cuando alguien se ha caido de la red. Se genera este tipo de paquetes para comunicar que el nodo o nodos son inaccesibles.

Pues bien, nosotros hemos conseguido realizar peticiones de rutas e incluso respuestas de ellas. Aunque todavía está un poco verde creo que podremos mostraros un ejemplo de funcionamiento esta misma semana del funcionamiento de Meshias; desde como compilarlo, pasando por las reglas de iptables necesarias, para luego hacer un ping y conseguir generar una petición de ruta y su respuesta, consiguiendo conectar con el objetivo.

Ya esta activa la forja

Hola la forja esta activa podéis ver dos directorios principalmente
gnu_xff y docs
dentro de gnu_xff
esta  trunk y branches
trunk es la rama oficial del concurso todo lo que modifico y añado ahí esta medianamente para ser   presentado y leido.
En branches observareis una versión donde podréis jugar pero con mas fallos que una escopeta de feria, tened en cuenta que estoy experimentando y que tengo que hacer muchas pruebas, si verdaderamente soy capaz de programar este proyecto, por ello en esta rama ( con un estilo de programación pésimo y un código atrozmente feo)  será como una especie de borrador, por favor que nadie se la estudie, si tenéis dudas sobre algún aspecto esperaros a que salga en trunk. Pienso que  es interesante publicar este borrador así observareis que durante todo este tiempo no he estado sin hacer nada.
La verdad es que le estoy poniendo mucho empeño a mi proyecto, para que sea lo más competente posible y para que sea legible , cosa que por las prisas me lo estoy saltando, y sobre todo mi objetivo es que cumpla las 4 libertades:

  1. Un programa es libre si puede ser ejecutado y usado como uno quiera. Los privativos incluyen limitaciones de uso, ya sean dictadas en la licencia o incluidas en el código.
  2. El código del programa tiene que permitir su estudio y cambio. Frente al software privativo, que esconde como ha sido programado, el libre debe hacerlo público.
  3. la copia y distribución libre está permitida.
  4. El software libre debe permitir la distribución de las copias modificadas por cada programador, incluida su venta.

Sigo trabajando para todos ustedes.
Las obras de conocimiento deben ser libres, no hay excusas para que no sea así
Richard Stallman

Actualización de software

Si vais siguiendo el sistema estable y el de pruebas habréis comprobado que tiene un nuevo diseño gráfico. No es la única novedad, ya que hemos puesto en los dos sitios la última versión del código, de manera que podéis disfrutar de las nuevas características desarrolladas en la aplicación. Durante el día de hoy publicaremos [...]

Fin de la primera parte

Hola muchachos,
Me place comunicarles que el proyecto se encuentra en una fase de madurez suficiente como para llamarle beta. Se han añadido la mayoria de funcionalidades e incluso algunas nuevas que no estaban previstas en un principio.De todas maneras esto solo acaba de empezar, basicamente llegados a este punto nos encontramos con 2 problemas:

  • El diseño apesta un poco, uno no es diseñador ni le gusta pelearse con el CSS durante horas. Vamos a tener que hacer algo en este aspecto ya que este tipo de aplicaciones tienen que entrar por el ojo.
  • Encontrar un hosting va a ser complicado. Hace falta un hosting con Django que permita instalar ffmpeg y flvtools2. Ademas el convertir un video es una tarea costosa en términos de procesador, muchos hostings compartidos no lo permiten. Ya se nos ocurrirá algo.

En cuanto a las funcionalidades que tenemos implementadas, basicamente son las siguientes:

  • Obviamente, todo lo referente a gestión de vídeos. Se puede subir un vídeo con subtítulos, añadir comentarios, agregar a favoritos, etc…
  • Sistema de perfiles de usuario
  • Mensajería entre usuarios
  • Blog
  • Wiki
  • Sistema antispam basado en akismet

Ahora solo falta depurar los errorcillos con los que nos vamos encontrando que no son pocos. Queda mucho trabajo pero por lo menos se empieza a ver la luz al final del túnel.

Añadido punto de extensión

Siempre hemos hablado de darle soporte a la aplicación para que ésta sea ampliable facilmente con nuevas operaciones. !Hoy es el día en el se ha convertido en realidad!
Ahora podemos desarrollar plugins externos a nuestra aplicación a partir de un punto de extensión y añadir nuevas operaciones de forma fácil.
Esto tiene la gran ventaja, que la persona que programe estas nuevas operaciones no tiene porque tener conocimiento del resto de la aplicación, sino que sólo se deberá centrar en la implementación de la misma.
Ahora que ya lo tenemos hecho, vamos a centrar nuestros esfuerzos en hacer manuales y pruebas para que quien quiera pueda colaborar en el proyecto creando nuevas y mejores operaciones.

Diagrama entidad-relación

A continuación adjunto el driagrama entidad-relacción implementado.
ideldes entidad relacción
A la hora de implementar las Foreign Keys, hemos tenido que recurrir a la utilización de triggers. De esta forma ha quedado completamente solventado dicho “problema”.
Por otra parte, nos encontramos refactorizando el código para que la búsqueda e identificación de un dedo y mano, sea lo más rápida posible.
También estamos cambiando el tema de los markers, ya que habíamos realizado una prueba unitaria con la letra ‘l’, y ahora el cambio es para que trabaje de forma genérica.

Distribuir contenido