miércoles, 8 de julio de 2009

Práctica 7: Bases de datos XML

#!/usr/bin/ruby
require 'rexml/document'
#Debemos añadir la libreria de ruby para Exist
require './existapi.rb'
include REXML

#Parámetros que introduce el usuario
param1 = ARGV[0]
param2 = ARGV[1]

#Vector para almacenar todos los equipos disponibles en la BD
ficheros =Array.new
#Vectores y variables auxiliares
vector=Array.new
vector2=Array.new
j=0


#Sentencias que hay que añadir para hacer funcionar la BD
#Le indicamos que se ejecutará en nuestro PC por el puerto 80
#Además le indicamos el login y contraseña
existapi = ExistApi.new('/exist/xmlrpc','localhost',8080)
existapi.set_credentials('admin','cristina')


#Otras sentencias opcionales relacionadas con la libreria Ruby
existapi.param_indent = 'no'
existapi.param_encoding = 'UTF-8'
existapi.param_highlight_matches = 'none'


#Lo primero de todo es comprobar que se han introducido dos argumentos
if (param1 == nil || param2 == nil)

#Si no lo ha hecho se lo indicamos al usuario
puts "¡Sentencia incorrecta! Lea las instrucciones siguientes:"
puts "----------------------------------------------------------------------"
puts "Para mostrar:\n*todos los equipos escriba: ruby p7final.rb todos equipos"
puts "*todos los jugadores de un equipo escriba: ruby p7final.rb todos [equipo]"
puts "*todos los jugadores de todos los equipos escriba: ruby p7final.rb todos todos"
puts "*un jugador de un equipo: ruby p7final.rb [equipo] [portero|defensa|centrocampista|delantero]"
puts "*los tecnicos de un equipo: ruby p7final.rb [equipo] tecnico"

#---------------------------------------------------------------------------

#Si el usuario desea conocer todos los equipos y/o todos los jugadores
elsif (param1 == "todos" )

#Ahora debemos comprobar el segundo parámetro
#Si quiere conocer TODOS los equipos de la liga o los jugadores de TODOS los equipos
if(param2 == "equipos" || param2 == "todos")

#Nos debemos bajar todas las colecciones de la carpeta equipos en la BD
archivo1=existapi.get_document('/equipos/rmadrid.xml')
archivo2=existapi.get_document('/equipos/barca.xml')

#Creamos los documentos
ficheros.push(Document.new(archivo1))
ficheros.push(Document.new(archivo2))

#Ponemos un titulo a la lista
puts "Los equipos de la liga española son:"
puts "------------------------------------------"

#//////////////////////////////////////////////////////////////////////////////
#TODOS LOS EQUIPOS DE LA LIGA
if(param2=="equipos")
#En este caso solo mencionamos el nombre del equipo
ficheros.each do |teams|
XPath.each(teams,"//equipo/@id") { |equipo|
puts "***-"+equipo.value}
end#Final del bucle

#TODOS LOS JUGADORES DE TODOS LOS EQUIPOS
elsif(param2=="todos")
ficheros.each do |teams|
#Primero ponemos el nombre del equipo
XPath.each(teams,"//equipo/@id") { |equipo|
puts ""
puts "***-"+equipo.value
puts "--------------------"}
#Y luego sus jugadores
XPath.each(teams,"//jugador") { |jugadores|
puts "*-"+jugadores.text

}
end#Final del bucle
end
#//////////////////////////////////////////////////////////////////////////////

end


#//////////////////////////////////////////////////////////////////////////////
#TODOS LOS JUGADORES DE UN EQUIPO

#Primero averiguamos el equipo de que se trata

case param2
when "RMadrid"
arc = existapi.get_document('/equipos/rmadrid.xml')
when "Barca"
arc = existapi.get_document('/equipos/barca.xml')
end

#Y mostramos los jugadores por pantalla indicando además su posicion en el campo
doc = Document.new(arc)

#Obtenemos los jugadores y los almacenamos en un array
XPath.each(doc,"//jugador") { |jugadores|
vector.push(jugadores.text)
}
#Obtenemos su posicion
XPath.each(doc,"//jugador/@tipo") { |titulo|
vector2.push(titulo.value)
}

#Los mostramos de forma alterna
vector.each do |num|
#Debemos pasar el String a integer
numero=num.to_i
#Salida por pantalla
puts "*-"+vector[numero+j]+ " ( "+vector2[numero+j]+" )"
j=j+1
end


#//////////////////////////////////////////////////////////////////////////////


else
#Si pregunta por algun jugador en particular


