OpenLLM-France/wikimedia huggingface dataset:
# Programación en Ada/Tareas/Selección de citas
#### Selección de citas (select)

Uno de los usos de la sentencia select es permitir a una tarea seleccionar entre varias posibles citas; en este caso, se permite su uso únicamente dentro del cuerpo de una tarea. Su sintaxis es la siguiente:
Esta alternativa de sentencia select permite una combinación de espera y selección entre varias aceptaciones de puntos de entrada a la tarea alternativas. Además, la selección puede depender de condiciones asociadas a cada alternativa.
La sentencia delay sirve para indicar que, si en un determinado intervalo de tiempo no se produce ninguna llamada que corresponda con las selecciones anteriores, se ejecuten las sentencias posteriores.
La sentencia terminate se elige en la sentencia select si la unidad de la que la tarea depende ha llegado al final y todas las tareas hermanas y dependientes han terminado. Es una terminación controlada. Esta alternativa no puede aparecer si hay una alternativa delay o else.
Por ejemplo:
Como otro ejemplo, para garantizar la exclusión mutua a una variable (acceso seguro a memoria compartida), se podría implementar con tareas de la siguiente manera:
La primera sentencia de la tarea es un accept de Escribir, con lo que se asegura que la primera llamada le de un valor a la variable local. En el supuesto de que se realizara una llamada a Leer, ésta quedaría encolada hasta que se produjera la aceptación de Escribir. Después, la tarea entra en el bucle infinito que contiene una sentencia select. Es ahí donde se acepta tanto llamadas a Escribir como a Leer de la siguiente manera:
Si no se llama ni a Leer ni a Escribir, entonces la tarea se queda suspendida hasta que se llame a algún punto de entrada, en ese momento se ejecutará la sentencia accept correspondiente.
Si hay una o más llamadas en la cola de Leer, pero no hay llamadas en la de Escribir, se acepta la primera llamada a Leer, y viceversa.
Si hay llamadas tanto en la cola de Leer como en la de Escribir, se hace una elección arbitraria.
Es una tarea que sirve a dos colas de clientes que esperan servicios diferentes. Sin embargo, se impide el acceso múltiple a la variable local.

## Manual de referencia de Ada

* 9.7 Select Statements
# Programación en Ada/Tipos
## Clasificación de tipos

Los tipos de Ada se pueden clasificar en:
* Escalar:
** Discreto:
*** Enteros: Integer, Natural, Positive.
*** Enumeraciones: Boolean, Character.
** Real:
*** Coma flotante.
*** Coma fija.
* Compuesto:
** Vector: Arrays, Strings.
** Registros: record.
* Puntero: access.
** Punteros a objetos
** Punteros a subprogramas
* Privados: private.
* Tareas: task.

## Declaración de tipos

Para definir un tipo no estándar, se puede emplear el siguiente esquema:
Sirvan como ejemplos las siguientes definiciones de tipos:

## Algunos atributos aplicables a tipos

Los atributos son operaciones predefinidas que se pueden aplicar a tipos, objetos y otras entidades. Por ejemplo estos son algunos atributos aplicables a tipos:
* Last: Integer'Last es el máximo valor que puede tomar la variable de tipo Integer. También es el último valor de un tipo enumerado o del índice de un vector.
* First: Integer'First es el mínimo valor que puede tomar la variable de tipo Integer. También es el primer valor de un tipo enumerado o del índice de un vector.
* Range: Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de más de una dimensión, el valor Matriz'Range(1) indica el rango de la primera dimensión.
* Succ: TColor'Succ(ROJO) indica el siguiente valor a ROJO que toma el tipo TColor, si no existe, se eleva la excepción Constraint_Error.
* Pred: TDía'Pred(VIERNES) indica el anterior valor a VIERNES que toma el tipo TDía, si no existe, se eleva la excepción Constraint_Error.
* Pos: El atributo Pos indica la posición ocupada por un determinado valor en un tipo enumeración. Por ejemplo: TColor'Pos(ROJO). La primera posición se considera 0.
* Val: El atributo Val indica el valor que ocupa una determinada posición en un tipo enumeración. Por ejemplo: COLOR'Val(1).
* Para identificar unívocamente un valor de un tipo enumeración se emplea TColor' (ROJO) y TIndicador'(ROJO) para distinguir el valor ROJO del tipo TColor o TIndicador.

## Subtipos

Los subtipos definen un subconjunto de los valores de un tipo determinado, pero no son un tipo distinto de su tipo base.

## Superar una ambigüedad

