Webservices: Tratando con cabeceras SOAP en PHP (2)

Tras el artículo anterior dónde explicaba cómo leer las cabeceras en una respuesta SOAP, he descubierto cómo hacer funcionar el método estándar, seguro que a más de uno le viene bien saberlo.

El problema era que con __soapCall no había manera de que me funcionase la llamada, independientemente de recibir las cabeceras de la respuesta. Ahora sé porqué. El webservice al que estaba llamando está hecho en .NET y parece ser que hay que llamarlo de distinta forma que si se hace invocando al método directamente 😐 .

Si lo llamamos directamente hacemos:

$result = $client->TuMetodo($parametros);

Si lo llamamos con __soapCall haremos:

$result = $client->__soapCall("TuMetodo", array("parameters"=>$parametros), NULL, $reqheaders, $resheaders);

¿Veis la diferencia?

De la segunda forma hay que pasar los parámetros de entrada del método cómo un sólo parámetro “parameters“, es decir, el mismo array que teníamos con la primera manera pero asignándolo a “parameters“.

Eso es todo. Ahora ya funciona y podemos recoger automáticamente los headers de la respuesta SOAP.

Sigo sin saber porqué de esta manera se tiene acceso a las cabeceras y con la invocación directa (la forma recomendada) no. Por el momento voy a seguir utilizando el desarrollo que hice en el primer artículo, la invocación directa me parece más elegante y ya que había conseguido recuperar las cabeceras, ¿por qué cambiarlo ahora? 😛 .

Webservices: Tratando con cabeceras SOAP en PHP

Llevo ya un tiempo bastante liado con webservices a los que debo llamar con PHP y hoy me ha tocado lidiar con cabeceras SOAP. La verdad es que es un mundo bastante oscuro y me he encontrado con muchas trabas. Os contaré cuales y cómo las he solucionado, pero veamos primero algo de teoría.

Los servicios web se han convertido en el principal modo de intercambio de  información entre aplicaciones independientemente de plataformas, sistemas operativos y lenguajes de programación. SOAP es uno de los protocolos sobre los que se realiza el intercambio de los datos y está basado en XML, de manera que la parte cliente interroga al servidor con un código XML en el formato adecuado y recibe la respuesta en otro XML. Para entender de qué estamos hablando veamos la estructura de una petición SOAP y su respuesta.

Llamada (request):

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="com.xplota.ws">
    <SOAP-ENV:Header>
        <ns1:entity>
            <Code>1</Code>
            <Desc></Desc>
        </ns1:entity>
        <ns1:language>
            <Code>1</Code>
            <Desc></Desc>
        </ns1:language>
        <ns1:userId>
            <Code>1</Code>
            <Desc></Desc>
        </ns1:userId>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Respuesta (response):

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Header>
        <Status xmlns="com.xplota.ws">
            <Code>0</Code>
            <Desc>Ok</Desc>
        </Status>
    </soap:Header>
    <soap:Body>

    </soap:Body>
</soap:Envelope>

Como se puede ver en los listados anteriores, tanto el request como el response constan de dos nodos XML, header y body. El que se utiliza habitualmente es el body (que yo he dejado en blanco pues no nos interesa en este momento) y es el que contendría tanto los parámetros que se envían al webservice en el request como los que devuelve en el response.

Enviando headers soap

En el caso que nos ocupa debía enviar determinados parámetros en el header y leer de allí los potenciales códigos de error si los hubiese habido. El envío, pese a ser una estructura en vez de un parámetro simple, fue sencillo, se define una clase con los parámetros adecuados y se le envía directamente. El motor de SOAP de PHP se encarga de la traducción. Veamos un caso práctico.

//definimos la clase para las cabeceras
class wsHeader
{
    public $Code = 0;
    public $Desc = '';

    public function __construct($code, $desc){
        $this->Code=$code;
        $this->Desc=$desc;
    }
}

//instanciamos el cliente soap
$par=array();
$client = new SoapClient("http://midominio.com/ws?wsdl", $par);

//añadimos las cabeceras a las peticiones
$headers=array();
$headers[] = new SoapHeader("com.xplota.ws", 'entity', new wsHeader(1, ''));
$headers[] = new SoapHeader("com.xplota.ws", 'language', new wsHeader(1, ''));
$headers[] = new SoapHeader("com.xplota.ws", 'userId', new wsHeader(1, ''));
$client->__setSoapHeaders($headers);

//lanzamos la llamada al metodo del ws
$result = $client->TuMetodo($parametros);

Como veis es bastante sencillo de entender. Al añadir una cabecera hay que indicarle el namespace al que pertenece para que el motor SOAP sepa como tratarla, se le da un nombre y el objeto que la contiene.

Con esto hemos solucionado la parte del envío de nuestras cabeceras SOAP y tendremos un request como indicábamos en el primer XML.

