martes, 7 de diciembre de 2010

Mudanza Final

Debido a la dedicación que un blog requiere, es para mí difícil compaginar mi vida con la escritura frecuente en los blogs, y mucho más si tengo en mente otras prioridades, como en este caso es proveer de contenido a la web oficial de Anima Adversa.

Por todo ello, la continuación de los temas tratados (y sobre todo, centrados en software y cultura libre, y en electrónica) serán a partir de entonces en el blog de Anima Adversa.

Os recomiendo a todos pasaros por esta web:

www.animaadversa.es/blog/

Un saludo y hasta siempre!

viernes, 29 de mayo de 2009

Practica 6 Código

delNoticia.php


<?php
$accion=$_GET['accion'];
if($accion == 'Borrar'){
$id = "borrar";
}elseif($accion == 'Modificar'){
$id = "modificar";
}
?>
<head>
<title>Borrar Noticia</title>
<meta content="text/html; charset=[b]iso-8859-1[/b]" http-equiv="Content-Type" />
</head>

<body><!-- el formulario -->
<form name="noticia" id="noticia" action="" >
<blockquote>
<p class="formTitl">Seleccione la noticia que desee <?=$id?>:<br />
<select name="id">;
<?php
$xml = simplexml_load_file( 'noticias.xml' );
$result = $xml->xpath("//noticia");
foreach ($result as $noticia){
echo '<option value="'.$noticia["id"].'" >'.utf8_decode($noticia->titulo).'</option>';
}?>
</select>
<input type="submit" id="<?=$id?>" class="button" name="<?=$id?>" value="<?=$accion?>" />
</p>
</blockquote>
</form>
</body>

addNoticia.php


<html>
<head>
<title>Add Noticia</title>
</head>

<?php
$notID = $_GET['id'];
$notTitulo="";
$notDesc="";
$notCuerpo="";
$notAutor="";
$notFecha="";
$notCategoria="";
$categorias = array("Discos", "El Grupo", "Conciertos", "Otros");
if(isset($notID)){
$xml = simplexml_load_file( "noticias.xml" );
$result = $xml->xpath("//noticia[@id=".$notID."]");
foreach ($result as $noticia){
$notTitulo = utf8_decode($noticia->titulo);
$notDesc = utf8_decode($noticia->descripcion);
$notCuerpo = utf8_decode($noticia->cuerpo);
$notAutor = utf8_decode($noticia->autor);
$notFecha = $noticia->fecha;
$notCategoria = utf8_decode($noticia->categoria);
}
}?>

<body>
<form name="noticia" id="noticia" action="" >
<blockquote>
<p class="formTitl">T&iacute;tulo de la Noticia<br /><input type="text" name="notTitulo" size="50" value="<?=$notTitulo?>"/></p>
<p class="formTitl">Breve descripci&oacute;n: <br /><textarea name="notDesc" rows="5" cols="75"><?=$notDesc?></textarea></p>
<p class="formTitl">Cuerpo de la Noticia<br /><textarea name="notCuerpo" rows="10" cols="75"><?=$notCuerpo?></textarea></p>
<p class="formTitl">Autor: <input type="text" name="notAutor" size="20" value="<?=$notAutor?>"/></p>
<input type="hidden" name="notFecha" value="<?=$notFecha?>" />
<input type="hidden" name="notID" value="<?=$notID?>" />
<p class="formTitl">Categor&iacute;a<br />
<select name="notCategoria">
<?php
foreach ($categorias as $categoria){
echo '<option value="'.$categoria.'" ';
if(!strcmp($categoria, $notCategoria)){
echo 'selected="selected" ';
}
echo '>'.$categoria.'</option>';
}?>
</select>
<input type="submit" id="escribir" name="escribir" class="button" value="Enviar" />
</p>
</blockquote>
</form>
</body>
</html>

borrarNoticia.php


<?php

$notID= $_POST['id'];
$xml = simplexml_load_file( 'noticias.xml' );
$result = $xml->xpath("//noticia[@id!=".$notID."]");
$noticiones="<noticias>";
foreach($result as $new){
$noticiones = $noticiones.$new->asXML();
}
$noticiones = $noticiones."</noticias>";
$xml = simplexml_load_string($noticiones);
if(!$fp=fopen("noticias.xml","w+")) echo "No se ha podido abrir el fichero";
else{
file_put_contents("noticias.xml",$xml->asXML());
if(fclose($fp)) echo $notID;
}

