sábado, 30 de mayo de 2009

Taller2: Bloque T2.12

1. Poner la expresión XPath que en el XML de la cassa imprima los nodos que tengan puerta a una habitacion determinada

El código XML:
micasa>
habitacion id="cuarto de baño">
mueble>aparador< /mueble>
mueble>bañera< /mueble>
puerta a="pasillo">
/habitacion>
habitacion id="pasillo">
mueble>cuadro< /mueble>
puerta a="cuarto de baño">
puerta a="dormitorio">
< /habitacion>
< /micasa>

El código en Ruby es:

#!/usr/bin/ruby

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


Con esto le decimos: que busque las puertas de una habitación pasada como parámetro (gracias al atributo @a). Luego pasa a cadena de caracteres el identificador de las habitaciones y lo muestras por pantalla.Ejemplo:

ruby ./ejer212a.rb pasillo
*cuarto de baño


2.Imprimir de un documento XML con los equipos de futbol los que estén clasificados para la liga de campeones

Documento en Ruby:

#!/usr/bin/ruby

require 'rexml/document'
include REXML
documento = ARGV[0]
file = File.new(documento)
doc = Document.new(file)

#Buscamos los equipos que tengan una posicion en la lista menos o igual que 4
XPath.each(doc,"//equipo[position()<=4]") { |equipos|
puts "*"+equipos.text
}


Documento en XML

champion>
equipo posicion="1"> Olula del Rio/equipo>
equipo posicion="2"> Real Madrid/equipo>
equipo posicion="3"> Almeria/equipo>
equipo posicion="4"> Granada/equipo>
equipo posicion="5"> Olula/equipo>
equipo posicion="6"> Betis/equipo>
equipo posicion="7"> Barca/equipo>
/champion>

Ejemplo:

ruby ./ejer212b.rb champion.xml
* Olula del Rio
* Real Madrid
* Almeria
* Granada

Taller2: Bloque T2.11

1. Realiza una quiniela AJAX, que al modificar el resultado de un partido lo almacene en el servidor

En primer lugar creamos el documento html donde se introduciran los equipos así como el resultado del partido.
Luego creo el cliente en Javascript que llama al servidor con una interfaz REST.

El servidor escrito en ruby toma el documento quiniela.xml de y lo va actualizando:


#!/usr/bin/ruby
require 'rexml/document'
require 'cgi'
include REXML

#Cabecera, poner siempre
print "Content-Type: application/xhtml+xml\n\n"

cgi = CGI.new()

#Recojo los parámetros que le paso por la interfaz res
nPartido=cgi['nPartido']
resultado=cgi['resultado']
local=cgi['local']
visitante=cgi['visitante']


# Comprobamos que se han rellenado todas las casillas
if((nPartido=="" || resultado=="" || local =="" || visitante==""))
print "Te falta algun dato por introducir \n\n "
nPartido=-1;
end

# Construimos documento XML
file = File.new('./quiniela.xml','r')
doc = Document.new(file)

# Guardamos el nuevo documento XML con las modificaciones efectuadas
file = File.new('./quiniela.xml','w')
file.print <<"EOF"
EOF
print <<"EOF"
EOF

#Comenzamos a escribir nuestro fichero
file.print ""

#Buscamos todos los partidos
i = 0;
doc.root.each_element('partido') { |p|

#if(p.attributes['equipoLocal']==local.to_s && p.attributes['equipoVisitante']==visitante.to_s)
#Si ya estaba en la quiniela cambio solo el resultado
#p.attributes['resultado']=resultado

#Si coincide con el numero de partido y el resultado es correcto
if(i==nPartido.to_i && (resultado.to_i=='1' ||resultado.to_i=='2' ||resultado.to_i=='x' ||resultado.to_i=='X'))

#Sobreescribimos el partido
#En caso contrario se deja tal y como esta
p.attributes['resultado']=resultado
p.attributes['equipoVisitante']=visitante
p.attributes['equipoLocal']=local
end

#Escribimos todos los partidos
file.print p,"\n"
print p,"\n"
i+=1
}
file.print""
file.print ""
print ""

Práctica 6: Programa AJAX

Para la práctica he creado un programa basado en feeds. En él puedes tanto visitar algunos que te propongo, como almacenar los que te gusten. Además, como extensión le añadí un apartado para telecos que quieran informarse sobre su plan de estudios almacenado que es leído deen un fichero .xml.

Ficheros:
1. Cliente
2. Servidores:
El primero escrito en Perl