Recibiendo headers SOAP

Ahora resulta que el método de nuestro webservice nos responde con otras cabeceras que debemos saber interpretar según el XML de response del segundo listado. Pues tenemos un problema y muy gordo. No hay forma de obtener estas cabeceras, el motor SOAP de PHP sólo devuelve el body, nunca los headers.

Según el manual de PHP el método __soapCall del cliente SOAP permite definir un array en el que se devolverán estas cabeceras, pero no fui capaz de hacer funcionar la invocación de un método del webservice con esta sintaxis mientras que invocándolos directamente en el cliente (cómo la documentación indica que se puede hacer) sí que me funcionaba perfectamente. Es decir, la teoría dice que con el primer método puedo recibir las cabeceras pero no me funcionó mientras que el segundo me funcionaba pero no me devuelve las cabeceras ni hay ningún método para recuperarlas.

Tras pelearme mucho con las funciones SOAP e investigar todavía más no llegué a ninguna conclusión, es como si no le hubiese pasado a nadie, no encontré absolutamente nada útil. Sólo me quedaba una solución, hacer mi propia clase SOAP a partir de la original y procesar el XML del response a mano para obtener los datos que necesitaba. Dicho y hecho. Veamos la solución.

Primero creo mi propia clase de SOAP y compruebo si voy a poder hacer lo que quiero.

class XSoapClient extends SoapClient{
    public function __construct($wsdl, $options){
        parent::__construct($wsdl, $options);
    }

    public function __doRequest($request, $location, $action, $version){
        $response=parent::__doRequest($request, $location, $action, $version);
        return $response;
    }
}
$client = new XSoapClient("http://midominio.com/ws?wsdl", $par);

Parece que voy a tener suerte, si pruebo este nuevo cliente SOAP funciona perfectamente, pero además si compruebo el contenido de $response veo que contiene íntegramente el XML de la respuesta del webservice. Cómo veis lo único que cambia al instanciarlo es que le paso el nombre de la nueva clase. Buen comienzo, si juego bien mis cartas podré sacar las cabeceras en el método __doRequest 🙂 .

Tratemos pues ese XML para obtener lo que buscamos. Gracias a las funciones DOM y XPATH de PHP será muy sencillo. Este es el resultado final de mi cliente SOAP con recuperación de cabeceras:

class XSoapClient extends SoapClient
{
    private $responseHeaders = array();

    public function __construct($wsdl, $options){
        parent::__construct($wsdl, $options);
    }

    public function __doRequest($request, $location, $action, $version){
        $response=parent::__doRequest($request, $location, $action, $version);

        $dom = new DOMDocument;
        $dom->loadXML($response, LIBXML_NOWARNING);
        $path = new DOMXPath($dom);
        $path->registerNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
        $xml = $path->query('//soap:Header/*');
        $this->responseHeaders=$this->headers2array($xml);

        return $response;
    }

    public function getResponseHeaders(){
        return $this->responseHeaders;
    }

    private function headers2array($response){
        $headers=array();
        foreach ($response as $node) {
            if($node->hasChildNodes()){
                $headers[$node->nodeName]=$this->headers2array($node->childNodes);
            }else{
                $headers[$node->nodeName]=$node->nodeValue;
            }
        }
        return $headers;
    }
}
$client = new XSoapClient("http://midominio.com/ws?wsdl", $par);
$result = $client->TuMetodo($parametros);
$soapheaders=$client->getResponseHeaders();

Problema solucionado y de manera bastante elegante. Si alguien sabe cómo conseguir las cabeceras sin montar todo este lio que me lo cuente por favor.

Patrón singleton con herencia en PHP

Pensaba que sería más sencillo. Me he tirado varios días hasta conseguir que todo funcione correctamente.

La idea es implementar el siguiente diagrama diseñado con ArgoUML:

diagramadeclase11

Es decir, una clase base de la que heredan otras.

El escenario consiste en distintos webservices a los que tengo que llamar dentro de la aplicación. Lo que he hecho ha sido mapear cada webservice con una clase que contenga los mismos métodos que el webservice, de manera que lo que haya que hacer contra los webservice se haga contra clases del mismo nombre y con los mismos métodos devolviendo directamente la información devuelta.

Desde el principio planteé que las clases de los webservices extendiesen de una clase base que tuviese la funcionalidad común de todos, es decir, las llamadas a los webservices y el control de errores de los mismos, así evitaría duplicar esta funcionalidad en cada clase.

Posteriormente decidí que cada clase debía implementar el patrón singleton para asegurar que sólo hubiese una instancia de la misma clase en cada momento y evitar así que el código se viciase instanciando una nueva cada vez que se necesita.

