viernes, 27 de marzo de 2009

AAP Bloque T2.4 ejercicio1:

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 XSD es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns='http://www.w3.org/2001/XMLSchema'>

<element name='quiniela'>
<complexType>
<sequence>
<element name='partido' minOccurs='1' maxOccurs='15' >
<complexType>
<sequence>
<element name='equipo' type='string' minOccurs='2' maxOccurs='2'/>
<element name='resultado' type='string' minOccurs='1'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>

</schema>


El XML que quiero validar es:
<?xml version="1.0" encoding="UTF-8"?>
<quiniela>
<partido>
<equipo>Madrid</equipo>
<equipo>Betis</equipo>
<resultado>1</resultado>
</partido>
<partido>
<equipo>Atletico de Madrid</equipo>
<equipo>Olula CF</equipo>
<resultado>2</resultado>
</partido>
</quiniela>


Probamos a validarlo y el XMLLint nos devuelve:
cvi0243:Clase 11 afharo$ xmllint --schema bloqueT2.4.1.xsd bloqueT2.4.1.xml
<?xml version="1.0" encoding="UTF-8"?>
<quiniela>
<partido>
<equipo>Madrid</equipo>
<equipo>Betis</equipo>
<resultado>1</resultado>
</partido>
<partido>
<equipo>Atletico de Madrid</equipo>
<equipo>Olula CF</equipo>
<resultado>2</resultado>
</partido>
</quiniela>
bloqueT2.4.1.xml validates

AAP Bloque T2.3 ejercicio1:

Con los equipos de la liga anteriores, usar diferentes espacio de nombres para el equipo en sí y para sus componentes. Por ejemplo, los elementos que se incluyan dentro de un jugador pueden tener un espacio de nombres, mientras que la descripción de un equipo puede tener otro diferente

<?xml version="1.0" encoding="iso-8859-1"?>
<eq:equipo xmlns='http://www.geneaura.org/' xmlns:eq='http://www.geneaura.org/equipo' xmlns:jug='http://www.geneaura.org/jugadores' name="Los Mortadelos">
<eq:jugador>
<jug:nombre>Mortadelo</jug:nombre>
<jug:posicion>Portero</jug:posicion>
<jug:numero>13</jug:numero>
</eq:jugador>
<eq:jugador>
<jug:nombre>Filemon</jug:nombre>
<jug:posicion>Amigo del portero</jug:posicion>
<jug:numero>13+1</jug:numero>
</eq:jugador>
<eq:jugador>
<jug:nombre>Ofelia</jug:nombre>
<jug:posicion>La fan de Mortadelo</jug:posicion>
<jug:numero>1</jug:numero>
</eq:jugador>
<eq:entrenador nombre="El Super" />
</eq:equipo>

lunes, 23 de marzo de 2009

AAP Bloque T2.2 ejercicio1:

Crear un documento XML, que contenga la descripción de un equipo de la liga (jugadores, nombre, entrenador). Procesarlo en el parser JavaScript, y con el Xerces. Usar alternativamente un editor XML como los vistos en el apartado anterior. Comprobar que es XML válido.

<?xml version="1.0" encoding="iso-8859-1"?>
<equipo name="Los Mortadelos">
<jugador>
<nombre>Mortadelo</nombre>
<posicion>Portero</posicion>
<numero>13</numero>
</jugador>
<jugador>
<nombre>Filemon</nombre>
<posicion>Amigo del portero</posicion>
<numero>13+1</numero>
</jugador>
<jugador>
<nombre>Ofelia</nombre>
<posicion>La fan de Mortadelo</posicion>
<numero>1</numero>
</jugador>
<entrenador nombre="El Super" />
</equipo>

AAP Bloque T1.8 ejercicio1:

Hacer un script JS que navegue desde cada bloque de ejercicios al siguiente.

// ==UserScript==
// @name AAP-Nav2
// @namespace http://geneura.org/projects/greasemonkey
// @description Navegacion por los ejercicios de AAP
// @include http://geneura.ugr.es/~jmerelo/asignaturas/AAP/*
// ==/UserScript==

GM_log('Entrando AAP-Nav2');
var ej = document.getElementsByClassName('ejercicios');
var a_nodes = new Array;
var anchors = new Array;
for ( var secs = 0; secs < ej.length; secs ++ ) {
var id = ej[secs].getAttribute('id');
var thisA = document.createElement('a');
thisA.setAttribute('href',id);
a_nodes[secs] = thisA;
anchors[secs] = thisA.getAttribute('href');
GM_log('Anchor ' + secs + " " + anchors[secs]);
}