#NOMBRE DE JUGADORES SEGUN SU POSICION Y EQUIPO
if (param1 == "RMadrid")
archivo=existapi.get_document('/equipos/rmadrid.xml')
elsif (param1 == "Barca")
archivo=existapi.get_document('/equipos/barca.xml')
end

#Creamos el documento
doc = Document.new(archivo)
#Obtenemos la posicion del jugador
tipo = param2


#//////////////////////////////////////////////////////////////////////////////
#LISTAR LOS JUGADORES O LOS TECNICOS

case tipo

when "defensa","centrocampista","delantero","portero"
XPath.each(doc,"//jugador[@tipo=\""+tipo+"\"]/") { |titulo|
puts "*-"+titulo.text }
when "tecnico"
#XPath.each(doc,"//"+tipo) { |titulo|
#puts "*-"+titulo.text }

#Obtenemos los jugadores y los almacenamos en un array
XPath.each(doc,"//"+tipo) { |tecnico|
vector.push(tecnico.text)
}
#Obtenemos su posicion
XPath.each(doc,"//"+tipo+"/@tipo") { |tecn|
vector2.push(tecn.value)
}

#Los mostramos de forma alterna
vector.each do |num|
#Debemos pasar el String a integer
numero=num.to_i
#Salida por pantalla
puts "*-"+vector[numero+j]+ " ( "+vector2[numero+j]+" )"
j=j+1
end

end#Fin del case


end#Fin del if principal

Pruebas:


martes, 16 de junio de 2009

Taller3: Bloque T3.2

1.Hacer una petición a twitter de las últimas líneas de status de los "amigos".

Este ejercicio lo hicimos en clase. Hacemos una petición http usandio la API de Twitter y se devuelve el resultado en formato xml. Hicimos uso de la funcion friends_timeline que nos devueve los últimos 20 status de nuestros amigos.Hacemos POST porque no enviamos información, sino que la recibimos.

#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request::Common qw(POST GET);
use XML::Simple;
my $ua = LWP::UserAgent->new();
my $request = GET 'http://aap_ugr:ugr_aap@twitter.com/statuses/friends_timeline.xml';
my $res = $ua->request($request);
my $cont = XMLin($res->content);

for my $resultado ( %{$cont->{'status'}} ) {
print $resultado->{'text'},"\n";
}

Taller3: Bloque T3.1

1. Argumentar la utilidad de los servicios web y qué posibilidades tienen en el futuro.

Un servicio web (en inglés, Web service) es un conjunto de protocolos y estándares que sirven para intercambiar datos entre distintas aplicaciones desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma (interoperatibidad).

Las ventajas que ofrecen son:
  • Los servicios Web fomentan los estándares y protocolos basados en texto, que hacen más fácil acceder a su contenido y entender su funcionamiento.
  • Al apoyarse en HTTP, los servicios Web pueden aprovecharse de los sistemas de seguridad firewall sin necesidad de cambiar las reglas de filtrado.
  • Permiten que servicios y software de diferentes compañías ubicadas en diferentes lugares geográficos puedan ser combinados fácilmente para proveer servicios integrados.
  • Permiten la interoperabilidad entre plataformas de distintos fabricantes por medio de protocolos estándar y abiertos. Las especificaciones son gestionadas por una organización abierta, la W3C, por tanto no hay secretismos por intereses particulares de fabricantes concretos y se garantiza la plena interoperabilidad entre aplicaciones.

La principal razón para usar servicios Web es que se basan en HTTP sobre TCP (Transmission Control Protocol) en el puerto 80. Dado que las organizaciones protegen sus redes mediante firewalls que filtran y bloquean gran parte del tráfico de Internet-, cierran casi todos los puertos TCP salvo el 80, que es, precisamente, el que usan los navegadores. Los servicios Web utilizan este puerto, por la simple razón de que no resultan bloqueados.


Otra razón es que, antes de que existiera SOAP, no había buenas interfaces para acceder a las funcionalidades de otros ordenadores en red. Las que había eran ad-hoc y poco conocidas, tales como EDI (Electronic Data Interchange),RPC (Remote Procedure Call), u otras APIs.


Una tercera razón por la que los servicios Web son muy prácticos es que pueden aportar gran independencia entre la aplicación que usa el servicio Web y el propio servicio. De esta forma, los cambios a lo largo del tiempo en uno no deben afectar al otro. Esta flexibilidad será cada vez más importante, dado que la tendencia a construir grandes aplicaciones a partir de componentes distribuidos más pequeños es cada día más utilizada.