?>

escribirNoticia.php


<?php
// comprobamos que el formulario no envie campos vacios
if(!empty($_POST['notTitulo']) && $_POST['notCuerpo'] && $_POST['notAutor'] && $_POST['notDesc'] && $_POST['notCategoria']){

// creamos las variables y les asignamos los valores a insertar
$notTitulo = utf8_encode($_POST['notTitulo']);
$notFecha = utf8_encode($_POST['notFecha']);
if(empty($notFecha)){
$notFecha= date("r");
}
$notAutor = utf8_encode($_POST['notAutor']);
$notCategoria = utf8_encode($_POST['notCategoria']);
$notDescripcion = utf8_encode($_POST['notDesc']);
$notCuerpo = utf8_encode($_POST['notCuerpo']);

// Aquí insertamos el valor del los datos al final de nuestro XML.
//En primer lugar, deberíamos ver cual es el último id que estamos usando
//en nuestra base de datos xml, o cual estamos sustituyendo
$notID=$_POST['notID'];
$xml = simplexml_load_file( 'noticias.xml' );
if(empty($notID)){
if(!$result = $xml->xpath("//noticia/@id")){
$fed = 0;
}else{
$max=0;
foreach($result as $var){
if($max<(int)$var['id']){
$max=(int)$var['id'];
}
}
$fed = $max;
}
$notID = $fed + 1;
}else{
$result = $xml->xpath("//noticia[@id!=".$notID."]");
$noticiones="<noticias>";
foreach($result as $new){
$noticiones = $noticiones.$new->asXML();
}
$noticiones = $noticiones."</noticias>";
$xml = simplexml_load_string($noticiones);
}

//Añadimos la noticia con ese id.
$noticia = $xml->addChild('noticia');
$noticia['id']= $notID;
$noticia->titulo = $notTitulo;
$noticia->fecha = $notFecha;
$noticia->autor = $notAutor;
$noticia->categoria = $notCategoria;
$noticia->descripcion = $notDescripcion;
$noticia->cuerpo = $notCuerpo;
$noticia->enlace = 'leerNoticia.php?id='.$notID;

//Y por último, lo guardamos en el archivo.
if(!$fp=fopen("noticias.xml","w+")) echo "No se ha podido abrir el fichero";
else{
file_put_contents("noticias.xml",$xml->asXML());
if(!fclose($fp)) {
echo "No se ha podido cerrar el fichero";
// enviamos un mensaje de exito
}else{
echo $notID;
}
}
}else{
// si el formulario envia algun campo vacio
// enviamos un mensaje de error
echo "Debe llenar todos los campos del formulario";
}
?>

Cliente


<html>
<head>
<title>Gestor de Noticias Hermes 0.5</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
var identificador = "";
$('#escribir').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "POST",
url: "escribirNoticia.php",
data: datos,
success: function(msg){
$("#editor").load("addNoticia.php?id="+msg);
$("#previsor").load("leerNoticia.php?id="+msg);
identificador = "id="+msg;
},
error: function(msg){
$("#editor").html("<h2>Error: </h2>"+msg);
}
});
return false;
});

$('#borrar').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "POST",
url: "borrarNoticia.php",
data: datos,
success: function(msg) {
$('#editor').html('<p>Los datos de la noticia '+msg+' fueron borrados</p>');
},
error: function(objeto, quepaso, otroobj){
alert("ERROR!! Mecachis... Esto es lo que ha pasado: "+quepaso);
}
});
return false;
});

