Archivo de la etiqueta: AAP

Haciendo un planet en python

La práctica 5 de AAP consistía en crear un programa que recogiese las noticias de diferentes fuentes y las mostrase en un sólo documento HTML, lo que se viene a denominar un planet en la jerga bloguera.

En mi caso lo he programado en Python haciendo uso de la librería feedparser y genero una página HTML así como un feed usando la librería PyRSS2Gen.

He usado la codificación de caracteres utf-8 en todo momento, pero tengo un problema al generar el archivo html ya que no se guarda como utf-8 (si lo abrimos con un editor como geany podemos comprobar que está “sin codificación”), y luego al mostrarlo en el navegador no se ve bien. El caso es que en mi máquina sí se muestra correctamente, pero en el servidor donde lo he alojado no, como podéis ver en http://swecai.ugr.es/~planet_etsiit. Si en el navegador seleccionáis la codificación unicode, se ve bien, e incluso en el header está el meta indicando que es utf-8. ¿Alguna idea de cómo solucionar esto? Editado: blaxter ha dado con la tecla en este comentario. ¡Gracias!

Podéis descargar la aplicación libremente: planet.tgz. En el fichero index.html viene una descripción más detallada del trabajo realizado y en la carpeta scripts se encuentra el fichero actualizar.py que se encarga de generar los ficheros planet.html y feed.xml a partir de los feeds situados en sites.txt cada cierto tiempo, que podemos indicar usando una tarea cron.

AAP Práctica 1 – Recursos para la asignatura

Aquí os dejo con una serie de recursos que nos pueden ser útiles para la asignatura de AAP, junto con una valoración personal sobre 5 puntos.

  • Firebug: plugin de Firefox imprescindible para el desarrollo web e incluye un intérprete de Javascript así como un profiler y un debugger. 5/5 puntos
  • Visual jQuery: es una herramienta para la navegación por la documentación de jQuery, que nos permite encontrar fácilmente ayuda sobre un procedimiento que estemos buscando de este popular framework de Javascript. 4/5 puntos (debería estar actualizado a la última versión estable 1.3.1)
  • gotAPI: buscador vertical para distintos lenguajes de programación. Imprescindible para encontrar rapidamente ayuda sobre funciones de un determinado lenguaje (HTML, Javascript, PHP, Perl, Ruby, C++, etc.) 4/5 puntos
  • Javascript in Ten Minutes: un repaso rápido a la funcionalidad y sintaxis de Javascript. 3/5 puntos (viene bien para un vistazo rápido)
  • <WebDevResourceList />: listado de frameworks, cms, wikis, blogs, foros y demás herramientas que podemos filtrar por el lenguaje programación que utilizan (PHP, Python, Ruby, Perl, Java…). 2/5 puntos (algo tonto, pero curioso)
  • Visual Event: nos permite añadir una capa sobre la web para ver los eventos javascript que incorpora. Se puede ver un ejemplo aquí. 3/5 puntos (sólo funciona con algunas librerías)
  • XML Examples: algunos ejemplos sobre cómo trabajar con XML, aplicando CSS, XSLT, Ajax y Javascript. 5/5 puntos (ejemplos claros e ilustrativos)

V8, el intérprete de Javascript de Google Chrome en Linux

En clase de AAP vamos a aprender a usar JavaScript no sólo como complemento al diseño web, si no como el lenguaje de programación completo que es. Para ello usaremos un intérprete que funcione desde línea de comandos. Entre otros, podemos encontrar SpiderMonkey (paquete spidermonkey-bin en Ubuntu) que está implementado en C, o por ejemplo Rhino que está hecho en Java.

En este post pretendo mostrar cómo instalar V8, el motor de JavaScript que usa el navegador Google Chrome y que está implementado en C++.

Primero nos descargamos el código fuente:

svn checkout http://v8.googlecode.com/svn/trunk/ ./v8

Para compilarlo, necesitamos tener instalado scons:

sudo aptitude install scons

Una vez instalado, procedemos a compilarlo:

cd v8
scons sample=shell

Y con esto, ya tendremos un ejecutable con el que podemos interpretar nuestros programas en JavaScript. Para facilitar las cosas podemos crear un enlace simbólico:

sudo ln -s /home/draxus/v8/shell /usr/bin/v8