La solución global era, por tanto, aplicar el singleton a la clase padre y que todas las que extendiesen de ésa tuviesen automáticamente el singleton y no tener que implementarlo en cada una de ellas. Idealmente es bonito, la práctica fue bastante peor.

La primera prueba fue declarar el método getInstancia encargado de asegurar el singleton de este modo:

private static $instancia = null;

public static function getInstancia($asurl)
{
    $returnValue = null;
    if (!isset(self::$instancia)) {
            $class = _CLASS_;
            self::$instancia = new $class($asurl);
    }
    $returnValue=self::$instancia;
    return $returnValue;
}

Se suponía que haciéndolo así se crearía, en caso de no existir, una nueva instancia del objeto que fue llamado, en nuestro caso, por ejemplo, Clase1. Sin embargo al comenzar las pruebas nos dimos cuenta que _CLASS_ no devuelve el nombre de la clase a la que se llama sino el de la clase sobre la que se ejecuta, en este caso Base, con lo cual no nos servía para nuestro propósito.

A continuación encontramos una función de PHP que nos devuelve lo que nosotros necesitamos, es decir, el nombre de la clase llamada: get_called_class. Lástima que esté disponible a partir de PHP 5.3 (en beta). Aún así encontramos una implementación alternativa de esta función válida para versiones anteriores de PHP.

if (!function_exists('get_called_class')){
    function get_called_class(){
        $bt = debug_backtrace();
        $lines = file($bt[1]['file']);
        preg_match('/([a-zA-Z0-9_]+)::'.$bt[1]['function'].'/', $lines[$bt[1]['line']-1], $matches);
        return $matches[1];
    }
}

Con esto ya podíamos crear la instancia de la clase que necesitábamos desde el singleton, pero nos aguardaba aún una sorpresa. No podíamos instanciar más de una clase (distinta) de las que heredan de un mismo padre, a pesar de ser distintos objetos asume que al heredar del mismo tiene que utilizar la misma instancia del singleton y no te deja, ya que  instancia (la variable del código anterior) ya está generada y es de otro tipo.

Pongamos un ejemplo para verlo mejor. Creamos una instancia de Clase1, el singleton nos devolverá una nueva instancia ya que no existe. Ahora creamos otra de Clase2. El objeto devuelto es de tipo Clase1. Aunque nosotros queremos crear objetos distintos (Clase1 y Clase2), la instancia de Base es compartida por ambos. Como ya he instanciado Clase1, instancia es de tipo Clase1, con lo que al instanciar Clase2 te devuelve la instancia ya creada, Clase1. Podríamos comprobar que instancia (la variable) esté creada y sea del mismo tipo que la nueva que se quiere instanciar, pero al crear la nueva (Clase2) destruiríamos la antigua (Clase1) con lo que perderíamos este objeto, y eso no es lo que se busca.

¿La solución? Parecerá algo cutre, pero es esta:

Base

class osusnet_com_Base
{
    private $asurl = '';
    private static $instancia = array();
    private $iVersion = null;
    private $sAsConsumer = '';
    private $debug = 0;
    protected function __construct($asurl)
    {
        if($asurl==""){
            return false;
        }else{
            $this->asurl=$asurl;
            $this->iVersion=1;
            $this->sAsConsumer="kk";
            $this->debug=0;
        }
    }

    public static function getInstancia($asurl)
    {
        $returnValue = null;
        $class = get_called_class();
        if (!isset(self::$instancia[$class])) {
            self::$instancia[$class] = new $class($asurl);
            $returnValue=self::$instancia[$class];
        }
        return $returnValue;
    }
}

Clase1

class osusnet_com_Clase1 extends osusnet_com_Base
{
    public function GetUserContext($cookie)
    {
    }
    public function CheckStateUser()
    {
    }
    public function LogIn()
    {
    }
}

Es decir, instancia (la variable) pasa a ser un array donde guardaremos un elemento para cada instancia de cada una de las clases que lo heredan. Si buscamos un tipo ya creado nos devolverá esa instancia, en caso contrario la crea y la deja disponible para posteriores instancias. La base es única pero se crea un objeto de cada clase disponible.

Como cualquier patrón singleton, para usarlo debemos hacer:

$instancia = osusnet_com_Clase1::getInstancia($url);

Recuerda que el constructor está protegido con lo cual cualquier intento de querer instanciar una clase de estas directamente dará error, prueba a hacer:

$instancia=new osusnet_com_Clase1();

No se cual será el comportamiento en otros lenguajes, mis años de Java quedan ya algo atrás, ni siquiera se si la teoría de POO es el comportamiento aquí descrito o es una mala implementación de PHP, no soy un experto en la teoria de la programación orientada a objetos. A mi la lógica me dice que si instancias una clase de un tipo, te debería instanciar todo,  sin compartir la clase base, aunque igual también tiene sentido que si todas extienden de Base y ésta tiene el singleton donde instancia y getInstancia son estáticos, sea común a todas. Cuando más lo pienso más me lío.

