viernes, 18 de septiembre de 2009

Script de Tuenti para GreaseMonkey

Buenas, este verano, para poder seguir cultivando mi gran vagancia, he buscado un método que me actualizase la página de Tuenti cada minuto para saber si tenía algo y así evitarme estar haciendo clic sobre Inicio una y otra vez...

Me puse manos a la obra y conseguí una chapuza que me sirve para lo que quería hacer: En Tuenti, el botón "Inicio" llama a una función porque ya sabéis que si os dirigís a alguna dirección de Tuenti en la barra del navegador, os sale el "Cargando". Pues en el script, primero compruebo si estamos en la página de "Inicio" y, si es así, llamo a esa función cada minuto. Lo de comprobar si estamos en la página de "Inicio" lo hago porque si eso estuviese activo para todas las páginas, si estás leyendo un evento o viendo una foto, visitando a un amigo o comentando en cualquiera de las tres opciones, tendríamos a una mano cojonera que estaría todo el rato dándole a "Inicio" y sacándonos de donde estábamos => ¡MALO!

Una funcionalidad que he añadido es, que cuando tienes alguna notificación y aparece la lista de notificaciones (sí, es una lista con su ul y li), la barra de título parpadea para avisar de esa notificación nueva.

No es la panacea, pero ¿para qué matar moscas a cañonazos?

Os dejo la entrada de mi blog habitual en el que la recogí de una manera un tanto menos técnica.

Os preguntaréis: ¿Por qué c*****s lo publica aquí si ya lo ha puesto en el otro? Pues hay dos respuestas aparte del mero afán por compartir y hacer que llegase a más gente:
1. En el otro no quería meter el rollo de cómo lo he implementado (aunque aquí sólo lo haya contado por encima) porque este es un blog más orientado a programación mientras que el otro lo uso para un carácter más general.

2. Si, por cualquier casual, alguien llegó a interesarse por este blog y se suscribió, que reciba la noticia y pueda disfrutar de algo que ya está hecho y no tenga que hacerlo él si se le ocurre la misma idea. Es más, si ese alguien se propone mejorarlo para que, mientras te encuentras en otras secciones, sigas teniendo las notificaciones a mano (no creo que eso tenga una gran dificultad y, como se me crucen los cables, terminaré haciéndolo cuando tenga tiempo). También pido que si mejoran funcionalidades u optimizan mi código, que me lo pasen para actualizar mi script.

Bueno, un saludo más.

lunes, 27 de julio de 2009

My.Alejandrofh.es de vacaciones

Siento decir que todos los enlaces de pruebas en vivo de las aplicaciones desarrolladas no van a funcionar a partir de ahora porque le he dado unas vacaciones al servidor que me monté en casa para poder entregar las prácticas.

Si en algún momento me entretengo en volver a subir todo a otro servidor o retomo el uso del que he tenido hasta ahora, avisaré. ¡Lo prometo!

Un saludico a todos.

viernes, 3 de julio de 2009

AAP Práctica 7

Una vez más, a práctica hecha, práctica subida al blog.

Ya es la última y he de decir que ha sido una asignatura muy interesante y creo que útil para nuestro futuro (al menos para poder crear cosas chulas para nosotros mismos :D ).

Un saludo a todos.
¡Que me voy de vacaciones!

miércoles, 10 de junio de 2009

AAP Bloque T3.6 ejercicio 1

Usar un API de SOAP público y probar a hacer diferentes llamadas sobre él.

Este ejercicio lo hice en clase y la solución la colgué en el wiki de la asignatura pero lo he puesto aquí, en el blog, para que todo esté recogido en la misma fuente.

El la API que yo encontré es para acceder a LyricWiki.org y encontrar la letra de la canción que se le indique pasándole por parámetros el artista y el título de la canción. En el enlace del wiki de la asignatura se puede ver un ejemplo de uso.

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.

lunes, 27 de abril de 2009

AAP BloqueT2.10 ejercicio1

Hacer un filtro SAX que traduzca el célebre XML casero de etiquetas en español a etiquetas en inglés. Hacerlo en Ruby o en otro lenguaje.
Para probarlo descargar estos dos archivos:
equipo.xml
bloqueT210.rb
#!/usr/bin/ruby
require 'rexml/document'
require 'rexml/streamlistener'
include REXML
entrada='./equipo.xml'


diccionario = {"equipo"=>"team",
"jugador"=>"player",
"nombre"=>"name",
"posicion"=>"position",
"numero"=>"number",
"entrenador"=>"coach",
"Portero"=>"Goalkeeper",
"Amigo del portero"=>"Friend of the goalkeeper",
"La fan de Mortadelo"=>"The fan of Mortadelo"}