Otros motores de última generación son TraceMonkey (Firefox 3.1) o SquirrelFish (Safari 4). Es interesante estar al tanto del rendimiento de estos motores porque están continuamente mejorando para ser competitivos en aplicaciones muy ricas en JavaScript como puede ser Gmail.

AAP Bloque 1.2 Ejercicio 2 – Ejemplos de interfaces REST

Hacer un programa o buscar un ejemplo que use un interfaz REST para acceder a algún servicio Web, como del.icio.us.

Se denomina interfaz REST a una técnica para el acceso a recursos a través de una URI.

La mayoría de los servicios webs actuales ofrecen una API, que son un conjunto de funciones y procedimientos para desarrollar aplicaciones externas, generalmente mediante la técnica REST. Veamos un par de ejemplos.

Last.fm es el mayor portal de recomendación de música online y una de sus múltiples funciones de su API es geo.getEvents, que nos da los eventos cercanos a una posición. Por ejemplo, con http://ws.audioscrobbler.com/2.0/?method=geo.getevents&location=granada&api_key=b25b959554ed76058ac220b7b2e0a026 veremos los próximos conciertos que se van a celebrar en o cerca de Granada.

Podemos ver otro ejemplo en el caso de Flickr, la mayor red social de fotografía online. Si usamos la función flickr.favorites.getPublicList de su API, podemos obtener las fotografías públicas favoritas de un usuario de esta forma: http://api.flickr.com/services/rest/?method=flickr.favorites.getPublicList&api_key=a6a323fe1aa900e0c15211f28ffdc42c&user_id=92176591%40N00

Normalmente los resultados de estas peticiones se devuelven en formato XML o JSON, para que el procesador posterior de los datos resulte lo más cómodo posible.

En la mayoría de estos servicios es necesario solicitar una API Key para hacer las peticiones, de manera que en todo momento se sabe el uso que se hace de ella y te la pueden inhabilitar si sobrepasas los límites del servicio.

Nota: leer comentarios.

AAP Bloque 1.2 Ejercicio 1 – Escalabilidad en sistemas distribuidos

Discutir cuáles son los principales obstáculos a la escalabilidad en un sistema distribuido.

Se dice que un sistema es escalable si al expandirse es capaz de lograr un mejor rendimiento sin perder calidad de servicio.

Algunos ejemplos de escalabilidad:

  • Si tenemos un problema computacionalmente complejo que se está resolviendo en varias máquinas, si añadimos más máquinas, va a tardar menos en resolverse.
  • Si un servidor web que recibe 100 peticiones por minuto pasa a recibir 1000 peticiones por minuto y el tiempo de respuesta no se ve sacrificado.

Se tiende a pensar que un sistema distribuido es por definición escalable, pero esto no siempre es así ya que la parte de expansión sí se cumple, pero la de mejorar el rendimiento y no perder calidad de servicio no siempre se cumple. Esto sucede por diversas causas:

  • La latencia NO es nula: al añadir más nodos a una red distribuida, se van a introducir más retardos en la comunicación.
  • El ancho de banda NO es infinito: puede llegar a pasar que uno de los nodos de la red se sature por exceso de tráfico.
  • La red NO es homogénea: cada tramo de la red puede tener velocidades distintas, luego si tenemos a priori una red de alta velocidad y empezamos a añadir nodos cuya conexión es mucho más lenta, esto va a repercutir en el desempeño de la red. Asimismo puede ocurrir que se usen protocolos de red distintos, por lo que a más variedad, más latencia se tendrá.

Arquitectura de Altas Prestaciones

Este cuatrimestre tengo una asignatura llamada Arquitectura de Altas Prestaciones que la imparte JJ Merelo en la ETSIIT de la Universidad de Granada.

El objetivo de la asignatura es tratar de sacar el máximo partido a los sistemas informáticos actuales, desde procesadores para sistemas embebidos a un supercomputador con miles de procesadores, pasando por sistemas grid como el de RedIRIS.

Como plataforma online vamos a utilizar un wiki para tomar apuntes y los blogs para hacer los ejercicios de autoevaluación, que se agregarán a un planet. Para ello he creado una categoría específica llamada AAP con el fin de tener un RSS específico para el planet, así además de aprender yo, también aprendéis vosotros un poquito :)