Al menos encontré una solución.

Cucharete.com finalista de los Premios de Internet 2009

La Asociación de Usuarios de Internet organiza la XI edición de sus Premios de Internet y menuda sorpresa nos hemos llevado al ver entre los diez finalisdas de la caterogía C1-Mejor Web a Cucharete, la mejor web de restaurantes de Madrid.

cucharete

Sin duda alguna esta candidatura es premio al trabajo y al esfuerzo que están realizando tanto Marcos como su equipo para sacar adelante este bonito y suculento proyecto.

Mi más sincera enhorabuena.

Actualizado a las 16:00

Ahora mismo quedan sólo tres finalistas, Cucharete entre ellos. Increíble.

Cómo desmontar una unidad ocupada bajo Linux

Esto es algo que siempre me pasa y nunca me acuerdo de cómo solucionarlo. Hoy he recibido una alerta de uno de mis servidores, MySQL se había parado y no podía reiniciarse. Al entrar a la máquina para hacerlo manualmente, en efecto, me decía que no podía, que los archivos eran de sólo lectura 😐 . Después de hacer alguna comprobación más me doy cuenta de que la unidad entera se había quedado en algún estado extraño de sólo lectura a pesar de que el mount indicaba lo contrario.

[osus@servidor ~]# mount
/dev/hdb1 on /mnt/unidad type ext3 (rw)

Decido entonces desmontar la unidad y volver a montarla, pero…

[osus@servidor ~]# umount /mnt/unidad
umount: /mnt/unidad: device is busy

Y aquí viene el problema. Había parado, en teoría, todos los servicios que utilizaban esa unidad, pero aún así me daba este error. Podría haber forzado el umount con:

umount -l /dev/hdX

Pero prefiero saber qué es lo que está ocupando la unidad antes de forzarlo, cuestión de precaución sólo. Necesitamos saber, entonces, qué procesos están haciendo uso de la unidad que queremos desmontar, y esto es lo importante de este artículo.

[osus@servidor ~]# fuser -vm /dev/hdb1

                     USER        PID ACCESS COMMAND
/dev/hdb1:           named       456 ..c.. named
                     mysql       587 F.c.. mysqld
                     apache     1113 F.... httpd
                     root       1925 ..c.. screen
                     root       1926 ..c.. bash
                     apache     8009 F.... httpd
                     apache     9267 F.... httpd

Con este sencillo comando de fuser ya sabemos quién accede a la unidad en cuestión. En mi caso era un proceso bash de un screen que estaba abierto y un rsync. Los paré y ya pude desmontar la unidad correctamente. Al volver a montarla todo comenzó a funcionar correctamente.

¿La causa? Ni idea, no había nada raro en los logs, pero me da que el rsync había hecho algo extraño…

De puente en La Rioja

Puente del 1º de mayo y nueva escapadita 😛 .
Esta vez nos fuimos a La Rioja con Marcos y Nines a conocer la zona, los vinos, la gastronomía y los paisajes. Ha sido un fin de semana de desconexión total y relax.

Esta fue nuestra ruta.  Parece mucho pero, en realidad, las distancias son muy cortas, máximo 30 ó 40km entre puntos.

Ampliar

Nos alojamos en la Hospedería La Calera, en San Millán de la Cogolla, con vistas directas al Monasterio de Yuso. La casa es encantadora, el paraje simplemente impresionante, con el Monasterio a un lado y las montañas aún con nieve al fondo.

Hospederia La Calera

Podéis ver al fondo de esta foto del restaurante el monasterio.

Hospederia La Calera

A) San Millán de la Cogolla

Cuentan que fue el santo Millán (s.V-VI) quien dio nombre al pueblo. Originario del próximo Berceo, dedicó su vida a la meditación y a la contemplación, creando una pequeña comunidad en lo que hoy es el Monasterio de Suso (del latín, arriba) y que en la Edad Media daría lugar al de Yuso (abajo).

El conjunto de los Monasterios de Yuso y de Suso fue declarado Patrimonio de la Humanidad por la Unesco en 1997.

Monasterio de Suso

Como decía, es el más antiguo y donde San Millán se retiró y creo su comunidad. Empezó siendo apenas una cueva excavada en las rocas (s.VI) y poco a poco fueron ampliando las instalaciones en distintas fases sin mantener ningún estándar, simplemente se añadían estancias.

Monasterio de Suso

No es el carácter religioso, sin embargo, lo que ha dado importancia mundial a Suso sino su aspecto literario ,ya que fue aquí donde un monje desconocido escribió las Glosas Emiliarenses, las primeras palabras en castellano y en euskera, por eso se conoce este monasterio como la cuna de las lenguas.