#!/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
my $rdf = get($url);
my $rss = new XML::RSS;
$rss->parse($rdf);
my $rss_salida = new XML::RSS;
$rss_salida->channel( title => 'Resumen feed',
link => $url,
description => 'Resumiendo el feed' );
print header( -type => 'application/xhtml+xml' );

for (my $i = 0; $i < $numero_elementos;$i ++ ) {
$rss_salida->add_item( title => $rss->{'items'}[$i]->{'title'},
link => $rss->{'items'}[$i]->{'link'},
description => $rss->{'items'}[$i]->{'description'});
}
print $rss_salida->as_string;


El segundo escrito en Ruby:


#!/usr/bin/ruby
require 'rexml/document'
require 'cgi'
include REXML

cgi = CGI.new()
print""
#Recojo los parámetros que le paso por la interfaz res
curso=cgi.params['curso'][0]

print "Content-Type: application/xhtml+xml\n\n"

# Construimos documento XML
file = File.new('teleco.xml','r')
doc = Document.new(file)

print ""

#Busco dentro del documento el curso concreto y obtengo el contenido de las asignaturas que corresponden con el tipo buscado
doc.root.each_element(curso.to_s) { |c|
c.each_element('asignatura'){ |a|
print a,"\n" #Imprimo la asignatura que estaba buscando
}
}
print""
print""




Podemos probarlo en esta direccion

domingo, 24 de mayo de 2009

Taller2: Bloque T2.10

1. Hacer un filtro SAX que traduzca el célebre XML casero de etiquetas en español a etiquetas en inglés.

El código en ruby es el siguiente:

#!/usr/bin/ruby

#Librerias
require 'rexml/document'
require 'rexml/streamlistener'
include REXML

#Archivo xml pasado como argumento
file=ARGV[0]


#Diccionario
traduce= {
"micasa"=>"myhouse",
"habitacion"=>"room",
"mueble"=>"furniture",
"televisión"=>"TV",
"mesa"=>"table",
"sofá"=>"sofa",
"puerta"=>"door"}

#Definimos la clase
class Traduce
include StreamListener

def initialize(tags)
#Variables de instancia
@traduce=tags
@escribe = false
end

#Eventos
#Comienzo de etiqueta
def tag_start(name, attributes)
#Español --> Inglés
puts "<"+@traduce[name]+">"
#Dentro de la etiqueta mueble hay texto dentro por eso se permite escribir
if (name == "mueble")
@escribe = true
end
end

#Final de una etiqueta
def tag_end(name)
#Español --> Inglés
puts ""
@escribe=false
end

#Imprime el texto si está activado @escribe
def text(text)
if @escribe
puts @traduce[text]
end
end

#Fin de la clase
end


listener = Traduce.new(traduce)
parser = Parsers::StreamParser.new(File.new(file), listener)
parser.parse



y para probarlo escribimos en el terminal:
ruby ./ejer210.rb muebles.xml

Taller2: Bloque T2.9

1. Crear un CGI que responda a un interfaz REST y devuelva un fichero XML

Al siguiente programa en perl le pasamos como parametro el documento xml a imprimir y con la orden XMLout la saca por pantalla:


Para probarlo:
localhost/cgi-bin/ejer29.cgi?nombre=ejemplo

Práctica 5: Manejo de XML

En esta práctica he creado un planet con canales de noticias de música ya que es mi gran afición. Además, he recopilado canales de diferentes estilos para así atraer la captación de un mayor público.

En primer lugar el archivo .xml que le pasará las diferentes urls de donde extraemos los artículos: Enlace

Posteriormente he creado un fichero en lenguaje ruby que leerá cada uno de los canales: Enlace

El resultado final podemos verlo aquí :)

lunes, 4 de mayo de 2009

Taller2: Bloque T2.8

1. Buscar formas alternativas de servir XML a través de un servidor web.

Existen múltiples programas que se ejecutan en un servidor además de los CGIs. Algunas de ellos son:

  • Servlet de Java
Programas orientados a servir páginas o documentos de forma dinámica usando la programación en Java. Los Servlets se ejecutan en el servidor y en no presentan ningún tipo de interfaz gráfica puesto que se encargan de hacer el trabajo oculto.
Referencia aquí.
  • PHP (PHP Hypertext Pre-processor)
Lenguaje que se ejecuta en la parte del servidor y que permite generar dinamicamente documentos o paginas, destacando especialmente su integración con distintas bases de datos como mySQL.
Referencia aquí.
  • ASP (Active Server Pages)