class Traduce
include StreamListener
def initialize(dic)
@escribe = false
@diccionario = dic
end

def tag_start(name, attributes)
puts "<"+@diccionario[name]+">"
@escribe = true
end

def tag_end(name)
puts "</"+@diccionario[name]+">"
@escribe=false
end

def text(texto)
if @escribe
if @diccionario[texto]
puts @diccionario[texto]
else
puts texto
end
end
end
end

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

listener = Traduce.new(diccionario)
parser = Parsers::StreamParser.new(File.new(entrada), listener)
parser.parse

miércoles, 22 de abril de 2009

Una nueva plataforma de computación nube

En mis tiempos con el Mac OS X me registré en la página de VMWare y, de vez en cuando, me mandan noticias. Normalmente las borro pero hoy he encontrado algo que me ha llamado atención y me ha recordado al primer tema de esta asignatura.

Se trata del nuevo lanzamiento de esta empresa: el VMWare vSphere 4 es, según ellos lo definen, "La mejor plataforma para crear infraestructuras cloud".

Según he podido entender leyendo la documentación, esta plataforma crea un "cluster virtual" para el que han creado un sistema de ficheros (VMFS) adecuado a esta arquitectura, switches virtuales, etc.

lunes, 20 de abril de 2009

AAP BloqueT2.8 ejercicio3

Hacer un CGI que genere un RSS arbitrario. El tipo que hay que devolver es application/xml+rss.

El código del CGI es el siguiente:
#!/usr/bin/perl

use CGI qw(:standard);

print header( -type => 'application/xhtml+xml' );

print<<EOC;
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<rss version='2.0'>
<channel>
<title>ideal.es - Local</title>
<link>http://www.ideal.es</link>
<description>ideal, digital, granada, noticias, archivo, hemeroteca, buscador</description>
<language>es-ES</language>
<image></image>
<pubDate>Mon, 30 Mar 2009 11:35:03 GMT</pubDate>
<item><title><![CDATA[Granada batirá el récord de ocupación en Semana Santa]]></title>
<link>http://www.ideal.es/granada/20090330/local/granada/granada-batira-record-ocupacion-200903301301.html</link>
<description><![CDATA[Unos 100.000 visitantes garantizarán una ocupación hotelera del cien por cien el próximo Sábado Santo. La efeméride podría congregar en las calles de la capital en torno a las 200.000 personas, según estimaciones del Ayuntamiento]]></description>
<pubDate>Mon, 30 Mar 2009 11:06:17 GMT</pubDate>
<guid>http://www.ideal.es/granada/20090330/local/granada/granada-batira-record-ocupacion-200903301301.html</guid>
</item>
<item><title><![CDATA[Normalidad en la única sucursal en Granada de Caja Castilla La Mancha]]></title>
<link>http://www.ideal.es/granada/20090330/local/granada/normalidad-unica-sucursal-granada-200903301133.html</link>
<description><![CDATA[Su director afirma que varios clientes han solicitado información sobre la intervención de la entidad por parte del Banco de España]]></description>
<pubDate>Mon, 30 Mar 2009 10:37:08 GMT</pubDate>
<guid>http://www.ideal.es/granada/20090330/local/granada/normalidad-unica-sucursal-granada-200903301133.html</guid>
</item>
</channel>
</rss>
EOC



Y un ejemplo de su uso: crearRSS.cgi NO HE PODIDO SUBIRLO AL SERVIDOR. EN CUANTO PUEDA LO HAGO.

AAP BloqueT2.8 ejercicio2

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

Tengo la distribución de Ubuntu 9.04 y he instalado el servidor web Apache mediante el comando de terminal "sudo apt-get install apache2".

He copiado el archivo "creaXML.cgi" en la carpeta que Apache tiene por defecto para los CGIs, "/usr/lib/cgi-bin/" y la he probado escribiendo en el navegador la dirección "http://localhost/cgi-bin/creaXML.cgi"

AAP BloqueT2.8 ejercicio1

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

He encontrado un añadido para cualquier servidor que permita ejecutar servlets, como Apache que se llama Cocoon. Está escrito en Java.

Otra forma de servir XMLs desde un servidor es mediante los XSLT. Un ejemplo es el que ya puse en otro ejercicio y se puede ver aquí. Es un archivo XML al que se le ha aplicado este XSLT para darle el formato que se muestra.

Práctica 4

Y aquí el enlace de la práctica 4

Práctica 3

Aquí el enlace de la práctica 3

Práctica 1

