tag:blogger.com,1999:blog-80324098383356643982024-03-14T07:13:32.606+01:00Arquitecturas de Altas Prestaciones<i>Blog destinado a resolver los ejercicios para la asignatura</i> <b><a href="http://geneura.ugr.es/~jmerelo/asignaturas/AAP/">Arquitecturas de Altas Prestaciones</a></b> <i>de los estudios de</i> <b>Ingeniería en Telecomunicación</b> <i>de la</i> <b><a href="http://www.ugr.es/">Universidad de Granada</a></b>.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.comBlogger37125tag:blogger.com,1999:blog-8032409838335664398.post-26956475034520355112010-10-03T14:46:00.004+02:002010-10-03T14:52:13.613+02:00Galería de fotos de PicasaAquí está el código que he utilizado para poder insertar una galería de fotos pública de Picasa en una web. Se puede mejorar en cuanto al formato de presentación de las fotos, y la función de llamada para mostrar las mismas (que no incluyo porque es solamente añadir una etiqueta <img> con la imagen que se pasa por parámetro).<br />
<br />
Intenté hacerla con la librería de Perl XML::RSS pero era imposible ya que no era capaz de acceder a las etiquetas de las fotos.<br />
<br />
Por otro lado, algo que quizá se pueda entender poco del código, es en la formación de la variable $imagen. Mirando el código XML del RSS del álbum de Picasa se puede ver que existen unas versiones en miniatura de las imágenes en la dirección "Carpeta_de_la_foto/s144/Nombre_de_la_foto" donde también están las carpetas "s72" y "s288" dependiendo de la altura de dicha miniatura.<br />
<br />
Si quieres saber qué me ha llevado a hacerla, lee <a href="http://blog.alejandrofh.es/2010/10/galeria-de-fotos-de-picasa.html">la entrada sobre lo mismo de mi otro blog</a>.<br />
<pre class="hl">#!/usr/bin/perl
use CGI qw(:standard);
use XML::Simple;
use LWP::Simple qw(get);
my $direccion = <span class="str">"Dirección web del RSS del álbum de picasa"</span>;
#Baja fichero
my $rdf = get($direccion);
my $xml = XML::Simple->new();
my $doc = $xml->XMLin($rdf);
my $numero_elementos = $doc->{channel}->{'openSearch:totalResults'};
my $salida = '<span class="kwa"><body style=</span><span class="str">"text-align:justify;"</span><span class="kwa">></span> ';
print header( -type => 'text/html', -charset => 'iso-<span class="num">8859</span>-<span class="num">1</span>' );
for (my $i = <span class="num">0</span>; $i <span class="kwa">< $numero_elementos; $i++){</span>
my $dir = $doc->{channel}->{item}[$i]->{enclosure}->{url};
my @ruta = split('/',$dir);
my $imagen = substr($dir,<span class="num">0</span>,index($dir,$ruta[-<span class="num">1</span>]));
$imagen .= 's144/'.$ruta[-<span class="num">1</span>];
$salida .= '<span class="kwa"><a href=</span><span class="str">"javascript:parent.mostrarFoto( \''.$dir.'\' )"</span><span class="kwa"> style=</span><span class="str">"text-decoration:none;"</span><span class="kwa">></span><span class="kwa"><img height=</span><span class="num">70</span><span class="kwa">px src=</span><span class="str">"'.$imagen.'"</span><span class="kwa"> /></span><span class="kwa"></a></span> ';
}
$salida = $salida.'<span class="kwa"></body></span>';
print $salida;
</pre>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-13444969331127349642009-09-18T11:42:00.002+02:002009-09-18T12:07:40.930+02:00Script de Tuenti para GreaseMonkeyBuenas, 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...<br /><br />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 <i>mano cojonera</i> que estaría todo el rato dándole a "Inicio" y sacándonos de donde estábamos => ¡MALO!<br /><br />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.<br /><br />No es la panacea, pero ¿para qué matar moscas a cañonazos?<br /><br />Os dejo la <a href="http://blog.alejandrofh.es/2009/08/no-pulses-mas-el-boton-inicio.html">entrada de mi blog habitual</a> en el que la recogí de una manera un tanto menos técnica.<br /><br />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:<br />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.<br /><br />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.<br /><br />Bueno, un saludo más.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-32833745621137407332009-07-27T14:11:00.002+02:002009-07-27T14:14:45.141+02:00My.Alejandrofh.es de vacacionesSiento 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.<br /><br />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!<br /><br />Un saludico a todos.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-53705463900908792822009-07-03T21:00:00.002+02:002009-07-03T21:06:54.490+02:00AAP Práctica 7Una vez más, a práctica hecha, <a href="http://my.alejandrofh.es/aap/p7/">práctica</a> subida al blog.<br /><br />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 ).<br /><br />Un saludo a todos.<br />¡Que me voy de vacaciones!Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-23112960503749931292009-06-10T18:35:00.002+02:002009-06-10T18:46:24.359+02:00AAP Bloque T3.6 ejercicio 1<b>Usar un API de SOAP público y probar a hacer diferentes llamadas sobre él.</b><br /><br />Este ejercicio lo hice en clase y la solución la colgué en el wiki de la asignatura pero lo he puesto <a href="http://aap-ugr-2007.wikispaces.com/Prueba+de+SOAP+en+LyricWiki">aquí</a>, en el blog, para que todo esté recogido en la misma fuente.<br /><br />El la API que yo encontré es para acceder a <a href="http://www.lyricwiki.org/">LyricWiki.org</a> 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.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-72567452826199274982009-05-29T10:06:00.004+02:002009-05-29T10:24:09.012+02:00AAP Práctica 6Esta práctica consistía en hacer una aplicación en AJAX. Yo he creado un servicio para alojar agendas de contactos: <a href="http://my.alejandrofh.es/aap/p6/">http://my.alejandrofh.es/aap/p6/</a> y aquí la <a href="http://my.alejandrofh.es/aap/p6/entrega/">entrega con el código</a>.<br /><br />Mi primer intento se quedó en un <a href="http://my.alejandrofh.es/aap/p6-old/wiki.user.js">script de GreaseMonkey</a> que actualiza dinámicamente el contenido de nuestro <a href="http://aap-ugr-2007.wikispaces.com/">Wiki</a> pero no había aplicación de servidor así que no me valía.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-31912660213551466942009-05-08T12:17:00.004+02:002009-05-08T12:42:41.380+02:00AAP Práctica 5En é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. <br />Antes de entrar en la explicación de cómo lo he implementado, dejo el enlace para que se pueda ver <a href="http://mac-afharo.no-ip.org/aap/p5/">el resultado final</a>.<br /><br />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:<br /><pre class="hl"><span class="slc">#!/usr/bin/perl</span><br /><br /><span class="kwa">use</span> CGI <span class="kwd">qw</span><span class="sym">(:</span>standard<span class="sym">);</span><br /><span class="kwa">use</span> XML<span class="sym">::</span>RSS<span class="sym">;</span><br /><span class="kwa">use</span> LWP<span class="sym">::</span>Simple <span class="kwd">qw</span><span class="sym">(</span>get<span class="sym">);</span><br /><br /><span class="kwc">my</span> <span class="kwb">$numero_elementos</span> <span class="sym">=</span> <span class="kwd">param</span><span class="sym">(</span><span class="str">'num_elementos'</span><span class="sym">);</span><br /><span class="kwc">my</span> <span class="kwb">$url</span> <span class="sym">=</span> <span class="kwd">param</span><span class="sym">(</span><span class="str">'url'</span><span class="sym">);</span><br /><br /><span class="slc">#Baja fichero</span><br /><span class="kwa">if</span> <span class="sym">(!</span><span class="kwd">defined</span><span class="sym">(</span><span class="kwb">$url</span><span class="sym">)){</span><br /> print <span class="kwd">header</span><span class="sym">( -</span>type <span class="sym">=></span> <span class="str">'text/html'</span> <span class="sym">);</span><br /> print <span class="str">'<body style="text-align:center; vertical-align:center">'</span>.<br /> <span class="str">'<h1>Bienvenido al lector RSS</h1>'</span>.<br /> <span class="str">'<p>Elige de la izquierda las noticias que quieres leer.</p>'</span>.<br /> <span class="str">'</body>'</span><span class="sym">;</span><br /><span class="sym">}</span><br /><span class="kwa">else</span><span class="sym">{</span><br /> <span class="kwa">if</span> <span class="sym">(!</span><span class="kwd">defined</span><span class="sym">(</span><span class="kwb">$numero_elementos</span><span class="sym">)) {</span> <span class="kwb">$numero_elementos</span> <span class="sym">=</span> <span class="num">7</span><span class="sym">; }</span><br /> <span class="kwc">my</span> <span class="kwb">$rdf</span> <span class="sym">=</span> <span class="kwd">get</span><span class="sym">(</span><span class="kwb">$url</span><span class="sym">);</span><br /> <span class="kwc">my</span> <span class="kwb">$rss</span> <span class="sym">=</span> new XML<span class="sym">::</span>RSS<span class="sym">;</span><br /> <span class="kwb">$rss</span><span class="sym">-></span><span class="kwd">parse</span><span class="sym">(</span><span class="kwb">$rdf</span><span class="sym">);</span><br /> <span class="kwc">my</span> <span class="kwb">$salida</span> <span class="sym">=</span> <span class="str">'<body>'</span>.<br /> <span class="str">'<h1><a href="'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'channel'</span><span class="sym">}->{</span><span class="str">'link'</span><span class="sym">}</span>.<span class="str">'" target="_blank">'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'channel'</span><span class="sym">}->{</span><span class="str">'title'</span><span class="sym">}</span>.<span class="str">'</a></h1>'</span>.<br /> <span class="str">'<p>'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'channel'</span><span class="sym">}->{</span><span class="str">'description'</span><span class="sym">}</span>.<span class="str">'</p>'</span><span class="sym">;</span><br /> print <span class="kwd">header</span><span class="sym">( -</span>type <span class="sym">=></span> <span class="str">'text/html'</span> <span class="sym">);</span><br /><br /> <span class="kwa">for</span> <span class="sym">(</span><span class="kwc">my</span> <span class="kwb">$i</span> <span class="sym">=</span> <span class="num">0</span><span class="sym">;</span> <span class="kwb">$i</span> <span class="sym"><</span> <span class="kwb">$numero_elementos</span><span class="sym">;</span><span class="kwb">$i</span> <span class="sym">++ ) {</span><br /> <span class="kwb">$salida</span> <span class="sym">=</span> <span class="kwb">$salida</span>.<br /> <span class="str">'<div style="border:dotted; background-color:lightblue ">'</span>.<br /> <span class="str">'<h2><a href="'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'items'</span><span class="sym">}[</span><span class="kwb">$i</span><span class="sym">]->{</span><span class="str">'link'</span><span class="sym">}</span>.<span class="str">'" target="_blank">'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'items'</span><span class="sym">}[</span><span class="kwb">$i</span><span class="sym">]->{</span><span class="str">'title'</span><span class="sym">}</span>.<span class="str">'</a></h2>'</span>.<br /> <span class="str">'<h4>'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'items'</span><span class="sym">}[</span><span class="kwb">$i</span><span class="sym">]->{</span><span class="str">'pubDate'</span><span class="sym">}</span>.<span class="str">'</h4>'</span>.<br /> <span class="str">'<p>'</span>.<span class="kwb">$rss</span><span class="sym">->{</span><span class="str">'items'</span><span class="sym">}[</span><span class="kwb">$i</span><span class="sym">]->{</span><span class="str">'description'</span><span class="sym">}</span>.<span class="str">'</p>'</span>.<br /> <span class="str">'</div>'</span><span class="sym">;</span><br /> <span class="sym">}</span><br /> <span class="kwb">$salida</span> <span class="sym">=</span> <span class="kwb">$salida</span>.<span class="str">'</body>'</span><span class="sym">;</span><br /> print <span class="kwb">$salida</span><span class="sym">;</span><br /><span class="sym">}</span><br /></pre><br /><br />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 <a href="http://mac-afharo.no-ip.org/aap/p5/datos/enlaces.xml">enlaces.xml</a>. Además, creé otro CGI en perl que modificara el archivo con el fin de ampliar la lista de fuentes RSS.<br /><br />Por último diseñé la interfaz gráfica en HTML y Javascript haciendo mis primeros <i>pinitos</i> con AJAX y jQuery.<br /><br />Todos los archivos necesarios para la práctica están <a href="http://mac-afharo.no-ip.org/aap/p5/lectorRSS.tar.gz">aquí</a>.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-68988321168764559282009-05-05T13:27:00.004+02:002009-05-05T13:45:38.478+02:00AAP BloqueT2.12 ejercicio2<b>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)</b><br />El documento XML que he usado para definir la clasificación es el siguiente: <a href="http://mac-afharo.no-ip.org/aap/xml/clasificacion.xml">clasificacion.xml</a><br /><pre class="hl"><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding=</span><span class="str">"UTF-8"</span><span class="kwa">?></span><br /><span class="kwa"><clasificacion></span><br /> <span class="kwa"><equipo name=</span><span class="str">"FC Barcelona"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">1</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Betis"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">10</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Real Madrid"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">2</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Murcia"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">8</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Granada"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">4</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Valencia"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">3</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /> <span class="kwa"><equipo name=</span><span class="str">"Sevilla"</span><span class="kwa">></span><br /> <span class="kwa"><posicion></span><span class="num">5</span><span class="kwa"></posicion></span><br /> <span class="kwa"></equipo></span><br /><span class="kwa"></clasificacion></span><br /></pre><br /><br />El programa en Ruby en el que he usado XPath para encontrar los 4 primeros es como sigue: <a href="http://mac-afharo.no-ip.org/aap/xml/clasificacion.rb">clasificacion.rb</a><br /><pre class="hl"><span class="slc">#!/usr/bin/ruby</span><br /><br />require <span class="str">'rexml/document'</span><br />include REXML<br />documento = <span class="str">'clasificacion.xml'</span><br />file = File<span class="sym">.</span><span class="kwd">new</span><span class="sym">(</span>documento)<br />doc = Document<span class="sym">.</span><span class="kwd">new</span><span class="sym">(</span>file)<br />XPath<span class="sym">.</span><span class="kwd">each</span><span class="sym">(</span>doc<span class="sym">,</span><span class="str">"//equipo[posicion<=4]/@name"</span>) <span class="sym">{ |</span>equipo<span class="sym">|</span><br /> puts <span class="str">"*"</span><span class="sym">+</span>equipo<span class="sym">.</span>value<br /><span class="sym">}</span><br /></pre><br /><br />Al ejecutarlo en la terminal nos queda:<br /><blockquote>afharo@ajelandroHP:~/AAP/Clase 18/bloqueT212ej2$ ./clasificacion.rb <br />*FC Barcelona<br />*Real Madrid<br />*Granada<br />*Valencia</blockquote>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-31465244692781056282009-05-05T13:16:00.006+02:002009-05-05T13:36:13.211+02:00AAP BloqueT2.12 ejercicio1<b>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.</b><br />Primero hay que definir el archivo que vamos a analizar: <a href="http://mac-afharo.no-ip.org/aap/xml/muebles.xml">muebles.xml</a><br /><br /><pre class="hl"><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding='iso-</span><span class="num">8859</span><span class="kwa">-</span><span class="num">1</span><span class="kwa">' ?></span><br /><span class="kwa"><micasa></span><br /> <span class="kwa"><habitacion id='comedor'></span><br /> <span class="kwa"><mueble></span>aparador<span class="kwa"></mueble></span><br /> <span class="kwa"><mueble></span>sofá<span class="kwa"></mueble></span><br /> <span class="kwa"><puerta a='balcón' /></span><br /> <span class="kwa"></habitacion></span><br /> <span class="kwa"><habitacion id='cocina'></span><br /> <span class="kwa"><mueble></span>encimera<span class="kwa"></mueble></span><br /> <span class="kwa"><mueble></span>horno<span class="kwa"></mueble></span><br /> <span class="kwa"><puerta a='comedor' /></span><br /> <span class="kwa"></habitacion></span><br /> <span class="kwa"><habitacion id='baño'></span><br /> <span class="kwa"><mueble></span>espejo<span class="kwa"></mueble></span><br /> <span class="kwa"><mueble></span>estantería<span class="kwa"></mueble></span><br /> <span class="kwa"><puerta a='comedor' /></span><br /> <span class="kwa"></habitacion></span><br /><span class="kwa"></micasa></span><br /></pre><br /><br />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: <a href="http://mac-afharo.no-ip.org/aap/xml/muebles.rb">muebles.rb</a><br /><br /><pre class="hl">#!/usr/bin/ruby<br /><br />require 'rexml/document'<br />include REXML<br />destino = ARGV[<span class="num">0</span>]<br />documento = 'muebles.xml'<br />file = File.new(documento)<br />doc = Document.new(file)<br />XPath.each(doc,<span class="str">"//habitacion[puerta[@a='"</span>+destino+<span class="str">"']]/@id"</span>) { |habitacion|<br /> puts <span class="str">"*"</span>+habitacion.value<br />}<br /></pre><br /><br />Por último, si ejecutamos en la terminal el comando <i>./muebles.rb comedor</i> nos devuelve lo siguiente:<br /><blockquote>afharo@ajelandroHP:~/AAP/Clase 18/bloqueT212ej1$ ./muebles.rb comedor<br />*cocina<br />*baño</blockquote>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-43282379836627855342009-05-05T00:59:00.004+02:002009-05-05T01:33:31.547+02:00AAP BloqueT2.11 ejercicio1<b>Realizar una quiniela AJAX, que al modificar el resultado de un partido, lo almacene en el servidor</b><br />Para realizar este ejercicio son necesarios tres ficheros:<br /><ul><li>El archivo XML donde se van a almacenar las quinielas: <a href="http://mac-afharo.no-ip.org/aap/ajax/datos/quiniela.xml">quiniela.xml</a></li><br /><li>El CGI que se encarga de realizar las modificaciones: <a href="http://mac-afharo.no-ip.org/cgi-bin/quiniela.cgi">quiniela.cgi</a></li><br /><li>La página HTML desde la que accedemos a los archivos anteriores mediante peticiones AJAX: <a href="http://mac-afharo.no-ip.org/aap/ajax/quiniela.html">quiniela.html</a></li></ul><br /><br />Para probar el sistema completo, hay que pinchar sobre el último enlace.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-84206798405479463692009-04-27T12:42:00.001+02:002009-05-12T10:55:24.884+02:00AAP BloqueT2.10 ejercicio1<b>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.</b><br />Para probarlo descargar estos dos archivos:<br /><a href="http://alejandrofh.es/aap/xml/equipo.xml">equipo.xml</a><br /><a href="http://alejandrofh.es/aap/xml/bloqueT210.rb">bloqueT210.rb</a><br /><pre class="hl">#!/usr/bin/ruby<br />require 'rexml/document'<br />require 'rexml/streamlistener'<br />include REXML<br />entrada='./equipo.xml'<br /><br /><br />diccionario = {<span class="str">"equipo"</span>=><span class="str">"team"</span>,<br /> <span class="str">"jugador"</span>=><span class="str">"player"</span>,<br /> <span class="str">"nombre"</span>=><span class="str">"name"</span>,<br /> <span class="str">"posicion"</span>=><span class="str">"position"</span>,<br /> <span class="str">"numero"</span>=><span class="str">"number"</span>,<br /> <span class="str">"entrenador"</span>=><span class="str">"coach"</span>,<br /> <span class="str">"Portero"</span>=><span class="str">"Goalkeeper"</span>,<br /> <span class="str">"Amigo del portero"</span>=><span class="str">"Friend of the goalkeeper"</span>,<br /> <span class="str">"La fan de Mortadelo"</span>=><span class="str">"The fan of Mortadelo"</span>}<br /><br />class Traduce<br /> include StreamListener<br /> def initialize(dic)<br /> @escribe = false<br /> @diccionario = dic<br /> end<br /><br /> def tag_start(name, attributes)<br /> puts <span class="str">"<"</span>+@diccionario[name]+<span class="str">">"</span><br /> @escribe = true<br /> end<br /><br /> def tag_end(name)<br /> puts <span class="str">"</"</span>+@diccionario[name]+<span class="str">">"</span><br /> @escribe=false<br /> end<br /><br /> def text(texto)<br /> if @escribe<br /> if @diccionario[texto]<br /> puts @diccionario[texto]<br /> else<br /> puts texto<br /> end<br /> end<br /> end<br />end<br /><br />print <span class="str">"Content-Type: application/xhtml+xml\n\n"</span><br /><br />listener = Traduce.new(diccionario)<br />parser = Parsers::StreamParser.new(File.new(entrada), listener)<br />parser.parse<br /></pre>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-5207312552812004222009-04-22T20:37:00.003+02:002009-04-22T20:56:07.451+02:00Una nueva plataforma de computación nubeEn mis tiempos con el Mac OS X me registré en la página de <a href="http://vmware.com/">VMWare</a> 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.<br /><br />Se trata del nuevo lanzamiento de esta empresa: el <a href="http://info.vmware.com/content/EMEA_6454_ES?src=EM_09Q2_VMW_OTHER_VSPHERE-ANNOUNCE-PRS&ossrc=EM_09Q2_VMW_OTHER_VSPHERE-ANNOUNCE-PRS">VMWare vSphere 4</a> es, según ellos lo definen, "La mejor plataforma para crear infraestructuras cloud".<br /><br />Según he podido entender leyendo la <a href="http://www.vmware.com/files/pdf/vsphere_enterprise_datasheet.pdf">documentación</a>, esta plataforma crea un "cluster virtual" para el que han creado un sistema de ficheros (VMFS) adecuado a esta arquitectura, <i>switches</i> virtuales, etc.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-83358814520635801912009-04-20T17:06:00.004+02:002009-04-24T10:45:24.773+02:00AAP BloqueT2.8 ejercicio3<b>Hacer un CGI que genere un RSS arbitrario. El tipo que hay que devolver es application/xml+rss.</b><br /><br />El código del CGI es el siguiente:<br /><pre class="hl">#!/usr/bin/perl<br /><br />use CGI qw(:standard);<br /><br />print header( -type => 'application/xhtml+xml' );<br /><br />print<span class="kwa"><<EOC;</span><br /><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding=</span><span class="str">"iso-8859-1"</span><span class="kwa"> standalone=</span><span class="str">"yes"</span><span class="kwa">?></span><br /><span class="kwa"><rss version='</span><span class="num">2.0</span><span class="kwa">'></span><br /><span class="kwa"><channel></span><br /><span class="kwa"><title></span>ideal.es - Local<span class="kwa"></title></span><br /><span class="kwa"><link></span>http://www.ideal.es<span class="kwa"></link></span><br /><span class="kwa"><description></span>ideal, digital, granada, noticias, archivo, hemeroteca, buscador<span class="kwa"></description></span><br /><span class="kwa"><language></span>es-ES<span class="kwa"></language></span><br /><span class="kwa"><image></span><span class="kwa"></image></span><br /><span class="kwa"><pubDate></span>Mon, <span class="num">30</span> Mar <span class="num">2009 11</span>:<span class="num">35</span>:<span class="num">03</span> GMT<span class="kwa"></pubDate></span><br /><span class="kwa"><item></span><span class="kwa"><title></span><span class="kwa"><![CDATA[Granada batirá el récord de ocupación en Semana Santa]]></span><span class="kwa"></title></span><br /><span class="kwa"><link></span>http://www.ideal.es/granada/<span class="num">20090330</span>/local/granada/granada-batira-record-ocupacion-<span class="num">200903301301</span>.html<span class="kwa"></link></span><br /><span class="kwa"><description></span><span class="kwa"><![CDATA[Unos</span> <span class="num">100.000</span> <span class="kwa">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</span> <span class="num">200.000</span> <span class="kwa">personas, según estimaciones del Ayuntamiento]]></span><span class="kwa"></description></span><br /><span class="kwa"><pubDate></span>Mon, <span class="num">30</span> Mar <span class="num">2009 11</span>:<span class="num">06</span>:<span class="num">17</span> GMT<span class="kwa"></pubDate></span><br /><span class="kwa"><guid></span>http://www.ideal.es/granada/<span class="num">20090330</span>/local/granada/granada-batira-record-ocupacion-<span class="num">200903301301</span>.html<span class="kwa"></guid></span><br /><span class="kwa"></item></span><br /><span class="kwa"><item></span><span class="kwa"><title></span><span class="kwa"><![CDATA[Normalidad en la única sucursal en Granada de Caja Castilla La Mancha]]></span><span class="kwa"></title></span><br /><span class="kwa"><link></span>http://www.ideal.es/granada/<span class="num">20090330</span>/local/granada/normalidad-unica-sucursal-granada-<span class="num">200903301133</span>.html<span class="kwa"></link></span><br /><span class="kwa"><description></span><span class="kwa"><![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]]></span><span class="kwa"></description></span><br /><span class="kwa"><pubDate></span>Mon, <span class="num">30</span> Mar <span class="num">2009 10</span>:<span class="num">37</span>:<span class="num">08</span> GMT<span class="kwa"></pubDate></span><br /><span class="kwa"><guid></span>http://www.ideal.es/granada/<span class="num">20090330</span>/local/granada/normalidad-unica-sucursal-granada-<span class="num">200903301133</span>.html<span class="kwa"></guid></span><br /><span class="kwa"></item></span><br /><span class="kwa"></channel></span><br /><span class="kwa"></rss></span><br />EOC<br /><br /></pre><br /><br />Y un ejemplo de su uso: crearRSS.cgi NO HE PODIDO SUBIRLO AL SERVIDOR. EN CUANTO PUEDA LO HAGO.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-4102297953198095362009-04-20T16:22:00.002+02:002009-04-20T16:57:38.442+02:00AAP BloqueT2.8 ejercicio2<b>Instalar un servidor web en el ordenador, y probar el programa anterior.</b><br /><br />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".<br /><br />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"Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-79088675599105468202009-04-20T14:50:00.003+02:002009-04-20T17:06:11.496+02:00AAP BloqueT2.8 ejercicio1<b>Buscar formas alternativas de servir XML a través de un servidor web.</b><br /><br />He encontrado un añadido para cualquier servidor que permita ejecutar servlets, como Apache que se llama <a href="http://cocoon.apache.org/">Cocoon</a>. Está escrito en Java.<br /><br />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 <a href="http://alejandrofh.es/aap/xml/descargas.xml">aquí</a>. Es un archivo XML al que se le ha aplicado <a href="http://alejandrofh.es/aap/xml/descargas.xsl">este</a> XSLT para darle el formato que se muestra.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-84223367318106690002009-04-20T14:44:00.000+02:002009-04-20T14:45:26.950+02:00Práctica 4Y <a href="http://alejandrofh.es/aap/p4/">aquí</a> el enlace de la práctica 4Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-11593884792830040812009-04-20T14:43:00.000+02:002009-04-20T14:44:09.272+02:00Práctica 3<a href="http://alejandrofh.es/aap/p3/">Aquí</a> el enlace de la práctica 3Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-68571181790862762612009-04-20T14:41:00.003+02:002009-04-20T14:43:08.992+02:00Práctica 1Como he visto que no tengo subidas las prácticas en este blog, voy a colocar el enlace en la que están subidas.<br />Esta entrada es para la práctica 1 así que sólo voy a poner el enlace de esa: <a href="http://alejandrofh.es/aap/p1/">Éste</a> es.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-31221319152301342742009-04-10T11:40:00.004+02:002009-04-10T11:51:22.007+02:00AAP Bloque T2.7 ejercicio2:<b>Buscar una librería en cualquier lenguaje de programación que lea un feed Atom y devuelva los títulos.</b><br /><br />He encontrado una API para usar con PHP para leer feeds Atom. Se llama <a href="http://code.google.com/p/eltiempo-api/wiki/EjemplosPHP">Zend</a> 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.<br /><br />Otra librería para PHP que permite leer y parsear RSS y Atom es <a href="http://simplepie.org/">SimplePie</a>. En <a href="http://blog.unijimpe.net/simplepie-parser-rss-o-atom/">esta</a> página podemos encontrar un ejemplo de uso.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-57043391371779648792009-04-09T16:04:00.001+02:002009-04-09T16:07:17.342+02:00AAP Bloque T2.7 ejercicio1:<b>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.</b><br /><pre class="hl">#!/usr/bin/ruby<br /><br />require 'rss/<span class="num">1.0</span>'<br />require 'rss/<span class="num">2.0</span>'<br /><br />documento = ARGV[<span class="num">0</span>]<br />file = File.new(documento)<br />rss = RSS::Parser.parse(file, false)<br />rss.channel.items.each do |i|<br /> puts <span class="str">"*"</span> + i.title + <span class="str">" ("</span> + i.pubDate.to_s + <span class="str">")"</span><br />end<br /><br /></pre>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-55036359092115305042009-04-09T14:54:00.003+02:002009-04-10T19:02:17.069+02:00AAP Bloque T2.6 ejercicio2:<b>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.</b><br /><br />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.<br /><br />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.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-49181234041562552362009-04-09T14:18:00.003+02:002009-04-09T14:58:47.605+02:00AAP Bloque T2.6 ejercicio1:<b>Localizar feeds RSS de publicaciones relacionadas con la asignatura.</b><br /><br />Buscando entre los enlaces de la <a href="http://alejandrofh.es/aap/p1/">práctica 1</a> he encontrado algunas referencias que ofrecen suscripciones RSS:<br /><ul><br /><li><a href="http://www.programacionweb.net/rss/articulos.php">Artículos destacados</a> de <a href="http://www.programacionweb.net/">Programacion Web.net</a></li><br /><li><a href="http://www.programacionweb.net/rss/articulos-pendientes.php">Artículos pendientes</a> de <a href="http://www.programacionweb.net/">la misma web</a></li><br /><li><a href="http://www.forosdelweb.com/external.php?type=RSS2">RSS</a> de <a href="http://www.forosdelweb.com/">Foros del Web</a></li></ul><br />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 <a href="file:///usr/share/doc/rubybook/html/index.html">primera</a> es una página web almacenada en la memoria del ordenador y la <a href="http://geneura.ugr.es/~jmerelo/tutoperl/">segunda</a> no está actualizada desde el 2002 xD.Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-85278940937619482882009-04-09T14:06:00.003+02:002009-04-09T16:08:39.693+02:00AAP Bloque T2.5 ejercicio2:<b>Hacer un programa en Java, o en Python, o en PHP, o en algún otro lenguaje que haga lo mismo.</b><br /><pre class="hl">import org.w3c.dom.*;<br />import java.io.*;<br />import javax.xml.parsers.DocumentBuilderFactory;<br />import javax.xml.parsers.DocumentBuilder;<br /><br />public class bloqueT252<br />{<br /> public static void main (String [] args)<br /> {<br /> DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ( );<br /> Document documento = null;<br /><br /> try<br /> {<br /> DocumentBuilder builder = factory.newDocumentBuilder();<br /> documento = builder.parse( new File(args[<span class="num">0</span>]) );<br /> }<br /> catch (Exception spe)<br /> {<br /> System.out.println(<span class="str">"Error al leer el archivo"</span>);<br /> }<br /><br /> // Obtenemos el nodo raíz del documento XML.<br /> Node nodoRaiz = documento.getFirstChild();<br /> NodeList listaNodos = documento.getChildNodes();<br /> for (int i=<span class="num">0</span>; i<span class="kwa"><listaNodos.getLength(); i++)</span><br /> if (listaNodos.item(i).getNodeName().equals(<span class="str">"micasa"</span>))<br /> nodoRaiz = listaNodos.item(i);<br /> /* Esto hay que hacerlo porque los comentarios también cuentan como nodos */<br /><br /><br /> // Obtenemos la lista de nodos hijos del nodo Raiz.<br /> NodeList listaNodosHijo = nodoRaiz.getChildNodes();<br /><br /> // Hacemos un barrido por todos los nodos hijo<br /> Node nodoHijo;<br /> for (int i=<span class="num">0</span>; i<span class="kwa"><listaNodosHijo.getLength(); i++)</span><br /> {<br /> nodoHijo = listaNodosHijo.item(i);<br /><br /> // Nos quedamos con los que su nombre de etiqueta es <span class="str">"habitacion"</span><br /> if (nodoHijo.getNodeName().equals(<span class="str">"habitacion"</span>))<br /> {<br /> // Obtenemos el atributo <span class="str">"id"</span> y lo mostramos por pantalla.<br /> NamedNodeMap atributos = nodoHijo.getAttributes();<br /> Node id = atributos.getNamedItem(<span class="str">"id"</span>);<br /> System.out.println(<span class="str">"Habitacion: "</span>+id.getNodeValue());<br /> }<br /> }<br /> }<br />}<br /></pre><br />El código se puede descargar de <a href="http://alejandrofh.es/aap/xml/bloqueT252.java">aquí</a>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com0tag:blogger.com,1999:blog-8032409838335664398.post-25994126953298979012009-04-01T09:43:00.002+02:002009-04-01T09:52:24.658+02:00AAP Bloque T2.5 ejercicio1:<b>Modificar alguno de los programas para que imprima las habitaciones, en vez de los muebles.</b><br /><pre class="hl">#!/usr/bin/ruby<br /><br />require 'rexml/document'<br />include REXML<br />documento = ARGV[<span class="num">0</span>]<br />file = File.new(documento)<br />doc = Document.new(file)<br />doc.root.each_element('habitacion') { |h|<br /> puts 'Habitacion: ' + h.attribute('id').to_s<br />}<br /></pre>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com1tag:blogger.com,1999:blog-8032409838335664398.post-55764978232967170122009-03-27T11:41:00.004+01:002009-04-01T09:51:56.500+02:00AAP Bloque T2.4 ejercicio1:<b>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.</b><br /><br />El XSD es el siguiente:<br /><pre class="hl"><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding=</span><span class="str">"UTF-8"</span><span class="kwa">?></span><br /><span class="kwa"><schema xmlns='http://www.w3.org/</span><span class="num">2001</span><span class="kwa">/XMLSchema'></span><br /><br /> <span class="kwa"><element name='quiniela'></span><br /> <span class="kwa"><complexType></span><br /> <span class="kwa"><sequence></span><br /> <span class="kwa"><element name='partido' minOccurs='</span><span class="num">1</span><span class="kwa">' maxOccurs='</span><span class="num">15</span><span class="kwa">' ></span><br /> <span class="kwa"><complexType></span><br /> <span class="kwa"><sequence></span><br /> <span class="kwa"><element name='equipo' type='string' minOccurs='</span><span class="num">2</span><span class="kwa">' maxOccurs='</span><span class="num">2</span><span class="kwa">'/></span><br /> <span class="kwa"><element name='resultado' type='string' minOccurs='</span><span class="num">1</span><span class="kwa">'/></span><br /> <span class="kwa"></sequence></span><br /> <span class="kwa"></complexType></span><br /> <span class="kwa"></element></span><br /> <span class="kwa"></sequence></span><br /> <span class="kwa"></complexType></span><br /> <span class="kwa"></element></span><br /><br /><span class="kwa"></schema></span><br /></pre><br /><br />El XML que quiero validar es:<br /><pre class="hl"><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding=</span><span class="str">"UTF-8"</span><span class="kwa">?></span><br /><span class="kwa"><quiniela></span><br /> <span class="kwa"><partido></span><br /> <span class="kwa"><equipo></span>Madrid<span class="kwa"></equipo></span><br /> <span class="kwa"><equipo></span>Betis<span class="kwa"></equipo></span><br /> <span class="kwa"><resultado></span><span class="num">1</span><span class="kwa"></resultado></span><br /> <span class="kwa"></partido></span><br /> <span class="kwa"><partido></span><br /> <span class="kwa"><equipo></span>Atletico de Madrid<span class="kwa"></equipo></span><br /> <span class="kwa"><equipo></span>Olula CF<span class="kwa"></equipo></span><br /> <span class="kwa"><resultado></span><span class="num">2</span><span class="kwa"></resultado></span><br /> <span class="kwa"></partido></span><br /><span class="kwa"></quiniela></span><br /></pre><br /><br />Probamos a validarlo y el XMLLint nos devuelve:<br /><pre class="hl">cvi0243:Clase <span class="num">11</span> afharo$ xmllint --schema bloqueT2.4<span class="num">.1</span>.xsd bloqueT2.4<span class="num">.1</span>.xml<br /><span class="kwa"><?xml version=</span><span class="str">"1.0"</span><span class="kwa"> encoding=</span><span class="str">"UTF-8"</span><span class="kwa">?></span><br /><span class="kwa"><quiniela></span><br /> <span class="kwa"><partido></span><br /> <span class="kwa"><equipo></span>Madrid<span class="kwa"></equipo></span><br /> <span class="kwa"><equipo></span>Betis<span class="kwa"></equipo></span><br /> <span class="kwa"><resultado></span><span class="num">1</span><span class="kwa"></resultado></span><br /> <span class="kwa"></partido></span><br /> <span class="kwa"><partido></span><br /> <span class="kwa"><equipo></span>Atletico de Madrid<span class="kwa"></equipo></span><br /> <span class="kwa"><equipo></span>Olula CF<span class="kwa"></equipo></span><br /> <span class="kwa"><resultado></span><span class="num">2</span><span class="kwa"></resultado></span><br /> <span class="kwa"></partido></span><br /><span class="kwa"></quiniela></span><br />bloqueT2.4<span class="num">.1</span>.xml validates<br /></pre>Alejandrohttp://www.blogger.com/profile/05217843835077448409noreply@blogger.com2