Es la ecnología para la creación de páginas dinámicas del lado del servidor desarrollada por Microsoft. El tipo de servidores que emplean este lenguaje son aquellos que funcionan con sistema operativo de la familia de Windows NT. Para escribir páginas ASP utilizamos un lenguaje de scripts, que se colocan en la misma página web junto con el código HTML.
Documentación aquí.


2.Instalar un servidor web en el ordenador, y probar el programa anterior.

En principio comencé instalándome el servidor XAMPP para Windows al que más tarde tuve que añadir la librería Perl porque no la llevaba. Sin embargo, al final decidí pasarme a Linux (a estas alturas) ya que me lo recomendaron.

Así pues, con la ayuda de Alexfh me instalé la maquina virtual VMware Workstation y en ella cargué la última versión de Ubuntu. Una vez hecho, instalé el servidor Apache y las líbrerias Ruby y Perl.

El ejemplo anterior:

Taller2: Bloque T2.7 REPETICION

Despues de fijarme en uno de los ejemplos de otros años me dado cuenta de que eso no es exactamente lo que pedía el ejercicio así que he creado otro programa que lee los titulos y las categorias de feeds ya que la web que encontré después de mucho buscar no contienen etiquetas de fecha.


Taller2: Bloque T2.7

1. Hacer un programa que lea un feed RSS dado por el URL y presente los titulos y fechas. usar cualquier lenguaje de programacion.

Modificamos el programa rss-1.rb para que muestre la fecha. Esta hay que pasarla de tipo Time a string con la funcion to_s:
Si lo pasamos por el documento .rss que sigue:
resulta:

Taller2: Bloque T2.6

1. Localizar feeds RSS de publicaciones relacionadas con la asignatura

Aquí tenemos un blog de software, aplicaciones webs y mas, que nos permite suscribirnos a su canal RSS

2.Darse de alta en un agregador donline (alguno de los indicados anteriormente), o bien descargar un agregador, suscribirse a las publicaciones anteriores y seguirlas con suma atencion.

Me he dado de alta en GoogleIG

Taller2: Bloque T2.5

1. Modificar alguno de los programas para que imprimas las habitaciones, en vez de los muebles

Modificamos el ejemplo en ruby. Nos fijamos en que el nombre de las habitaciones se incluye en su identificador, por lo que es ese atributo el que tenemos que buscar en el documento.
y el xml que le pasamos como parámetro:
si lo ejecutamos:

>>ruby ./muebles.rb muebles.xml
comedor
cocina

Referencias: http://www.xml.com/lpt/a/1626

Práctica 4: Introducción al XML

Este documento XML trata sobre la formación de una orquesta en cuanto a personas que la componen.

Primer documento xml (el blog hace que no se muestre correctamente)

< ?xml version="1.0" encoding="UTF-8"?>
< !--Descripcion de los componentes de una orquesta-->


< nombre="'Banda" ciudad="'Olula'" xsi="http://www.w3.org/2001/XMLSchema-instance" nonamespaceschemalocation="orq.xsd">
< id="'JJ'">< /director>

<>
< !--======================================================-->
<>

< !--VIOLINES-->
< clase="'principal'">< nombre="'Pepe'" edad="'22'" sexo="'hombre'" email="'pepe@orq.es'">< /musico>< /violin>
< clase="'primero'">< nombre="'Maria'" edad="'32'" sexo="'mujer'" email="'maria@orq.es'">< /musico>< /violin>
< clase="'primero'">< nombre="'Manolo'" edad="'25'" sexo="'hombre'" email="'manolo@orq.es'">< /musico>< /violin>
< clase="'segundo'">< nombre="'Juan'" edad="'34'" sexo="'hombre'" email="'juan@orq.es'">< /musico>< /violin>
< clase="'segundo'">< nombre="'Enma'" edad="'27'" sexo="'mujer'" email="'enma@orq.es'">< /musico>< /violin>
< clase="'tercero'">< nombre="'Lola'" edad="'15'" sexo="'mujer'" email="'lola@orq.es'">< /musico>< /violin>

< !--VIOLA-->
< nombre="'Antonio'" edad="'25'" sexo="'hombre'" email="'antonio@orq.es'">< /musico>< /viola>

< !--VIOLONCELLO-->
< nombre="'Paco'" edad="'15'" sexo="'hombre'" email="'paco@orq.es'">< /musico>< /violoncello>

< !--CONTRABAJO-->
< nombre="'Alexfh'" edad="'21'" sexo="'hombre'" email="'alex@orq.es'">< /musico>< /contrabajo>