En el supuesto caso de que se quiera superar una ambigüedad en el tipo de una variable (debería evitarse) en un determinado instante, se puede optar por convertirlo (no recomendable) o cualificarlo:
* Convertir el tipo, por ejemplo: Integer(I) convierte el número I a entero.
* Cualificar el tipo, por ejemplo: Integer'(I) interpreta I como entero.
En ambos casos, el resultado es I como entero.
La cualificación sirve para cuando un literal no se sabe a qué tipo pertenece y se le indica de ese modo. Por ejemplo:

## Tipos avanzados

Hay otros tipos más avanzados en Ada. Puedes optar por leer estos tipos ahora o por continuar el libro por la siguiente lección Objetos (variables y constantes).
* Registros discriminados
* Registros variantes
* Punteros a objetos
* Punteros a subprogramas
* Tipos derivados
* Tipos etiquetados

## Manual de referencia de Ada

* 3.2 Types and Subtypes
* 3.2.1 Type Declarations
# Programación en Ada/Tareas/Dependencia
## Dependencia de tareas

Las reglas de dependencia de las tareas son:
* Si la tarea es creada por la elaboración de una declaración de objeto, depende de la unidad que incluya dicha elaboración.
* Si la tarea es creada por la evaluación de una sentencia new para un tipo puntero dado, depende de cada unidad que incluya la elaboración de la declaración de dicho tipo puntero.
Por ejemplo:

## Manual de referencia de Ada

* 9.3 Task Dependence - Termination of Tasks
# Programación en Ada/Tareas/Sincronización mediante citas
### Sincronización de tareas mediante puntos de entrada o citas (entry)

Frecuentemente, las tareas interaccionan entre sí y necesitan un mecanismo para comunicarse y sincronizarse, este mecanismo que ofrece Ada se conoce como la cita (rendezvous) o punto de entrada a la tarea.La cita entre dos tareas se produce como consecuencia de la llamada de una tarea a un punto de entrada declarado en otra tarea.
Los puntos de entrada se declaran en la especificación de la tarea, por ejemplo:
Un punto de entrada se asemeja a un procedimiento. Los parámetros que admiten son de modo in, out o in out, por defecto, se sobreentiende in. Para invocar a un punto de entrada, se procede de igual manera que en un procedimiento, por ejemplo:
Nótese que se debe emplear la notación punto siempre que se realice la llamada fuera de la misma tarea pues una tarea no puede aparecer en una cláusula use. Realizar una llamada a un punto de entrada propio desde la misma tarea está permitido sintácticamente, pero resulta ilógico, pues produciría un interbloqueo consigo misma.
También se pueden definir varios puntos de entrada simultáneamente, por ejemplo:
Y se podría llamar a un punto de entrada de los 10 definidos como, por ejemplo:
Con ello, se llama al punto de entrada Aviso con el nivel 3 y parámetro 1173.
Las acciones que se llevan a cabo al aceptar una cita se especifican mediante la sentencia accept, tal y como se explica en el apartado siguiente.

## Manual de referencia de Ada

* 9.5.2 Entries and Accept Statements
# Programación en Ada/Tareas/Dinámicas
## Creación dinámica de tareas (tipos tareas)

Además de poder declarar tareas como un simple objeto, se pueden declarar un tipo como tipo tarea. Con ello se consigue poder utilizar otros objetos que utilicen dicho tipo tarea como por ejemplo, un vector de tareas o un puntero a tarea (con lo que se consigue crear tareas dinámicamente).
La sintaxis de los tipos tarea es la siguiente:
Con ello, se define un nuevo tipo. Esta definición necesita una terminación, es decir, faltaría declarar el cuerpo de la tarea, que se realiza de igual manera que si se hubiera declarado la tarea simplemente.
Los tipos tarea son privados limitados. Es decir, un objeto declarado de tipo tarea no es una variable, se comporta como una constante. Por tanto, no se permite la asignación, igualdad y desigualdad para los tipos tarea.
Según la sintaxis descrita, se puede definir una tarea como un tipo, por ejemplo, de esta manera:
En el momento en el que dé comienzo la ejecución del bloque, justo después de begin, dará comienzo la ejecución simultánea de las tareas definidas en las distintas variables del tipo task. En este caso TTareaA, TTareaB y 10 TTareasMúltiples. Pero esta situación es estática, no se pueden lanzar tareas en un determinado instante; para ello, se pueden emplear punteros como, por ejemplo:
Las tareas creadas con new siguen unas reglas de activación y dependencia ligeramente diferentes. Estas tareas inician su activación inmediatamente después de la evaluación del asignador de la sentencia new. Además, estas tareas no dependen de la unidad donde se crearon, sino que dependen del bloque, cuerpo de subprograma o cuerpo de tarea que contenga la declaración del tipo access en sí. Para referenciar a tareas dinámicas se emplea el nombre de la variable puntero seguido de .all, por ejemplo, T1.all. Si se quiere que termine una tarea creada dinámicamente se debe utilizar la sentencia abort. Por ejemplo, abort T1.all.
También se pueden crear varios ejemplares de un mismo tipo dependiendo de un parámetro denominado discriminante. Por ejemplo:

## Manual de referencia de Ada

* 9.1 Task Units and Task Objects
# Programación en Ada/Tareas/Ejemplos
## Ejemplos completos de tareas
### Semáforos

Una posible implementación del tipo abstracto semáforo es con tareas Ada. Pero este ejemplo no se ha de tomar muy en serio, puesto que es un típico caso de inversión de la abstracción, es decir, se hace uso de un mecanismo de alto nivel, las tareas, para implementar uno de bajo nivel, los semáforos. En Ada 95 la mejor manera de implementar un semáforo es un objeto protegido. Sin embargo a efectos didácticos es un buen ejemplo.

### Simulación de trenes

Solución propuesta:

### Buffer circular

Otro ejemplo, una posible implementación de un buffer circular:

### Problema del barbero durmiente

Esta es una solución al problema del barbero durmiente.

### Problema de los filósofos cenando

Una solución con tareas y objetos protegidos del conocido problema de los filósofos cenando.
Para evitar el bloqueo mutuo es totalmente imprescindible que al último filósofo se le asignen los cubiertos en ese orden. Sí se hiciese al contrario, el bloqueo no tardaría en aparecer (sobre todo si se eliminan las instrucciones delay):

### Chinos: una implementación concurrente en Ada
## Manual de referencia de Ada

* 9.11 Example of Tasking and Synchronization
# Programación en Ada/Tareas/Llamadas a punto de entrada complejas
## Llamadas a punto de entrada complejas

A veces, interesa que una llamada a un punto de entrada de una tarea cumpla unos requisitos. Esto es debido a que se puede bloquear el proceso que realiza la llamada y puede ser interesante disponer de métodos para desbloquearlo si no se cumplen unas determinadas condiciones.
La sentencia select, además de servir como selección de aceptaciones de puntos de entrada dentro del cuerpo de la tarea que los contiene, también proporciona mecanismos para seleccionar el comportamiento de las llamadas a puntos de entrada. Su sintaxis es la siguiente:

## Tipos de punto de entrada

Como puede apreciarse, hay tres posibles llamadas a puntos de entrada a parte de la simple, éstas son: llamada con tiempo límite, llamada condicional y transferencia asíncrona.

### Llamada con tiempo límite

Llama a un punto de entrada que es cancelado si no se produce la aceptación antes de que finalice un plazo de tiempo. Ejemplo:

### Llamada condicional

Llama a un punto de entrada que es cancelada si no es aceptada inmediatamente, es decir, tiene un tiempo límite nulo. Ejemplo:

### Transferencia asíncrona

Proporciona la transferencia asíncrona de control cuando se acepte la llamada a un punto de entrada o se cumpla un plazo de tiempo, mientras se esté ejecutando una secuencia de sentencias. Es decir, si se acepta la llamada al punto de entrada o cumple el plazo, se abortan las sentencias que se estuvieran ejecutando. Ejemplo:

## Manual de referencia de Ada

* 9.7.2 Timed Entry Calls
* 9.7.3 Conditional Entry Calls
* 9.7.4 Asynchronous Transfer of Control
# Seguridad informática/Lo básico en seguridad

Para empezar, primero hay que saber que es exactamente GNU/Linux. Como pueden ver en el artículo de nuestro proyecto hermano Wikipedia, se trata de un sistema operativo moderno, orientado a redes desde sus inicios, seguro y cada vez se hace más fácil de aprender sin mencionar que es el 3° sistema operativo más usado solo después de Mac y Windows .
GNU es de Código libre y Linux es de Código abierto, lo que significa que todo el mundo puede acceder al código fuente y verlo, aprender de el y modificarlo. Esto en lo que respecta a seguridad tiene tanto sus ventajas y desventajas .

## Dominios del usuario