for ( var secs = 0; secs < ej.length; secs ++ ) {
var span = document.createElement('span');
span.setAttribute('style','background:lightgreen');
if ( secs > 0 ) {
var ahref = document.createElement('a');
ahref.setAttribute('href','#'+anchors[secs-1]);
var txt=document.createTextNode('^');
ahref.appendChild(txt);
span.appendChild(ahref);
}
if ( secs < ej.length -1 ) {
span.appendChild(document.createTextNode(' | '));
var ahref = document.createElement('a');
ahref.setAttribute('href','#'+anchors[secs+1]);
var txt=document.createTextNode('v');
ahref.appendChild(txt);
span.appendChild(ahref);
}
ej[secs].appendChild(a_nodes[secs]);
a_nodes[secs].parentNode.insertBefore(span,a_nodes[secs]);
}




AAP Bloque T1.7 ejercicio1:

Salvar esta página, y sobre ella hacer un programa JS que imprima todos los títulos de secciones.
<div id="resultad2" style="border: medium dashed ; padding: 5px; background: lightgreen none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">
</div>

<script type="text/javascript">
ej = document.getElementsByTagName('h2');
for (j in ej) {
document.getElementById('resultad2').innerHTML += ej[j].textContent+"<br>";
}
</script>

AAP Bloque T1.4 ejercicio1:

Modificar el programa anterior (cualquiera de ellos) para que contabilice el número de partidos ganados, empatados y perdidos.

Yo he añadido que se ordenen, ademas, por los puntos de la clasificacion:
#!/usr/bin/smjs


load('Partido.js');

var equipos= new Array('Madrid', 'Barça', 'Atleti', 'Geta', 'Betis', 'Depor', 'Sevilla', 'Graná');

function jornada( estosEquipos ) {

var equiposAqui = new Array;
equiposAqui = equiposAqui.concat(estosEquipos);
var midsize = equiposAqui.length/2;
var quiniela = new Array( midsize );
var unox2 = new Array( '1','x','2');
for ( var i=0; i < midsize ; i++ ) {
var equipo1 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()) , 1);
var equipo2 = equiposAqui.splice(Math.floor( equiposAqui.length*Math.random()), 1);
quiniela[i] = new Partido( equipo1, equipo2 );
quiniela[i].setResultado( unox2[Math.floor( 3*Math.random()) ]);
}
return quiniela;
}


var quinielas = new Array;
for ( var i = 0; i < 10; i ++ ) {
quinielas[i] = jornada( equipos );
}

var ganados= new Array;
for (var i in equipos) {
ganados[equipos[i]]=0;
}
var perdidos= new Array;
for (var i in equipos) {
perdidos[equipos[i]]=0;
}
var empatados= new Array;
for (var i in equipos) {
empatados[equipos[i]]=0;
}
var resultados= new Array;
for ( var i in equipos ) {
resultados[equipos[i]]=0;
}
for ( var i = 0; i < quinielas.length; i ++ ) {
for ( var j = 0;j < quinielas[i].length; j ++ ) {
var local = quinielas[i][j].local;
var visitante = quinielas[i][j].visitante;
var resultado = quinielas[i][j].resultado;
switch (resultado) {
case '1':
resultados[local]+=3;
ganados[local]+=1;
perdidos[visitante]+=1;
break;
case 'x':
resultados[local]+=1;
resultados[visitante]+=1;
empatados[local]+=1;
empatados[visitante]+=1;
break;
default:
resultados[visitante]+=3;
ganados[visitante]+=1;
perdidos[local]+=1;
}
}
}
var equipo;
var orden = new Array;
var k=0;
var clasificacion = new Array;
for (var i in equipos) {
var max_punt = 0;
for (var j in resultados) {
if (resultados[j]>max_punt) {
equipo = j;
max_punt = resultados[j];
}
}
orden[k] = equipo;
clasificacion[equipo] = resultados[equipo];
resultados[equipo]=0;
k++;
}

print("Equipo: Pts : G : E : P");
for ( var i in orden ) {
print( orden[i] + ": " + clasificacion[orden[i]] + " : " + ganados[orden[i]] + " : " + empatados[orden[i]] + " : " + perdidos[orden[i]])
}

AAP Bloque T1.3 ejercicio1:

Hacer una clase que corresponda a una fila de una tabla, con número de columnas variable, y un programa que permita crear e imprimir una tabla usándolo.

// Bloque T1.3
// Hacer una clase que corresponda a una fila de una tabla, con número de columnas variable, y un programa que permita crear e imprimir una tabla usándolo.