Como he visto que no tengo subidas las prácticas en este blog, voy a colocar el enlace en la que están subidas.
Esta entrada es para la práctica 1 así que sólo voy a poner el enlace de esa: Éste es.

viernes, 10 de abril de 2009

AAP Bloque T2.7 ejercicio2:

Buscar una librería en cualquier lenguaje de programación que lea un feed Atom y devuelva los títulos.

He encontrado una API para usar con PHP para leer feeds Atom. Se llama Zend y en la misma página se puede ver un ejemplo de uso de para obtener el ID, título, resumen y enlace de la entrada.

Otra librería para PHP que permite leer y parsear RSS y Atom es SimplePie. En esta página podemos encontrar un ejemplo de uso.

jueves, 9 de abril de 2009

AAP Bloque T2.7 ejercicio1:

Hacer un programa que lea un feed RSS dado por el URL y presente los títulos y la fecha. Usar cualquier lenguaje de programación.
#!/usr/bin/ruby

require 'rss/1.0'
require 'rss/2.0'

documento = ARGV[0]
file = File.new(documento)
rss = RSS::Parser.parse(file, false)
rss.channel.items.each do |i|
puts "*" + i.title + " (" + i.pubDate.to_s + ")"
end

AAP Bloque T2.6 ejercicio2:

Darse de alta en un agregador online (alguno de los indicados anteriormente), o bien descargar un agregador (como Akregator), suscribirse a las publicaciones anteriores y seguirlas con suma atención.

Me he suscrito a las feeds que he mencionado en el ejercicio anterior usando el Google Reader aprovechando que ya tenía cuenta con ellos y así no tener que registrarme en las otras.

También he aprovechado y me he suscrito a los blogs de todos los de las asignaturas por si no vemos alguno en clase, aprender de ellos en mi casa.

AAP Bloque T2.6 ejercicio1:

Localizar feeds RSS de publicaciones relacionadas con la asignatura.

Buscando entre los enlaces de la práctica 1 he encontrado algunas referencias que ofrecen suscripciones RSS:

De las otras referencias que señalé en dicha práctica, la primera no ofrece suscripción RSS y las dos últimas, en caso de que se pudiese, no merecería la pena porque la primera es una página web almacenada en la memoria del ordenador y la segunda no está actualizada desde el 2002 xD.

AAP Bloque T2.5 ejercicio2:

Hacer un programa en Java, o en Python, o en PHP, o en algún otro lenguaje que haga lo mismo.
import org.w3c.dom.*;
import java.io.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;

public class bloqueT252
{
public static void main (String [] args)
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ( );
Document documento = null;

try
{
DocumentBuilder builder = factory.newDocumentBuilder();
documento = builder.parse( new File(args[0]) );
}
catch (Exception spe)
{
System.out.println("Error al leer el archivo");
}

// Obtenemos el nodo raíz del documento XML.
Node nodoRaiz = documento.getFirstChild();
NodeList listaNodos = documento.getChildNodes();
for (int i=0; i<listaNodos.getLength(); i++)
if (listaNodos.item(i).getNodeName().equals("micasa"))
nodoRaiz = listaNodos.item(i);
/* Esto hay que hacerlo porque los comentarios también cuentan como nodos */


// Obtenemos la lista de nodos hijos del nodo Raiz.
NodeList listaNodosHijo = nodoRaiz.getChildNodes();

// Hacemos un barrido por todos los nodos hijo
Node nodoHijo;
for (int i=0; i<listaNodosHijo.getLength(); i++)
{
nodoHijo = listaNodosHijo.item(i);

// Nos quedamos con los que su nombre de etiqueta es "habitacion"
if (nodoHijo.getNodeName().equals("habitacion"))
{
// Obtenemos el atributo "id" y lo mostramos por pantalla.
NamedNodeMap atributos = nodoHijo.getAttributes();
Node id = atributos.getNamedItem("id");
System.out.println("Habitacion: "+id.getNodeValue());
}
}
}
}

El código se puede descargar de aquí

miércoles, 1 de abril de 2009

AAP Bloque T2.5 ejercicio1:

Modificar alguno de los programas para que imprima las habitaciones, en vez de los muebles.
#!/usr/bin/ruby

require 'rexml/document'
include REXML
documento = ARGV[0]
file = File.new(documento)
doc = Document.new(file)
doc.root.each_element('habitacion') { |h|
puts 'Habitacion: ' + h.attribute('id').to_s
}

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.

martes, 17 de febrero de 2009

Inauguración

Con esta entrada queda inaugurado el blog que voy a utilizar para la asignatura Arquitecturas de Altas Prestaciones.