Se espera que para los próximos años mejoren la calidad y cantidad de servicios ofrecidos basados en los nuevos estándares.


Unos enlace que he encontrado con noticias de interes son:

http://www.moviendonos.com/categoria/servicios-web

http://www.maestrosdelweb.com/editorial/servicios-web/page/2/


Exist

Tras descararlo en este enlace e instalar los paquetes java requeridos (jre,jdk) escribo en el terminal -jar eXist-1.2.5-rev8668.jar . Ahora tras ejecutarlo voy al navegador y escribo
http://localhost:8080/exist/index.x. Luego he introducido el login admin y mi contraseña y nos sale:

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


domingo, 19 de abril de 2009

Taller2: Bloque T2.4

1.Diseñar un XSchema para un documento XML que describa una quiniela, incluyendo resultados. Tener en cuenta que una quiniela tiene 15 partidos sólo. Hacer un documento XML que siga ese XML Schema, y validarlo usando Xerces2 o algún otro parser con validación.

El enlace al wiki donde está colgado es el siguiente: bloqueT24

Este ejercicio ha sido validado por Oxygen:


miércoles, 15 de abril de 2009

Taller2: Bloque T2.3

1. Con los equipos de la liga anteriores, usar diferentes espacio de nombres para el equipo e sí y para sus componentes.

Enlace al wiki

Taller2: Bloque T2.2

1. Crear un documento XML que contenga la descripción de un equipo de liga. Comprobar que el XML es válido.

2. Crear un documento XML que describa varios libros de una biblioteca.

Los cuelgo en el wiki porque al copiar el código el blog hace cosas raras :S .

Ejercicio 1
Ejercicio 2 (hay dos versiones del mismo ejercicio)


Taller2: Bloque T2.1

1.Elegir un editor XML e instalarlo, o buscar un modo XML para un editor genérico.

El editor elegido ha sido notepad++ recomendado por Tularis. Además de tener la ventaja de no tener que ser instalado en el ordenador (lo cual facilita su movilidad) puede ser usado para múltiples lenguajes de programación

Enlace: notepad++

2.Visualizar este fichero XML en un navegador y comprobar que efectivamente puede hacerlo.

Lo abrimos con el Mozilla 3.0.7 y va sin problemas.




Práctica 3: Uso de GreaseMonkey

Este script añade funcionalidad a la página del correo de la ugr. Permite distinguir emails según el emisor, añade un botón al que tras pasar una asignatura devuelve cierta información del profesorado y al final incluye una tabla de porcentajes de emails.




// ==UserScript==

// @name Mejoras-Correo
// @namespace http://geneura.org/projects/greasemonkey
// @description Permite añadirle ciertas mejoras al correo de la universidad tales como la distinción
// de emails dependiendo del que lo envió, búsqueda rápida del email de profesores,
// tabla con porcentajes
// @include https://correo*.ugr.es/*
// @include http://correo*.ugr.es/*

// ==/UserScript==


//Variables
//Array que contiene todos los correos
var correos = new Array();
//Array para los titulos de los mensajes de entrada
var titulos = new Array();
//Correos de tipo [infoalumnos]
var mensajesInfo = 0;
//Correos de profesores
var mensajesProf = 0;


//Simplemente voy llamando a cada una de las funciones creadas:
//-----------------------------------------------------------------------------------------//
//1-buscarEmails()
//Esta funcion busca los emails en la bandeja de entrada
buscarEmails();
//-----------------------------------------------------------------------------------------//
//2-pintarInfo()
//Colorea el fondo de los mensajes de [infoalumnos]
pintarInfo();
//-----------------------------------------------------------------------------------------//
//3-pintarProfesores()
//Colorea el fondo de los mensajes de profesores
pintarProfesores();
//-----------------------------------------------------------------------------------------//
//4-botonComienzo
//Creo un boton al inicio de la bandeja de entrada para buscar emails de profesores
botonComienzo();
//-----------------------------------------------------------------------------------------//
//5-parteFinal()
//Añade una tabla al final de la bandeja de entrada con el recuento de correos
parteFinal();
//-----------------------------------------------------------------------------------------//



function buscarEmails(){
if (document.getElementsByTagName('tbody')[7] != null) {

//Primero obtengo todos los elementos tr dentro del cuerpo de las tablas
//(si no ponemos tbody toma todos los de la pagina y podría salirse de la bandeja de entrada)
//De ellos obtenemos las filas, es decir los tr
var tr = document.getElementsByTagName('tbody')[7].getElementsByTagName('tr');

//Almaceno todos los tr que corresponden a correos en un array
//Esto es, cuando haya dos tr seguidos, hay un correo
for (var i = 2; i <>
//Lo añado al final
correos.push(tr[i]);
}

//Mostramos el numero de mensajes
GM_log('Numero de emails encontrados: ' + correos.length);
}
}//Fin de la funcion buscarEmails()