function Fila (columnas){
this.fila = new Array;
this.columnas = columnas;
for (k=0; k<this.columnas; k++){
this.fila[k] = Math.random();
}
this.toString = pintarFila;
}

function pintarFila (){
var texto = "";
texto += "<"+fila+">";
for (j=0; j<this.columnas; j++) {
texto += "<"+celda+">"+this.fila[j]+"</"+celda+">";
}
texto += "</"+fila+">";
return texto;
}

function tabla (filas, columnas){
var tabla = new Array;
print( "<"+table+">");
for (i=0; i<filas; i++) {
tabla[i] = new Fila(columnas);
print(tabla[i].toString());
}
print ("</"+table+">");
}

var table="table";
var celda = "td";
var fila="tr";

var filas = 3;
var columnas = 3;
tabla(filas,columnas);

AAP Bloque T1.2 ejercicio1:

Hacer una función que devuelva una tabla en HTML con el número de filas y columnas que se le pasen como parámetro.
// Bloque T1.2
// Mostrar una tabla con el número de filas y columnas que se pasen por parámetros

function tabla (filas, columnas){
var tabla="table";
var celda="td";
var fila="tr";
print( "<"+tabla+">");
for (i=0; i<filas; i++) {
print( "<"+fila+">");
for (j=0; j<columnas; j++) {
print ("<"+celda+">"+Math.random()+"</"+celda+">");
}
print ("</"+fila+">\n");
}
print ("</"+tabla+">");
}

var filas = 8;
var columnas = 8;
tabla(filas,columnas);

AAP Bloque T1.1 ejercicio1:

Comentar en la bitácora diferentes lenguajes que se puedan usar en el navegador, y qué ventajas e inconvenientes tiene cada uno.
Actualmente podemos utilizar varios lenguajes de programación para poder ejecutar aplicaciones en un navegador. Entre estos lenguajes podemos encontrar:
  • HTML: Obviamente este es el principal lenguaje de programación de páginas webs aunque es muy limitado en funcionalidad porque se podría quedar en definir el formato de la página y poco más.
  • JavaScript: Otro lenguaje que viene nativo en los navegadores de modo que podemos crear aplicaciones bastante potentes dentro de nuestra página web.
  • CSS: Siempre se ha usado como hoja de estilos pero con los nuevos estándares se pueden crear hasta animaciones con él. También es nativo en todos los navegadores. Un ejemplo de CSS dinámico es éste.
  • Flash: De Adobe. Aplicaciones bastante potente pero que tienen el inconveniente de que debes tener instalado el reproductor de flash y que por lo general debes descargar el archivo .swf completo para que la aplicación comience a funcionar.
  • Silverlight: De Microsoft. Está menos extendido que el Flash pero gracias a acuerdos con páginas importantes (como NBA.com) va introduciéndose en nuestros ordenadores.
  • Moonlight: El Silverlight de código abierto.
  • Java (Applets): Aplicaciones programadas en Java para incrustarlas en una página web. Necesitas tener una máquina virtual de Java instalada.

AAP Bloque T2.1 ejercicio2:

Visualizar este fichero XML en un navegador para ver cómo lo hace, y si puede efectivamente hacerlo.
Firefox puede abrirlo perfectamente con formato y pregunta qué programa quieres utilizar para suscribirte a dicho feed de noticias.

Esto es debido a las hojas de estilo. Un ejemplo se pueden ver en estos archivos:
En descargas-sinformato.xml lo único que le falta es la segunda línea que tiene descargas.xml que es donde se carga la hoja de estilos descargas.xsl

AAP Bloque T2.1 ejercicio1:

Elegir un editor XML e instalarlo, o buscar un modo XML para un editor genérico.
Yo voy utilizar el Dreamweaver de la suite CS4 que es capaz de cerrar las etiquetas automáticamente, indica en todo momento en qué nivel o etiqueta te encuentras y mantiene la indentación.
ACTUALIZACIÓN: También he estado probando otro para Mac OS X llamado Editra, gratuito y más ligero. Es muy parecido al gedit de Linux, admite complementos y tiene una herramienta para convertir el texto a HTML (como el highlight), LaTeX y RTF.

lunes, 16 de marzo de 2009

Práctica 2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AAP: Practica 2 : Programa Simple en JavaScript</title>
</head>

<body>
<h1>AAP: Practica 2 : Programa Simple en JavaScript</h1>

<h2>Breve introducción</h2>

<p>La aplicación que le he buscado a este programa en JavaScript es el de "matricular" alumnos a una asignatura y poder asignarle notas de modo que podemos ir viendo cómo van creciendo el número de notas que haya obtenido y se muestra la media de todas las calificaciones obtenidas.</p>