Monasterio de SusoMonasterio de SusoMonasterio de SusoMonasterio de Suso

Vale la pena una visita al monasterio, es pequeño, se ve muy rápido y las explicaciones del guía son magníficas, el hombre siente lo que dice y aporta contenido muy interesante a la visita. Es una extraña mezcla de pequeñas cuevas y muros con antiguas tumbas, huesos aún visibles y la cripta donde se supone que fue enterrado San Millán, hoy sus restos están en Yuso.

El acceso al Monasterio de Suso está completamente prohibido si no es en visita guiada que sale en autobús desde el de Yuso, ni intentes, pues, subir por tu cuenta ya que, además de que no vas a entrar, corres el riesgo de que te multen.

Monasterio de Yuso

Hermano mayor del anterior, el edificio que ha llegado a nuestros días es del x.XVI aunque el original es del XI.

Monasterio de Yuso

El monasterio en sí mismo no ofrece nada excesivamente llamativo, la verdad, me quedo con el de Suso con diferencia. Me quedo sin duda alguna con la colección de libros de cantos como lo más interesante, impresionantes libros que llevan ahí cientos de años.

Monasterio de YusoMonasterio de YusoMonasterio de Yuso

En una de las salas del Monasterio se encuentra también la urna que acoge los restos de San Millán.

Monasterio de Yuso

B) Nájera

Nuestro paseo continúa por Nájera, a escasos 20km de San Millán. Nos habían dicho que no había nada que ver y era muy feo 😛 , pero nos pareció un pueblo coqueto en el que destaca el Monasterio de Santa María la Real, mucho más bonito que el de Yuso, vale la pena acercarse.

Monasterio de Santa María la RealEste monasterio guarda los restos de los reyes, reinas e infantes del Reino de Nájera-Pamplona, antecesor del de Navarra.

Monasterio de Santa María la RealMonasterio de Santa María la RealMonasterio de Santa María la RealMonasterio de Santa María la Real

Destaca sobre todo lo demás la Cueva donde supuestamente se halló la imagen de la Virgen que dio origen al templo en el s.XI. Aunque lo que hoy vemos se levantó en el XVI el origen era esta primitiva cueva donde se veneraba la imagen de la virgen.

Monasterio de Santa María la RealMonasterio de Santa María la Real

C) Santo Domingo de la Calzada

20km más y llegamos a Santo Domingo de la Calzada, punto importante del Camino de Santiago.

Nos habían recomendado visitar la exposición La Rioja Tierra Abierta, de la que nos habían hablado muy bien, pero la realidad fue bastante diferente, nada del otro mundo, la verdad.

Catedral Santo Domingo de la Calzada

Aprovechamos para visitar la Catedral y subir a las antiguas murallas defensivas. No está mal pero hay unas vistas mucho mejores desde la Torre Exenta, en la misma plaza. Parece ser que es la más alta de toda La Rioja.

Catedral Santo Domingo de la CalzadaSanto Domingo de la CalzadaSanto Domingo de la CalzadaSanto Domingo de la Calzada

A partir de aquí vale la pena callejear un poco y mezclarse son la gran cantidad de gente que hay por todas las esquinas.

Santo Domingo de la CalzadaSanto Domingo de la CalzadaSanto Domingo de la CalzadaSanto Domingo de la Calzada

D) Ezcaray

Tras otros 15km llegamos a este conocido punto para los esquiadores, punto final de nuestro primer día de puente.

Ezcaray

Es un pueblo muy típico, acogedor y encantador. Era puente y había muchísima gente pese al frío que hacía, gente que paseaba y se tomaba unas cañas.Ezcaray

Cenamos aquí a base de pintxos, cañas y raciones y regresamos ya tarde a dormir a nuestra casa en San Millán.Ezcaray

E) Bodegas López de Heredia

Comenzamos el segundo día en Haro, a 30km de San Millán. Día de bodegas, si estamos en La Rioja habrá que acercarse a alguna de ellas ¿no? 😛 . Teníamos concertada la visita con un mes de antelación, sino es imposible pues en fechas señaladas se llena completamente.

Bodegas Lopez de Heredia

La visita y las explicaciones nos la da directamente la bisnieta del fundador, Don Rafael López de Heredia y Landeta, y acompaña las explicaciones del proceso de elaboración del vino con historias y anécdotas acaecidas durante los años de existencia de las bodegas.

Bodegas Lopez de HerediaLas bodegas López de Heredia son las más antiguas de Haro y una de las tres primeras que se establecieron en La Rioja. Allá por 1877 Don Rafael, viendo el interés que despertaban entre los cosecheros franceses las uvas de La Rioja, decidió dejar de ser un vendedor de uvas y establecerse por su cuenta, elaborando completamente su vino, desde la uva hasta la etiquetación y comercialización del vino. Fue por aquella época cuando la filoxera destrulló completamente las cosechas de vino francesas, con lo que los productores tuvieron que buscar otros mercados donde abastecerse de uva para la elaboración de sus vinos, llegando así a las tierras riojanas y dando origen a lo que hoy se conoce como D.O.C. La Rioja.