//Vamos a colorear los emails que vengan de "infoalumnos"
function pintarInfo(){

//Recorremos la bandeja de entrada
for(var t=0 ; t <>

//Almaceno las etiquetas td de cada correo (que son 6)
var td=correos[t].getElementsByTagName('td');

//Sacamos el titulo del correo que se encuentra en la etiqueta "a" dentro del cuarto "td"
var aCorreo=td[4].getElementsByTagName('a')[0];
//Y lo añadimos al vector
titulos[t]=aCorreo.textContent;

//Pintamos su fondo de naranja
//Nos basta comprobar que las primeras letras son las de [infoalumnos]
if(titulos[t][0]=='[' && titulos[t][1]=='i' && titulos[t][2]=='n' && titulos[t][3]=='f'){
mensajesInfo++;
for (var i = 0; i <>
td[i].setAttribute('bgcolor', '#F7BE81');
}
}

//Mostramos el titulo de los correos
GM_log('Correo: ' + (t+1) + titulos[t]);
}
//Mostramos el numero de mensajes [infoalumnos] encontrados
GM_log('Numero de mensajes "infoalumnos" recibidos: ' + mensajesInfo);

}//Fin de la funcion pintarInfo()



//Funcion para pintar los emails de los profesores
function pintarProfesores(){

//Recorro los correos de la bandeja de entrada
for (var i = 0; i <>

//Almaceno las etiquetas td de cada correo (que son 6)
var ttd = correos[i].getElementsByTagName('td');

//Obtengo el titulo del correo que está en el segundo td
var dir = ttd[1].getAttribute('title');

//Buscamos a ver si es de algun profesor de 4º curso
switch (dir) {
case "atv@ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "isanchez@ugr.es.com":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "jjmerelo@gmail.com":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "pameigeiras@ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "jfv@decsai.ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "noel@ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "aruizmoya@ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
case "fgamiz@ugr.es":
mensajesProf++;
for (var j = 0; j <>
ttd[j].setAttribute('bgcolor', '#AAFFAA');
}
//Mostramos su correo
GM_log('email: ' + i + dir);
break;
}
}
//Mostramos el numero de mensajes de profesores que llevamos
GM_log('Numero de emails de profesores: ' + mensajesProf);

}//Fin de la función pintarProfesores()




//Actualizamos la pagina con los resultados obtenidos
function botonComienzo(){

//Crearemos un boton para buscar informacion básica de las asignaturas de 4ºcurso
var centro = document.createElement('center');
var boton = document.createElement("input");
boton.setAttribute("type", "button");
boton.setAttribute("value", "Informacion Asignaturas");
boton.addEventListener("click", buscarAsignatura, true);
centro.appendChild(boton);
//Añadimos el texto al comienzo de la tabla 5 que ya de por si contiene otros botones
var ttr2 = document.getElementsByTagName('tbody')[5].getElementsByTagName('tr');
ttr2[0].parentNode.insertBefore(centro, ttr2[0]);

}//Fin de la funcion botonComienzo()