< /cuerda>

< !--========================================================-->

<>

< !--SAXOFONES-->
< clase="'tenor'">< nombre="'Laura'" edad="'21'" sexo="'mujer'" email="'laura@orq.es'">< /musico>< /saxofon>
< clase="'tenor'">< nombre="'Manu'" edad="'21'" sexo="'hombre'" email="'manu@orq.es'">< /musico>< /saxofon>
< clase="'alto'">< nombre="'PakitoChus'" edad="'21'" sexo="'hombre'" email="'pakito@orq.es'">< /musico>< /saxofon>

< !--TROMPETAS-->
< clase="'primera'" tipo="'enSi'">< nombre="'Luis'" edad="'23'" sexo="'hombre'" email="'luis@orq.es'">< /musico>< /trompeta>
< clase="'segunda'" tipo="'enSi'">< /musico>< /trompeta>
< clase="'segunda'" tipo="'enSol'">< nombre="'Abel'" edad="'17'" sexo="'hombre'" email="'abel@orq.es'">< /musico>< /trompeta>

< !--TROMPA-->
< tipo="'enFa'">< nombre="'Cristian'" edad="'20'" sexo="'hombre'" email="'cris@orq.es'">< /musico>< /trompa>

< !--TROMBON-->
<>< nombre="'Almudena'" edad="'21'" sexo="'mujer'" email="'almu@orq.es'">< /musico>< /trombon>

< !--BOMBARDINO-->
<>< nombre="'Miguel'" edad="'28'" sexo="'hombre'" email="'miguel@orq.es'">< /musico>< /bombardino>

< !--HELICÓN-->
<>< nombre="'Inma'" edad="'20'" sexo="'mujer'" email="'inma@orq.es'">< /musico>< /helicon>

< /metales>

< !--========================================================-->
<>

< !--FLAUTAS-->
< clase="'primera'">< nombre="'Nika'" edad="'21'" sexo="'mujer'" email="'nika@orq.es'">< /musico>< /flauta>
< clase="'segunda'">< nombre="'Carlos'" edad="'21'" sexo="'hombre'" email="'carlos@orq.es'">< /musico>< /flauta>
<>< nombre="'Loli'" edad="'13'" sexo="'mujer'" email="'loli@orq.es'">< /musico>< /flautin>

< !--OBOE-->
<>< nombre="'Pepa'" edad="'26'" sexo="'mujer'" email="'pepa@orq.es'">< /musico>< /oboe>

< !--FAGOT-->
<>< nombre="'Raul'" edad="'35'" sexo="'hombre'" email="'raul@orq.es'">< /musico>< /fagot>

< !--CLARINETES-->
< clase="'principal'">< nombre="'Mariola'" edad="'24'" sexo="'mujer'" email="'mariola@orq.es'">< /musico>< /clarinete>
< clase="'primero'">< nombre="'Fede'" edad="'21'" sexo="'hombre'" email="'fede@orq.es'">< /musico>< /clarinete>
< clase="'primero'">< nombre="'Alba'" edad="'18'" sexo="'mujer'" email="'alba@orq.es'">< /musico>< /clarinete>
< clase="'segundo'">< nombre="'Kisko'" edad="'22'" sexo="'hombre'" email="'kisko@orq.es'">< /musico>< /clarinete>
< clase="'segundo'">< nombre="'Carmen'" edad="'18'" sexo="'mujer'" email="'carmen@orq.es'">< /musico>< /clarinete>
< clase="'tercero'">< nombre="'Mercedes'" edad="'13'" sexo="'mujer'" email="'mercedes@orq.es'">< /musico>< /clarinete>
< clase="'tercero'"> < /musico>< /clarinete>
< /maderas>

< !--========================================================-->

<>
< !--TIMBALES-->
<>< nombre="'Esperanza'" edad="'25'" sexo="'mujer'" email="'espe@orq.es'">< /musico>< /timbales>

< !--PLATOS-->
<>< nombre="'Andres'" edad="'21'" sexo="'hombre'" email="'andres@orq.es'">< /musico>< /platillos>

< !--CAJA-->
<>< nombre="'Josefa'" edad="'22'" sexo="'mujer'" email="'josefa@orq.es'">< /musico>< /caja>
< /percusion>

< !--========================================================-->

< /familias>
< /orquesta>


Schema
NOTA: Como no se ve bien si alguien quiere ver mi practica basta con que me lo deje escrito en comentarios y se la mando