A diferencia de Windows, en Linux, es el Usuario y no el sistema el que decide lo que tiene que hacerse; sólo un usuario raíz o Root (conocido como Superusuario) puede copiar, mover y eliminar archivos del sistema y los programas deben contar con el permiso de este usuario para poder realizar este tipo de acciones, en otras palabras: El usuario es la máxima autoridad y no el sistema.
Pero, si el ordenador solo tiene un solo usuario, no es necesario adueñarse de la contraseña de root para causar gran daño.

### Ventajas de seguridad en Linux

* Al disponerse del código fuente, muchas más personas pueden verlo y corregir los errores. Esto significa que comúnmente el exploit sale semanas después del parche.
* Sólo el usuario raíz puede instalar y desinstalar programas.
* El usuario es el que tiene la última palabra.
* Soporte técnico de voluntarios, también muchos foros de ayuda y opción de soporte profesional de pago.

### Desventaja de seguridad en Linux

* Según la distribución requiere un conjunto de conocimientos superiores a la media.
* El desconocimiento de los paquetes por parte del usuario puede acarrear problemas.
* Esto no lo hace inmune a otro tipo de prácticas como pueden ser el Phishing.
# Tecnologías de Internet/Nombres de dominio

El Domain Name System (sistema de nombres de dominio), más comúnmente llamado DNS, es una de las principales características de la Internet. Se trata de una base de datos distribuida que ayuda a traducir nombres de dominio, los cuales son más fáciles de recordar que sus direcciones numéricas. Por ejemplo, www.wikipedia.org es un nombre de dominio y 130.94.122.199, su dirección de Internet numérica asociada. El sistema de nombres de dominio actúa como una guía telefónica automatizada, de modo que uno puede "llamar" a www.wikipedia.org en vez de a 130.94.122.199. El sistema también maneja la traducción inversa, lo cual significa que una consulta por el número 130.94.122.199, devolverá el nombre de dominio larousse.wikipedia.org.
El DNS fue inventado en 1983 por Paul Mockapetris y las primeras especificaciones están descritas en RFC 882. En 1987 fueron publicadas RFC 1034 y RFC 1035, las cuales actualizaron las especificaciones del sistema DNS y convirtieron en obsoletas a las antiguas especificaciones. Más tarde fueron incorporadas otras especificaciones RFC, que agregan características al protocolo base.

## Enlaces externos

* Como Funciona el Hosting y Dominio
# Tecnologías de Internet/Protocolos

En redes, un protocolo de comunicaciones o protocolo de red es la especificación de una serie de reglas para un tipo particular de comunicación. La red Internet se basa en el modelo de referencia TCP/IP (Transmission Control Protocol/Internet Protocol) que toma su nombre de los dos principales protocolos que regulan la comunicación a través de esta red.
El modelo TCP/IP especifica los protocolos que rigen la comunicación entre varios nodos de la red. Esta comunicación se realiza a varios niveles, denominados "capas", siendo cada capa encargada de un determinado conjunto de funciones o tareas. Los protocolos de las distintas "capas" no son independientes entre sí, sino que utilizan los protocolos de la capa inferior para desarrollar sus funciones y ofrecen sus servicios a los protocolos de las capa superior.

## Capas

El modelo TCP/IP define cuatro "capas" (en orden ascendente): capa nodo-red, capa de red, capa de transporte y capa de aplicación.
* La capa nodo-red es la encargada de propocionar la conectividad de un nodo a la red. El modelo TCP/IP no define ningún protocolo en particular para esta capa, siendo valido cualquier protocolo que sea capaz de enviar paquetes IP desde el nodo hacia la red.
* La capa de red realiza funciones de encaminamiento y reenvio de los paquetes a traves de la red. El modelo TCP/IP define para esta capa el protocolo IP (Internet Protocol), que constituye el "corazón" de Internet y que esta definido en el RFC 791.
* La capa de transporte utiliza los servicios proporcionados por la capa de red para llevar a cabo una comunicación extremo a extremo entre dos nodos de la red. El modelo TCP/IP define en esta capa dos protocolos: TCP (Transmission Control Protocol), definido en el RFC 793, y UDP (User Datagram Protocolo), definido en el RFC 768. El protocolo TCP propociona una comunicación en la que los paquetes llegan al nodo destino ordenados y sin errores, mientras que el protocolo UDP ofrece una comunicación en la que los paquetes pueden llegar desordenados, con errores o incluso no llegar. La utilización de uno o otro protocolo desde la capa de aplicación viene dado por el tipo de servicio demandado. Una transferencia de ficheros necesita un servicio de transmisión fiable y sin errores, demandando por tanto las funcionalidades del protocolo TCP. Una transmisión de vídeo o audio en tiempo real necesita inmediatez en la comunicación no siendo críticos los errores en la transmisión, siendo en este caso el protocolo UDP el adecuado.
* En la capa de aplicación se encuentran los protocolos que se utilizan para ofrecer los servicios a los usuarios. Se definen en esta capa multitud de protocolos que proporcionan todo tipo de funciones entre las que se pueden destacar las siguientes: transferencia de ficheros (FTP), correo electrónico (SMTP), acceso a la Web (HTTP), terminal remoto (Telnet) y resolución de nombres (DNS).
# Artes culinarias/Recetas/Escalivada al microondas