Bodegas Lopez de HerediaBodegas Lopez de Heredia

Las bodegas son simplemente impresionantes, subterráneas, excavadas en el subsuelo, un laberinto de pasillos subterráneos llenos de moho y antigüedad que atestiguan el paso de los años.

La visita termina con una pequeña cata donde nos dan la oportunidad de probar sus reconocidos caldos. En mi humilde opinión no son excepcionales, pero las bodegas merecen la pena. Ah!, me olvidaba, la visita es completamente gratuita, cata incluída.Bodegas Lopez de Heredia

Un poco más adelante tienes también las Bodegas Muga (en la foto), Cune, Paternina

Bodegas Cune

F) Laguardia

Otros 30km y llegamos a Laguardia, uno de esos sitios que todo el mundo te recomienda visitar si vas a La Rioja pese a estar ya en Álava (Rioja Alavesa). Sin duda un pueblo de esos que invita al paseo ya que conserva un marcado carácter medieval en sus rincones y plazas.

Laguardia

Un buen lugar para hacer un alto en el camino y llenar el buche con algo sólido 😛 .

LaguardiaLaguardiaLaguardiaLaguardia

Laguardia y su entorno son el centro de muchas y muy conocidas bodegas, os dejo las dos más representativas hoy en día más por su arquitectura que por sus vinos.

G) Bodegas Ysios

Bodegas Ysios, en Laguardia, tomando un pequeño desvío a la entrada al pueblo. Obra de Santiago Calatrava.

Bodegas Ysios

H) Bodegas Marques de Riscal

Bodegas Marqués de Riscal, en Elciego, a unos 7km de Laguardia. Obra de Frank Gehry, el del Guggenheim. Puede gustarte o no semejante amasijo de hierros en medio de algo tan tradicional como el vino, pero desde luego que indiferente no te dejará. Visita muy restringida, no se puede ni entrar a los exteriores del edificio, es lo que tiene la fama 😛 .

Puedes visitar Sensaciones Vivas para una experiencia más profunda 😛 .

Bodegas Marques de Riscal

I) Logroño

Y a otros 20km llegamos a Logroño, una ciudad muy pequeña y rápida de ver, pero lenta que disfrutar. Su casco histórico invita al paseo relajado y a la terracita pausada.

Logroño

Y acercándose la hora donde la tarde se convierte en noche, comenzamos a deambular por la conocida Senda de los Elefantes, ahí donde sin rifles ni fusil nadie se libra de agarrar una buena trompa. Entre vinos, cañas y pinchos la calle Laurel es el lugar perfecto para pasar un rato disfrutando entre amigos.

LogroñoLogroño, Puente de Piedra

Y  así terminamos el segundo día del puente cenando en el restaurante de la Hospedería donde nos alojamos.

J) Ortigosa de Cameros

Último día, toca el momento de volver a casa, pero como es temprano y no queremos coger un atasco a la entrada de la ciudad, decidimos prolongar el viaje hasta después de comer. Tras comentarlo con el dueño de la casa decidimos acercarnos a Ortigosa de Cameros, pues se suponía que había unas cuevas que valía la pena visitar.

El camino eran apenas 40km, pero a través de una carretera de montaña verdaderamente estrecha donde los paisajes merecen realmente la pena, tanto los primeros donde vas paralelo al río Najerilla, como a medida que subes las cumbres.

La RiojaLa Rioja

Es, posiblemente, lo más llamativo que vimos en todo el viaje, el pueblo es sencillamente impresionante, levantado entre montañas, con un precipicio entre ellas considerable.Ortigosa de Cameros

Las cuevas de las que hablábamos están allí mismo, subiendo por la pasarela de madera que se ve en la foto de arriba, pero cuando llegamos estaban ya cerradas, había que esperar a las 16:30 y nosotros no podíamos, así que nos quedamos sin verlas. Marcos contará en su blog su experiencia ya que me ha contado que son espectaculares.

Ortigosa de CamerosOrtigosa de Cameros

Un pueblo encantador que mantiene el recuerdo de antaño en la estructura de sus calles y la arquitectura de las casas, ofreciendo bellas estampas a lo largo del recorrido.

Ortigosa de Cameros

Comimos en el restaurante que hay justo al otro lado del Puente de Hierro, en el acceso a las cuevas. Está bastante bien, relación calidad/precio muy buena. El solomillo de buey estaba simplemente impresionante…

Ortigosa de CamerosOrtigosa de Cameros

Y con esto terminamos, nos quedan 500km de viaje de vuelta a Valencia, así que, paciencia y calma, por que lo importante es regresar 😛 .