function hacerTabla(){

//Numero de filas y columnas
var fila1 = new Array;
fila1[0] = "";
fila1[1] = "Mensajes [infoalumnos]";
fila1[2] = "Mensajes de profesores"
var fila2 = new Array;
fila2[0] = "Numero de mensajes";
fila2[1] = mensajesInfo;
fila2[2] = mensajesProf;
var fila3 = new Array;
fila3[0] = "Porcentaje";
//Para los porcentajes mostraremos solo dos cifras decimales
var resulInfo = ((mensajesInfo) / (mensajesInfo + mensajesProf)) * 100;
fila3[1]=Math.round(resulInfo*100)/100 ;
var resulProf = ((mensajesProf) / (mensajesInfo + mensajesProf)) * 100;
fila3[2]=Math.round(resulProf*100)/100 ;

//Comenzamos a crear la tabla
var tab = document.createElement('table');
var tabBody = document.createElement('tbody');

//Fila 1
//Creamos una nueva columna con un color de fondo azul
var row = document.createElement('tr');
row.setAttribute("bgcolor", "#81BEF7");

//La vamos recorriendo y escribiendo en ella los titulos
for (j = 0; j <>
var texto = document.createTextNode(fila1[j]);
var celdaTitulo = document.createElement('th');
celdaTitulo.appendChild(texto);
row.appendChild(celdaTitulo);
tabBody.appendChild(row);
}

//Fila 2
var row1 = document.createElement('tr');
row1.setAttribute("bgcolor", "#F5F6CE");

for (j = 0; j <>
var texto = document.createTextNode(fila2[j]);
var celda = document.createElement('td');
celda.appendChild(texto);
row1.appendChild(celda);
}

tabBody.appendChild(row1);


//Fila 3
var row2 = document.createElement('tr');
row2.setAttribute("bgcolor", "#F5F6CE");

for (j = 0; j <>
var texto = document.createTextNode(fila3[j] + " %");
var celda = document.createElement('td');

celda.appendChild(texto);
row2.appendChild(celda);
}
tabBody.appendChild(row2);


//Añadimos mas estilos a la tabla
tab.appendChild(tabBody);
tab.setAttribute("border", "2");
tab.setAttribute("align", "right");
tab.setAttribute("cellspacing", "8");
tab.setAttribute("cellpadding", "8");
tab.setAttribute("bgcolor", "#FFFFFF");

//Añadimos el texto al final de la pagina
var tr2 = document.getElementsByTagName('table');
var salto3 = document.createElement('br');
tr2[tr2.length - 1].parentNode.insertBefore(salto3, tr2[tr2.length - 1]);
tr2[tr2.length - 1].parentNode.insertBefore(tab, tr2[tr2.length - 1]);

}//Fin de la funcion hacerTabla()


function buscarAsignatura()
{
var asignatura=prompt("Escribe las siglas en mayusculas de una asignatura de 4º curso para obtener informacion");
GM_log(asignatura);

switch (asignatura) {
case "SRD":
cadena = "Asignatura: Sistemas de RadioComunicación \n";
cadena += "Profesor: Angel de la Torre Vega \n"
cadena += "Email: atv@ugr.es";
break;
case "AP":
cadena = "Asignatura: Antenas y Propagacion \n";
cadena += "Profesor: Ignacio Sánchez García \n"
cadena += "Email: isanchez@ugr.es";
break;
case "AAP":
cadena = "Asignatura: Arquitecturas de Altas Prestaciones \n";
cadena += "Profesor: Su magestad Juan Julián Merelo xD\n"
cadena += "Email: jjmerelo@gmail.com";
break;
case "SCO":
cadena = "Asignatura: Sistemas de Conmutación \n";
cadena += "Profesor: Pablo Ameigeiras Gutiérrez \n"
cadena += "Email: pameigeiras@ugr.es";
break;
case "PDI":
cadena = "Asignatura: Procesamiento Digital de Imágenes \n";
cadena += "Profesor: Joaquín Fernández Valdivia \n"
cadena += "Email: jfv@decsai.ugr.es";
break;
case "TSF":
cadena = "Transmisión por Soporte Físico\n";
cadena += "Profesor: Noel Rodríguez Santiago \n"
cadena += "Email: noel@ugr.es";
break;
case "SRC":
cadena = "Seguridad en Redes de Comunicación\n";
cadena += "Profesor: Antonio Ruiz Moya \n"
cadena += "Email:aruizmoya@ugr.es";
break;
case "CIC":
cadena = "Diseño de Circuitos y Sistemas Electrónicos\n";
cadena += "Profesor: Francisco Gámiz Pérez \n"
cadena += "Email:fgamiz@ugr.es";
break;
default:
cadena = "No ha escrito nada así que no hay información";
break;
}

//Y muestro la información por pantalla
alert(cadena);

}//Fin de la funcion buscarAsignatura()



//Abajo añadimos anotaciones sobre los colores y un boton de busqueda de información
function parteFinal(){

//Letra en cursiva
var i1 = document.createElement('i');
var i2 = document.createElement('i');
i1.setAttribute('style', 'color: #F7BE81');
i2.setAttribute('style', 'color: #A1F5AF');
var txt = document.createTextNode(" * Correo de [infoalumno]");
var txt2 = document.createTextNode(" * Correo de profesores");
//Añadimos el texto
i1.appendChild(txt);
i2.appendChild(txt2);
//Añadimos el texto al final de la pagina
var tr2 = document.getElementsByTagName('table');
tr2[tr2.length - 1].parentNode.insertBefore(i1, tr2[tr2.length - 1]);
tr2[tr2.length - 1].parentNode.insertBefore(i2, tr2[tr2.length - 1]);


//Por ultimo creamos una tabla con los porcentajes
hacerTabla();

}//Fin de la funcion parteFinal()