| Cantidad para ? personas Número de Kcalorías / 100 g Kcal / 100g | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Tiempo de preparación (min) |
| | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Dificultad: ? |
| | Precio: ? |
| Ingredientes Aceite de oliva 1 berenjena partida por la mitad a lo largo. 1 pimiento rojo, también partido a lo largo. 1/2 cebolla. 1 pizca de sal. | Procedimiento Poner en un bol apto para microondas un chorro de aceite para la superficie. Añadir la berenjena, el pimiento, la media cebolla y la pizca de sal. Poner 15 minutos en el microondas, revisándolo la primera vez, cada 5 minutos. Pelar la berenjena y el pimiento y cortarlos en tiras. Servir. |
# Artes culinarias/Recetas/Ensaladilla de patata

| Cantidad para Nº de comensales personas ? Kcal / 100g | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Tiempo de preparación (min) |
| | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Dificultad: ? |
| | Precio: ? |
| Ingredientes 4 patatas medianas-grandes 6 tomates 1 lata de aceitunas negras 1 Lata de atún 4 huevos duros Aceite Vinagre Pimienta Sal | Procedimiento Lavamos las patatas y las ponemos a cocer sin pelar unos 30 min. (la cocción depende del tamaño de las patatas). Las dejamos enfriar, las pelamos y las cortamos en trocitos pequeños Lavamos los tomates y los cortamos en trozos. Picamos los huevos duros y las aceitunas. Lo mezclamos removiendo todo en un bol, para que los tomates suelten jugo, salpimentamos y aliñamos con el aceite y el vinagre. Añadimos el atún y volvemos a remover todo bien. |
# Artes culinarias/Recetas/Envinado para pastel

| Cantidad para ? personas ? Kcal / 100g | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | 5 ~ 10 minutos |
| | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Dificultad: |
| | Precio: ? |
| Ingredientes 1 lata de leche condensada 1 cajita de media crema 1 lata de leche evaporada 1/2 taza de vino jerez al gusto | Procedimiento Licuar todos los ingredientes, luego empapar el pan. La mezcla da para un kilogramo de pastel. |
# Artes culinarias/Recetas/Escalivada de verduras al microondas

| Cantidad para ? personas ? Kcal / 100g | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | 0 (min) |
| | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Dificultad: ? |
| | Precio: ? |
| Ingredientes | Procedimiento Servir. |
# Artes culinarias/Recetas/Ensaladilla de pimientos morrones

| Cantidad para 2 personas ? Kcal / 100g | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | 24 horas. |
| | Glosario A - B - C - D - E - F - G - H - I - J - K - L - M - N - Ñ - O - P - Q - R - S - T - U - V - W - X - Y - Z Navegar por categorías Aves | Carne | Cereales | Frutas | Legumbres | Mariscos | Pan | Pescados | Setas | Verduras | Postres | Regímenes | Zonas geográficas | Dificultad: |
| | Precio: ? |
| Ingredientes Pimientos morrones rojos y verdes. Huevo. Orégano. Ajo. Vinagre. Cebolla y Aceitunas negras/verdes. Aceite de oliva. Sal. | Procedimiento Ponemos sobre una sartén vieja en desuso los pimientos morrones rojos y verdes a asar y conforme los tengamos asando los metemos en una perola con objeto de que suden, es decir que aprovechando el calor que tienen y el vapor la piel se le pueda desprender mejor. Los dejamos de un día para otro. Pasado este tiempo le quitamos la piel y las pepitas, con ayuda de los dedos los vamos haciendo tiras finas que cortaremos por la mitad. Cocemos los huevos y los cortamos en rodajas. Cuando acabemos esto se le pone un poco de caldo que han soltado, el aceite y el vinagre. Machacamos un ajo junto con el orégano, con un poco sal gorda, se lo ponemos a los pimientos y mezclamos muy bien. Le ponemos las rodajas de huevo. Nota : También queda estupenda la ensaladilla si le picamos perejil fresco por encima. |