WordPress Mobile Pack, plugin para movilizar tu WordPress

Menuda sorpresa me he llevado hoy al leer esta noticia.

Ha habido otros intentos de hacer algo similar pero ninguno llegaba a la perfección que roza este nuevo plugin ya que lo ajusta todo al terminal del cliente, desde las imágenes hasta la paginación de artículos. En el link de presentación tenéis toda la información. No podía ser menos viniendo del organismo “oficial” de la web móbil, dotMobi.

Entre las características que me parecen importantes y fundamentales en un producto de este tipo y que hasta ahora otros habían obviado limitándose a presentar un blog menos recargado:

  • Detecta el móvil del cliente y consulta la base de datos de DeviceAtlas para obtener sus características (tamaño de pantalla, colores…).
  • Puedes hacer que cualquier petición a un dominio sea automáticamente móvil independientemente del dispositivo que acceda (m.tudominio.com).
  • Selección de temas concretos para la versión móvil independiente del web. No tienes que empezar de cero.
  • Versión móvil del panel de administración para publicar directamente desde tu dispositivo.
  • Paginación de artículos. En otros productos se mostraban en una sóla página y no todo el mundo escribe artículos pequeños 😛 .

Ahora me toca personalizar el tema, pero aquí tenéis mi blog en un Nokia N95.

Cerebro en la Sombra para móviles

Os recomiendo que le echéis un ojo ya que es muy interesante y hace todo el proceso de movilización de tu blog extremadamente sencillo.

Castillo de Xàtiva

Hoy toca el destino más clásico para los valencianos para una escapada de fin de semana. Llevábamos muchísimo tiempo queriendo ir pero está tan cerca (60km) que siempre lo dejábamos para otro día. Finalmente un domingo aburrido y sin nada que hacer nos decidimos y, la verdad, vale la pena.

La principal refencia de Xàtiva es su castillo, enclavado imponente en la montaña a cuyos pies se extiende el pueblo. Hasta que te encuentras allí arriba no te das cuenta del tamaño real de la fortaleza ya que se extiende a lo largo y ancho de la cumbre.

imgp0781

Conquistado ya en el s.III a.c. por el cartaginés Ánibal y posteriormente por el romano Escipión, fue la principal defensa de la zona durante esta época. Su situación estratégica, con la Vía Augusta a sus piés, que llevaba de Roma a Cartagena y Cádiz a través de los Pirineos, le otorgaba una importante función de vigilancia y protección.

Tras los romanos llegaron los visigodos y en el año 714 los musulmanes donde el castillo pasó por varios momentos, desde ser reino independiente hasta depender de las taifas de Valencia o Toledo e incluso del Califato de Córdoba.

imgp0801imgp0799imgp0798imgp0795imgp0791

En 1099 El Cid fracasó en la reconquista del Castillo. Tendría que ser el gran libertador cristiano Jaime I El Conquistador el que, tras la toma de Valencia en 1244, ocupa el castillo después de cinco meses de asedio.

En el s.XV el castillo se convierte en prisión de la Corona de Aragón coincidiendo con la llegada al papado de la familia Borgia (Borja originalmente).

imgp0789

En 1707 la ciudad fue saqueada y destruida por las tropas borbónicas tras la victoria en la batalla de Almansa sobre el ejército del Archiduque de Austria.

imgp0827

Existen, pues,  dos partes bien diferenciadas en el castillo, la más antigua (Castillo Menor) y la más moderna (Castillo Mayor). El primero se correspondería con aquél íbero o cartaginés existente antes de la llegada de los romanos  (primera foto del artículo) mientras que el segundo sería ya de construcción latina (foto siguiente).

imgp0848

imgp0863imgp0856imgp0850

En resumen, una fortificación muy interesante y de gran extensión, ideal para tirarte un par de horas paseando tranquilamente por todas las salas y dependencias del castillo. Es de esos sitios donde realmente sientes que algún día se hizo vida de verdad en su interior.

El castillo te regala, además, impresionantes vistas de la comarca. En un día medianamente claro se puede ver incluso el mar.

imgp0830imgp0782imgp0782

Para comer escogimos Casa La Abuela, en el centro de Xàtiva. Habíamos tenido buenas referencias sobre este restaurante, pero al final normalito tirando bajo, la calidad no está acorde al precio.

Casa la Abuela, XativaCasa la Abuela, Xativa

Nuestro menú consistió en un sencillo entrante, dos platos y postre.

Pulpo a la parrilla con fritada de pimientos verdes y cebolla con crema de patatas

Casa La Abuela, Xativa, Pulpo

Arroz al horno de la Costera

Arroz al horno de la Costera

Arroz meloso de rape y cigalitas, con almejas del terreno y verduras

Arroz meloso de rape

