viernes, 29 de mayo de 2009

AAP Práctica 6

Esta práctica consistía en hacer una aplicación en AJAX. Yo he creado un servicio para alojar agendas de contactos: http://my.alejandrofh.es/aap/p6/ y aquí la entrega con el código.

Mi primer intento se quedó en un script de GreaseMonkey que actualiza dinámicamente el contenido de nuestro Wiki pero no había aplicación de servidor así que no me valía.

viernes, 8 de mayo de 2009

AAP Práctica 5

En ésta práctica se nos pedía la creación de un Planet. Yo me he querido basar en la experiencia que tengo de usar Google Reader e intenté hacer algo parecido.
Antes de entrar en la explicación de cómo lo he implementado, dejo el enlace para que se pueda ver el resultado final.

Para conseguir que funcionase tuve que crear un CGI que obtuviera la fuente que se le indicara y lo mostrara con un cierto estilo. El código en Perl es el siguiente:
#!/usr/bin/perl

use CGI qw(:standard);
use XML::RSS;
use LWP::Simple qw(get);

my $numero_elementos = param('num_elementos');
my $url = param('url');

#Baja fichero
if (!defined($url)){
print header( -type => 'text/html' );
print '<body style="text-align:center; vertical-align:center">'.
'<h1>Bienvenido al lector RSS</h1>'.
'<p>Elige de la izquierda las noticias que quieres leer.</p>'.
'</body>';
}
else{
if (!defined($numero_elementos)) { $numero_elementos = 7; }
my $rdf = get($url);
my $rss = new XML::RSS;
$rss->parse($rdf);
my $salida = '<body>'.
'<h1><a href="'.$rss->{'channel'}->{'link'}.'" target="_blank">'.$rss->{'channel'}->{'title'}.'</a></h1>'.
'<p>'.$rss->{'channel'}->{'description'}.'</p>';
print header( -type => 'text/html' );

for (my $i = 0; $i < $numero_elementos;$i ++ ) {
$salida = $salida.
'<div style="border:dotted; background-color:lightblue ">'.
'<h2><a href="'.$rss->{'items'}[$i]->{'link'}.'" target="_blank">'.$rss->{'items'}[$i]->{'title'}.'</a></h2>'.
'<h4>'.$rss->{'items'}[$i]->{'pubDate'}.'</h4>'.
'<p>'.$rss->{'items'}[$i]->{'description'}.'</p>'.
'</div>';
}
$salida = $salida.'</body>';
print $salida;
}


A continuación, como quería añadirle la funcionalidad de poder agregar más fuentes, diseñé el sistema de modo que se leyeran las fuentes desde un fichero XML. Este fichero lo he llamado enlaces.xml. Además, creé otro CGI en perl que modificara el archivo con el fin de ampliar la lista de fuentes RSS.

Por último diseñé la interfaz gráfica en HTML y Javascript haciendo mis primeros pinitos con AJAX y jQuery.

Todos los archivos necesarios para la práctica están aquí.

martes, 5 de mayo de 2009

AAP BloqueT2.12 ejercicio2

En un documento XML con la clasificación de los equipos de fútbol, imprimir sólo los que estén clasificados para liga de campeones (los 4 primeros)
El documento XML que he usado para definir la clasificación es el siguiente: clasificacion.xml
<?xml version="1.0" encoding="UTF-8"?>
<clasificacion>
<equipo name="FC Barcelona">
<posicion>1</posicion>
</equipo>
<equipo name="Betis">
<posicion>10</posicion>
</equipo>
<equipo name="Real Madrid">
<posicion>2</posicion>
</equipo>
<equipo name="Murcia">
<posicion>8</posicion>
</equipo>
<equipo name="Granada">
<posicion>4</posicion>
</equipo>
<equipo name="Valencia">
<posicion>3</posicion>
</equipo>
<equipo name="Sevilla">
<posicion>5</posicion>
</equipo>
</clasificacion>


El programa en Ruby en el que he usado XPath para encontrar los 4 primeros es como sigue: clasificacion.rb
#!/usr/bin/ruby

require 'rexml/document'
include REXML
documento = 'clasificacion.xml'
file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//equipo[posicion<=4]/@name") { |equipo|
puts "*"+equipo.value
}


Al ejecutarlo en la terminal nos queda:
afharo@ajelandroHP:~/AAP/Clase 18/bloqueT212ej2$ ./clasificacion.rb
*FC Barcelona
*Real Madrid
*Granada
*Valencia

AAP BloqueT2.12 ejercicio1

Para los atributos en XPath se usa la expresión @atributo. Sabiéndolo, poner la expresión XPath que, en los XML de habitaciones anterior, imprima todos los nodos que tengan puerta a una habitación determinada.
Primero hay que definir el archivo que vamos a analizar: muebles.xml

<?xml version="1.0" encoding='iso-8859-1' ?>
<micasa>
<habitacion id='comedor'>
<mueble>aparador</mueble>
<mueble>sofá</mueble>
<puerta a='balcón' />
</habitacion>
<habitacion id='cocina'>
<mueble>encimera</mueble>
<mueble>horno</mueble>
<puerta a='comedor' />
</habitacion>
<habitacion id='baño'>
<mueble>espejo</mueble>
<mueble>estantería</mueble>
<puerta a='comedor' />
</habitacion>
</micasa>


A continuación preparamos el programa en Ruby que encuentra las habitaciones que tienen una puerta con dirección a la habitación pasada por parámetro: muebles.rb

#!/usr/bin/ruby

require 'rexml/document'
include REXML
destino = ARGV[0]
documento = 'muebles.xml'
file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//habitacion[puerta[@a='"+destino+"']]/@id") { |habitacion|
puts "*"+habitacion.value
}


Por último, si ejecutamos en la terminal el comando ./muebles.rb comedor nos devuelve lo siguiente:
afharo@ajelandroHP:~/AAP/Clase 18/bloqueT212ej1$ ./muebles.rb comedor
*cocina
*baño

AAP BloqueT2.11 ejercicio1

Realizar una quiniela AJAX, que al modificar el resultado de un partido, lo almacene en el servidor
Para realizar este ejercicio son necesarios tres ficheros:
  • El archivo XML donde se van a almacenar las quinielas: quiniela.xml

  • El CGI que se encarga de realizar las modificaciones: quiniela.cgi

  • La página HTML desde la que accedemos a los archivos anteriores mediante peticiones AJAX: quiniela.html


Para probar el sistema completo, hay que pinchar sobre el último enlace.