<h2>Primer punto puntuable de la práctica</h2>

<p>Para la realización de la práctica he declarado 3 clases: La clase <b>Asignatura</b> que contiene un Array de objetos de la clase <b>Alumnos</b>, que, a su vez declara en su interior otro array de la clase <b>Notas</b>.</p>

<p>A continuación inserto el código de JavaScript y los dos bloques más importantes del código en HTML:</p>


<h2>Resultado final</h2>

<script type="text/javascript">
// Definición de la clase Notas
function Notas () {
this.notas = new Array;
this.media = null;
this.asignarNota = asignarNota;
this.calcularMedia = calcularMedia;
this.imprimirNotas = imprimirNotas;
}
// Funciones de la clase Notas
// asignarNota
function asignarNota (nota){
this.notas[this.notas.length] = nota;
}
// calcularMedia
function calcularMedia (){
if (this.notas.length <= 0){
this.media = null;
}
else {
media = 0;
for (i in this.notas){
media = media+parseInt(this.notas[i]);
}
this.media = media/this.notas.length;
}
}
// imprimirMedia
function imprimirMedia (){
this.calcularMedia();
return this.media;
}
// imprimirNota
function imprimirNota (i){
return this.notas[i];
}
// imprimirNotas
function imprimirNotas (){
if (this.notas.length <= 0){
return "";
}
var nota = "";
for (i in this.notas){
n = parseInt(i)+1;
nota += "<td> Nota "+n+": <b>"+this.notas[i]+"</b></td>";
}
this.calcularMedia();
nota += "<td> Nota media: <b><i>"+this.media+"</i></b></td>";
return nota;
}

//----------------------------------------------

// Definición de la clase Alumno
function Alumno (nombre){
this.nombre = nombre;
this.notas = new Notas();
this.asignarNota = this.notas.asignarNota;
this.imprimirAlumno = imprimirAlumno;
}
// Funciones de la clase Alumno
// imprimirAlumno
function imprimirAlumno (){
var texto = "<tr>";
texto += "<td><b>"+this.nombre+":</b></td>";
texto += this.notas.imprimirNotas();
texto += "</tr>";
return texto;
}

//-----------------------------------------------

// Definición de la clase Asignatura
function Asignatura () {
this.alumnos = new Array;
this.matricularAlumno = matricularAlumno;
this.mostrarAlumno = mostrarAlumno;
this.calificaciones = calificaciones;
}
// Funciones de la clase Asignatura
// matricularAlumno
function matricularAlumno (nombre){
this.alumnos[nombre] = new Alumno(nombre);
this.mostrarAlumno(nombre);
}
// motrarAlumno
function mostrarAlumno (i) {
escribir(this.alumnos[i].imprimirAlumno());
}
// calificaciones
function calificaciones () {
texto = "";
for (i in this.alumnos) {
texto += this.alumnos[i].imprimirAlumno();
}
escribir(texto);
}

//-----------------------------------------------

function escribir (text){
document.getElementById('programa').innerHTML=text;
}

function matricular(){
nombre = document.getElementById('nombre').value;
if (nombre!=""){
aap.matricularAlumno(nombre);
}
else { alert("No puedes matricular al alumno 'Sin Nombre'"); }
}

function calificar(){
nombre = document.getElementById('nombre2').value;
if (nombre!=""){
nota = document.getElementById('nota').value;
if (nota!=""){
aap.alumnos[nombre].notas.asignarNota(nota);
aap.mostrarAlumno(nombre);
}
else { alert("No puedes puntuar al alumno "+nombre+" sin indicar los puntos que quieres darle"); }
}
else { alert("No puedes puntuar al alumno 'Sin Nombre'"); }
}

aap = new Asignatura();
</script>

Nombre del alumno: <input type="text" id="nombre">
<input type="submit" name="Matricular" value="Matricular" onClick="matricular();"><br>

Nombre del alumno: <input type="text" id="nombre2">
Nota del alumno: <input type="text" id="nota">
<input type="submit" name="Calificar" value="Asignar nota" onClick="calificar();"><br>

<input type="submit" name="Listar" value="Mostrar todos los alumnos con sus calificaciones" onClick="aap.calificaciones()">

<table id="programa" border=3>
</table>

<hr>
<address><a href="afharo@correo.ugr.es">afharo</a></address>
Última modificación: Sábado 14 de marzo a las 21:12
</body>
</html>


Esto quedaría como se puede ver en esta página.