$('#modificar').live("click", function(){
var datos = $("#noticia").serialize();
$.ajax({
type: "GET",
url: "addNoticia.php",
data: datos,
success: function(msg) {
$('#editor').html(msg);
$("#previsor").load("leerNoticia.php?"+datos);
identificador = datos;
},
error: function(objeto, quepaso, otroobj){
alert("ERROR!! Mecachis... Esto es lo que ha pasado: "+quepaso);
}
});
return false;
});
</script>
<style type="text/css">
body{background: #000033 none repeat scroll 0 0;}
h1{display:block; background:#FF9900; font-size: 20px; font-family: Georgia, "Times New Roman", Times, serif; font-weight: bold;}
h4{font-style: italic;}
p{text-align:justify}
.noticia{border-bottom: 1px dotted #666666;}
#head {display:block; text-align:center; width:100%; height:10%;position:absolute;top:0px;}
#editor {display:block; background:LemonChiffon; width:50%; height:90%; position:absolute;top:10%; left:0; overflow:auto;}
#previsor {display:block; background:red; width:50%; height:90%; position:absolute; top:10%; left:50%; padding-left:10px; overflow;auto;}
#menu {list-style:none; margin:0; padding:0;}
#menu li {margin:2px; padding:2px; border:1px solid #CCCCCC; float:left;}
#menu li a {display:block; width:100px;padding:4px 0;text-decoration:none;text-align:center;font-size:11px;color:#FFFFFF;background-color:#000033; cursor:pointer;}
#menu li a:hover {color:#000000;background-color:#FF9900;}
</style>
</head>

<body>
<div id="head">
<ul id="menu">
<li><a onClick="$('#editor').load('delNoticia.php?accion=Modificar');">Editar una noticia</a></li>
<li><a onClick="$('#editor').load('delNoticia.php?accion=Borrar');">Borrar una noticia</a></li>
<li><a onClick="$('#editor').load('addNoticia.php'); $('#previsor').empty();identificador='';">A&ntilde;adir una noticia</a></li>
<li><a onClick="$('#previsor').load('leerNoticia.php?'+identificador);">Recargar Noticias</a></li>
</ul>
</div>
<div id="editor"></div>
<div id="previsor">
</div>
</body>
</html>

jueves, 28 de mayo de 2009

Practica 6

Se trata de un gestor de noticias basado en una base de datos XML que podéis encontrar aquí:
http://pachus.animaadversa.es/Pract7/noticias.xml
Usando AJAX se ha configurado el entorno del gestor de noticias, con la posibilidad de añadir, modificar y borrar todas las noticias que se encuentran en ese momento en la base de datos. La aplicación dispone de un menú, un cuadro para editar,borrar y modificar, y un tercer cuadro para ir previsualizando sobre la marcha como van quedando las cosas.
http://pachus.animaadversa.es/Pract7/
Por último, si queremos leer las noticias, aunque no nos importe el estilo (puesto que va a ser llamado con AJAX desde cualquier aplicación externa), nos venimos a la página de leer noticias:
http://pachus.animaadversa.es/Pract7/leerNoticia.php

domingo, 10 de mayo de 2009

Bloque T2.12 Ejercicio 1

Bueno, por fin logré terminar la parte de Xpath. El código es este::
#!/usr/bin/ruby

require 'rexml/document'
include REXML

documento = ARGV[0]
habitacion = ARGV[1]

file = File.new(documento)
doc = Document.new(file)
XPath.each(doc,"//habitacion[puerta[@a='#{habitacion}']]") { |habit|
puts "*"+habit.attributes['id']
}




Y el archivo de XML que hemos utilizado es este:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE micasa PUBLIC "MI CASA" "micasa.dtd">
<micasa>
<habitacion id="cuarto de baño">
<mueble>aparador</mueble>
<mueble>bañera</mueble>
<puerta a='pasillo' />
</habitacion>
<habitacion id="pasillo">
<mueble>cuadro</mueble>
<puerta a='cuarto de baño' />
<puerta a='dormitorio' />
<puerta a='recibidor' />
</habitacion>
<habitacion id="recibidor">
<mueble>espejo</mueble>
<puerta a="pasillo" />
</habitacion>
</micasa>




Y he logrado que muestre todas las habitaciones uqe tienen una puerta al destino que se le pase como parámetro, de la forma:
./xpath.rb pasillo

que devolverá:
  • *cuarto de baño
  • *recibidor

Bloque T2.10

Bueno, este bloque es hacer un filtro SAX que tradujera el sistema de etiquetas que teníamos para el archivo jugadores.xml al inglés en ruby. Para eso hemos definido un diccionario, y cada vez que se encuentra una etiqueta ya definida en español, la cambia por una etiqueta en inglés.

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

#Para usar con jugadores.xml

entrada=ARGV[0]

diccionario = {"entrenador"=>"coach",
"lista_jugadores"=>"players_list",
"jugador" => "player",
"equipo"=>"team" }

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

Bloque T2.9 Ejercicio 1 - Practica 5

Pues como cuando empezamos a hacer este ejercicio en clase estabamos también pendientes de la práctica 5, decidí matar dos pájaros de un tiro, así que en la práctica 5 los parámetros se pasan por la interfaz REST (el parámetro l -de longitud a mostrar- y el parámetro ind -indice- del RSS que queremos leer).

#!/usr/bin/perl

use CGI qw(:standard);
use XML::RSS;
use LWP::Simple qw(get);
use HTTP::Date;

#Definimos las URLs a las que vamos a aacceder.
my @urls=("", "http://www.animaadversa.es/rssfeed.xml", "http://feeds.feedburner.com/NoPuedoCreerQueLoHayanInventado", "http://ponlelaquesea.wordpress.com/feed/", "http://noticiasaudio.com/feed/", "http://feeds.feedburner.com/hispasonic");
#Chanchullo para poder acceder desde el indice 1.

#====== CREAR EL ARCHIVO CON LOS ITEMS RSS ORDENADOS =======
#Extraemos el parámetro de la URL.
my $mostrar = param('ind');
my $maximo = 5;
if(!$mostrar){
$mostrar = 1;
}else{
$maximo = $mostrar;
}

#Creamos un array con todos los items, que luego ordenaremos.
my $i=0;
my @arrayitem=([],[],[],[],[]);
for($indice=$mostrar; $indice<=$maximo; $indice++){
my $rdf = get($urls[$indice]);
my $rss = new XML::RSS;
$rss->parse($rdf);
$nombre= $rss->{'channel'}->{'title'};
$enlace= $rss->{'channel'}->{'link'};
foreach my $item ( @{ $rss->{items} } ){
$arrayitem[$i][0] = $$item{title};
$arrayitem[$i][1] = $$item{description};
$arrayitem[$i][2] = $$item{link};
$arrayitem[$i][3] = str2time($$item{pubDate});
$arrayitem[$i][4] = "<a href='$enlace'>$nombre</a>";
$i++;
}
}

#Y lo ordenamos por fecha.
@arrayitem = sort { $a->[3] cmp $b->[3] } @arrayitem;

#====== MOSTRAR LOS CANALES RSS ===========
#Creamos el archivo con todos los items que encontremos.
print header( -type => 'text/html' );
print "<html><head><title>Lector de RSS</title></head><body>";
#Damos formato a los nombres, fechas y demás y lo mostramos de más reciente a más lejano
#Extraemos el parámetro de longitud
my $longitud = param('l');
if(!$longitud){
$longitud=@arrayitem-1;
}
for ($i=@arrayitem-1; $i>=@arrayitem-$longitud; $i--){
print "<div class='noticia'><h2>".$arrayitem[$i][0]."</h2><h5>visto en ".$arrayitem[$i][4]."</h5><p>".$arrayitem[$i][1]."</p><h4>".time2str($arrayitem[$i][3])."</h4><p><a href='".$arrayitem[$i][2]."'>Ver mas</a></p></div>\n";
}

#Y aquí se debería mostrar
print "</body></html>";

Bloque T2.7 Ejercicio 2

Bueno, este ejercicio va de buscar alguna librería de algún lenguaje de programación que sirva para leer feeds de Atom y mostrarlos (básicamente, como nuestras queridas librerías XML::RSS de perl y demás, pero aplicandose a Atom).

Siguiendo con mi monotema de fin de semana, vuelvo a mis orígenes PHPeros, y me pongo a buscar alguna libreŕia que sirva para trabajar con Atom en este lenguaje. Decir que buscar "Atom + PHP" en google arroja un mogollón de resultados, así que me voy a centrar en un par de ellas y yasta.

La primera que me ha hecho gracia ha sido SimplePie, que permite leer Atom y RSS. En su página dicen que es bastante sencilla de usar, y apuestan por la rapidez, ya que es capaz de cachear contenidos en el servidor, lo que lo hace más fácil de usar. Soporta RSS 0.91, RSS 1.0, RSS 2.0, Atom 0.3 y Atom 1.0 (amen de otras cuantas cosas que no se ni que son).

Otra que me encuentro en un ejemplo desde Google es Zend. En este caso hablamos ya de un Framework de PHP, una API en toda regla, como mi querido jQuery, pero aplicado a PHP. El conjunto de funcionalidades de sus librerías es bastante amplio y va desde lo que nos trajo aquí (lector RSS), hasta un completo visor de modelo para ir controlando nuestra aplicación en PHP desde un alto nivel.

Por último, otro framework bastante específico, el atom-php-framework, que nos permite desarrollar gdata al estilo que queramos, como servidores REST basados en HTTP y XML-Atom.