Archivo por meses: mayo 2009

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.