Arroz meloso de rape

Selección de postres

Selección de posters

El arroz al horno, para ser la especialidad de la zona, mal, muy mal, insípido y punto.

El pulpo pasable y el arroz meloso lo mejor, bastante bueno comparado con el arroz al horno.

Y después de comer un paseo por el casco histórico de Xàtiva para bajar lo comida te hará descubrir bonitos rincones de la cuna de la familia Borgia.

imgp0757

XativaXativa

Xativa

El centro antiguo no es muy extenso ni llamativo pero muy agradable de recorrer para pasar la tarde.

Motivar y desmotivar en la gestión de personal

Estas vacaciones de Semana Santa que he pasado en Túnez (pronto contaré la experiencia como siempre 😛 ) me han servido para terminar de leer un libro (en realidad dos) que se me había atragantado un poco, El mito de la motivación, como escapar de un callejón sin salida, de Reinhard K. Sprenge. Lo empecé en diciembre pero hacia la mitad se me hizo un poco pesado, algo que después cambia y se hace mucho más llevadero pues el libro es realmente  interesante y de recomendable lectura a cualquiera que tenga gente a su cargo.

Reinhard, a partir de su experiencia en multitud de empresas, diferencia claramente entre motivación y manipulación,  desmitificando cualquier tipo de sistema de incentivos, léase por objetivos, pagas de beneficios, comisiones… Para él cualquiera de estos sistemas son la respuesta a la acción desmotivadora de algún directivo que no sabe cómo reconducir a su gente después de haber provocado, sin saberlo, la situación que viven.

En un momento del libro, Reinhard dice algo así,

Si nuestros colaboradores son gente adulta, con hipotecas, niños a los que criar y educar, parejas por las que luchar… ¿Por qué hemos de pensar  que en su vida  profesional alguien tiene que tratarlos como críos diciéndoles en cada momento lo que deben hacer y cortando su iniciativa?

Nuestros colaboradores son gente con conociemientos, preparación y experiencia y no quieren un trabajo de marionetas, quieren retos, afrontar problemas y tomar decisiones, pero si alguien se hace responsable permanentemente de las decisiones sin permitir que los demás tomen la inciativa y demuestren su valía nos plantamos en eso que se conoce como “desmotivación”. ¿Quién es el culpable entonces?

Intentar motivar es absurdo e imposible una vez se ha caído en la desmotivación. Por muchos intentos que se hagan por conseguirlo, normalmente a base de incentivos económicos, su éxito será sólamente efímero puesto que el dinero se valora y disfruta en un primer momento, cayendo en el olvido o en la costumbre en los siguientes.

La verdad es que en el libro no se cuenta nada que, desde la perspectiva de los que estamos por debajo, no hayamos visto siempre como “de cajón“, pero parece que hay mucha gente que nunca ha tenido este punto de vista y hay que mostrárselo.

Un libro que todos los directivos y managers deberían leer para entender muchas de las cosas que ocurren a su alrededor.

RETD, la primera red de conmutación de paquetes mundial fue española

Leyendo hoy un artículo de la serie de El Cedazo Historias de un viejo informático de Macluskey me entero de algo que es prácticamente desconocido para la mayoría de informáticos actuales. Resulta que allá por el año 1971 se inauguró en España la primera red de transmisión de datos mundial que utilizaba la conmutación de paquetes (igual que hoy en día hace Internet): RETD (Red Especial de Transmisión de Datos), que a la larga sería IBERPAC. En este otro enlace podéis encontrar la historia de de este hito de las telecomunicaciones en nuestro país, de lectura más que recomendable. No sería hasta 1978 cuando aparece otra red similar, la conocida Transpac francesa.

La historia es realmente emocionante.

Macluskey cuenta que por aquellos años (finales de los 60) se comenzaron a implantar los primeros sistemas online en la banca española, los más interesados en aquellos años en toda la informática y comunicaciones en general y que fueron los que comenzaron a utilizar las primeras redes para conectas las sucursales con las centrales. Banesto fue el primer banco en disponer de sistemas conectados entre todas sus oficinas.

Desde la Telefónica de aquellos años comenzaron a trabajar en un sistema que permitiese de un modo fiable, rápido y barato este tipo de conexiones y, sin saberlo, llegaron a la misma solución en que la gente del MIT estaba trabajando para lo que sería ARPANET, los inicios de Internet, pero como era un proyecto secreto del gobierno norteamericano no se sabía nada: la comutación de paquetes.

Vale la pena que os leáis la historia, a veces aquí también innovamos 😛 .

Igualmente recomiendo la serie completa de artículos “Historia de un viejo informático“, os dará un punto de vista que no tenemos los que nos dedicamos a esto hoy en día además de conocer la prehistoria de nuestra profesión desde un punto de vista más práctico que teórico.