Examen: 2021_03_23 - myTeachingURJC/2020-2021-LTAW GitHub Wiki
- Tiempo: 2h
- Descripción: Examen parcial de LTAW
- Fecha: 2021/Marzo/23
- Formato: Presencial. Realizado a través de Aula virtual (sin internet)
- Puntuación: Todas las preguntas valen 0.5. Las preguntas incorrectas No restan
-
Temario: Entra todo lo visto tanto en teoría como en práctica hasta el momento:
- Teoría: S1-S5
- Práctica: L1-L5
¿Cual es la misión de un analizador sintáctico aplicado a un documento de marcado?
Dado el siguiente documento en SGML:
<!DOCTYPE urjc_ML SYSTEM "urjc_ml.dtd">
<urjc_ml>
<!-- Define campus = root-tag -->
<campus>
<nombre>Campus de Fuenlabrada</nombre>
<escuela>
<nombre>ETSI Telecomunicación</nombre>
<grado>
<nombre>Ingeniería en Sistemas Audiovisuales y Multimedia </nombre>
<asignatura>Laboratorio de Tecnologias Audiovisuales en la Web</asignatura>
<asignatura>Construcción de servicios y Aplicaciones Audiovisuales en Internet</asignatura>
</grado>
</escuela>
</campus>
</urjc_ml>
- Indica cuál es la etiqueta raiz del documento
- Indica qué etiquetas están en el nivel 3 de profundidad
Este arbol representa la estructura del tipo de documento generic, que está definido en el archivo llamado generic.dtd. Los nombres de las etiquetas de cada elemento del árbol están escritos en los nodos ovalados. Estos nombres son válidos y se encuentra definidos dentro del documento DTD. Escribe el documento SGML que representa esta estructura
Escribe un documento en markdown que produzca la siguiente salida
Indica cuáles son las operaciones básicas que realiza un servidor web
Explica en qué consiste la programación asíncrona y qué ventaja tiene a la hora de programar servidores web
Explica de forma general lo que hace el siguiente código: (No lo expliques línea a línea, sino en su totalidad)
const http = require('http');
const server = http.createServer((req, res) => {
res.write("Hola\n");
res.end();
});
server.listen(8080);
Explica para qué sirve la herramienta curl
Indica los diferenes campos de una URL y pon un ejemplo de una que contenga todos
Dado el siguiente código, indica el orden de escritura de los mensajes en la consola al arrancar el servidor y recibir una petición que tiene datos en el cuerpo del mensaje de solicitud
const http = require('http');
const server = http.createServer((req, res) => {
console.log("\nMENSAJE A")
req.on('data', (cuerpo) => {
console.log("MENSAJE B")
});
req.on('end', ()=> {
console.log("MENSAJE C");
res.setHeader('Content-Type', 'text/plain');
res.write("Soy el happy server\n");
res.end()
});
console.log("MENSAJE D");
});
console.log("MENSAJE E");
server.listen(8080);
console.log("MENSAJE F");
Un cliente realiza una petición HTTP para acceder a un servidor web. Si el recurso que solicita el cliente es una página html, explica si el servidor debe indicar algo en la cabecera del mensaje de respuesta
Dado el siguiente código, indica el orden de escritura de los mensajes en la consola al ejecutar el programa
const fs = require('fs');
console.log("Mensaje A");
const data1 = fs.readFileSync('fich1.txt','utf8');
console.log("Mensaje B");
const data2 = fs.readFileSync('fich2.txt', 'utf8');
console.log("Mensaje C");
Explica cuáles son los usos principales del lenguaje XML
Dado el siguiente documento
<?xml version="1.0" encoding="UTF-8"?>
<!-- Estructura de mi tienda -->
<!-- Nodo raiz -->
<tienda>
<!-- Mi tienda contiene productos/articulos -->
<producto>
Un producto
</producto>
<producto>
Otro producto
</producto>
</tienda>
- ¿Está bien formado?
- ¿Es válido?
Explica si en XML se puede definir una gramática, para qué nos sirve su definición y qué formas habría de definirla
Este documento se encuentra almacenado en el fichero test.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="tienda" type="xs:string">
</xs:element>
</xs:schema>
Indica si este otro documento es válido o no:
<?xml version="1.0" encoding="UTF-8"?>
<tienda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<producto>
Producto 1
</producto>
</tienda>
Explica algún otro uso del protocolo HTTP que no sea servir páginas web
Dado el siguiente documento en xML
<?xml version="1.0" encoding="UTF-8"?>
<tienda>
<producto>
<nombre>Alhambra II</nombre>
<descripcion>Placa con FPGA ice40HX8K</descripcion>
<stock>3</stock>
</producto>
<producto>
<nombre>Icestick</nombre>
<stock>10</stock>
</producto>
</tienda>
Reescríbelo en formato JSON
Una tienda tiene una base de datos para almacenar la siguiente información:
- Productos: En la tienda hay varios productos. Cada producto tiene un campo nombre y otro precio
- Pedidos: Almacena todos los pedidos pendientes que hay. Cada pedido tiene un nombre de cliente (cliente) y una dirección de entrega (direccion)
Actualmente la situación de la tienda es que tiene sólo dos productos A y B, cuyos precios son 10 y 20 respectivamente. Hay un pedido pendiente, realizado por el usuario Chuck Norris cuya dirección es "Puedo vivir donde quiera"
Escribe el documento JSON que almacena esa base de datos en la situación actual
Analiza el siguiente programa e indica qué información imprime en la consola
const cad = `[
{
"A": {
"a": [50, 30]
},
"D": "Soy A"
},
{
"A": {
"b": [33, 55]
},
"D": "Soy B"
}
]`
const f = JSON.parse(cad);
console.log(f[1]["A"]["b"][0]);
¿Cual es la misión de un analizador sintáctico aplicado a un documento de marcado?
Comprobar que el documento es sintácticamente correcto y crear la estructura de datos en árbol que representa a ese documento
Dado el siguiente documento en SGML:
<!DOCTYPE urjc_ML SYSTEM "urjc_ml.dtd">
<urjc_ml>
<!-- Define campus = root-tag -->
<campus>
<nombre>Campus de Fuenlabrada</nombre>
<escuela>
<nombre>ETSI Telecomunicación</nombre>
<grado>
<nombre>Ingeniería en Sistemas Audiovisuales y Multimedia </nombre>
<asignatura>Laboratorio de Tecnologias Audiovisuales en la Web</asignatura>
<asignatura>Construcción de servicios y Aplicaciones Audiovisuales en Internet</asignatura>
</grado>
</escuela>
</campus>
</urjc_ml>
- Indica cuál es la etiqueta raiz del documento
- Indica qué etiquetas están en el nivel 3 de profundidad
- La etiqueta raiz es urjc_ml
- Las etiquetas del nivel 3 son: nombre y grado
Este arbol representa la estructura del tipo de documento generic, que está definido en el archivo llamado generic.dtd. Los nombres de las etiquetas de cada elemento del árbol están escritos en los nodos ovalados. Estos nombres son válidos y se encuentra definidos dentro del documento DTD. Escribe el documento SGML que representa esta estructura
<!DOCTYPE generic SYSTEM "generic.dtd">
<Generic>
<Contenedor>
Texto 5
<Contenedor>
<Contenedor>
<Contenedor>Texto 1</Contenedor>
Texto 2
</Contenedor>
Texto 3
<Contenedor>
Text 4
</Contenedor>
</contenedor>
</Contenedor>
</Generic>
Escribe un documento en markdown que produzca la siguiente salida
# FPGAs
## FPGAs libres
### Familias
* ice40
* UP5K
* ECP5
### Placas
1. Alhambra II
2. Icestick
3. ULX3S
4. iceBreaker
5. TinyFPGA
Indica cuáles son las operaciones básicas que realiza un servidor web
Las tres operaciones principales del servidor son:
- Procesar la petición HTTP
- Obtener el rescurso pedido
- Generar el mensaje de respuesta y enviarlo al cliente
Explica en qué consiste la programación asíncrona y qué ventaja tiene a la hora de programar servidores web
En la programación asíncrona no se espera a que una tarea termine para iniciar la siguiente, sino que se inicia y se configura para que se llame a una función de retrollamada (callback) cuando ha terminado. En paralelo se continua con las siguientes tareas
Tiene la ventana de que reduce los tiempos de espera, ya que se hacen operaciones en background. Esto hace que el servidor tenga un mejor rendimiento
Explica de forma general lo que hace el siguiente código: (No lo expliques línea a línea, sino en su totalidad)
const http = require('http');
const server = http.createServer((req, res) => {
res.write("Hola\n");
res.end();
});
server.listen(8080);
Este programa recibe peticiones HTTP y genera un mensaje de respuesta que contiene "hola" en el cuerpo. Su comportamiento es el mismo para cualquier petición recibida (es un happy server)
Explica para qué sirve la herramienta curl
curl es una herramienta de la línea de comandos para realizar peticiones HTTP a servidores
Indica los diferenes campos de una URL y pon un ejemplo de una que contenga todos
La URL está formada por la unión de varios campos:
- Protocolo
- Host
- Recurso
- Fragmento
El resurso a su vez está formado por la ruta y la búsqueda
Ej. http://localhost:8080/mi_tienda/listado.html?articulo=pendrive#descripción
- Protocolo: http
- Host: localhost:8080
- Recurso: /mi_tienda/listado.html?articulo=pendrive
- Ruta: /mi_tienda/listado.html
- Búsqueda: articulo=pendrive
- Fragmento: descripcion
Dado el siguiente código, indica el orden de escritura de los mensajes en la consola al arrancar el servidor y recibir una petición que tiene datos en el cuerpo del mensaje de solicitud
const http = require('http');
const server = http.createServer((req, res) => {
console.log("\nMENSAJE A")
req.on('data', (cuerpo) => {
console.log("MENSAJE B")
});
req.on('end', ()=> {
console.log("MENSAJE C");
res.setHeader('Content-Type', 'text/plain');
res.write("Soy el happy server\n");
res.end()
});
console.log("MENSAJE D");
});
console.log("MENSAJE E");
server.listen(8080);
console.log("MENSAJE F");
Dado que esto es programación asíncrona, el ordenan de escritura en la consola está determinado por las funciones de retrollamada. Según acaban una tareas se van realizando las impresiones
- Mensaje E
- Mensaje F
- Mensaje A
- Mensaje D
- Mensaje B
- Mensaje C
Un cliente realiza una petición HTTP para acceder a un servidor web. Si el recurso que solicita el cliente es una página html, explica si el servidor debe indicar algo en la cabecera del mensaje de respuesta
El servidor siempre debe incluir en el mensaje de respuesta la cabecera Content-Type:
indicando el tipo de contenido que lleva en el cuerpo. Si se trata de un documento html debe especificar que es de tipo text/html
Dado el siguiente código, indica el orden de escritura de los mensajes en la consola al ejecutar el programa
const fs = require('fs');
console.log("Mensaje A");
const data1 = fs.readFileSync('fich1.txt','utf8');
console.log("Mensaje B");
const data2 = fs.readFileSync('fich2.txt', 'utf8');
console.log("Mensaje C");
En este programa se está utilizando el módulo fs para leer ficheros del sistema de ficheros. Como se está utilizando el método readFileSync, las lecturas son síncronas. Es decir, que hasta que no termina una no empieza la siguiente. Por tanto el orden de escritura en la consola es el esperado:
- Mensaje A
- Mensaje B
- Mensaje C
Explica cuáles son los usos principales del lenguaje XML
XML nos permite estructurar los datos bien para almacenarnos o bien para intercambiarlos entre aplicaciones. Entra los usos de almacenamiento encontramos:
- Bases de datos
- Ficheros de proyecto
- Ficheros de configuración
Dado el siguiente documento
<?xml version="1.0" encoding="UTF-8"?>
<!-- Estructura de mi tienda -->
<!-- Nodo raiz -->
<tienda>
<!-- Mi tienda contiene productos/articulos -->
<producto>
Un producto
</producto>
<producto>
Otro producto
</producto>
</tienda>
- ¿Está bien formado?
- ¿Es válido?
-
El documento es sintácticamente correcto. Las etiquetas están escritas con su sintáxis adecuada y cada cada etiqueta de apertura hay una cierre
-
Sin embargo no podemos saber si es válido o no porque no se ha especificado una gramática
Explica si en XML se puede definir una gramática, para qué nos sirve su definición y qué formas habría de definirla
En XML se puede definir una gramática opcionalmente. El definirla nos permite que los analizadores comprueben si se trata de un documento válido o no. La gramática se puede definir de dos formas: utilizando ficheros dtd o bien mediante esquemas en XML (Ficheros .xsd)
Este documento se encuentra almacenado en el fichero test.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="tienda" type="xs:string">
</xs:element>
</xs:schema>
Indica si este otro documento es válido o no:
<?xml version="1.0" encoding="UTF-8"?>
<tienda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<producto>
Producto 1
</producto>
</tienda>
El documento NO es válido. En el esquema se está especificando que en este documento sólo puede existir el elemento tienda, que es una cadena. No puede contener otras etiquetas en su interior
Explica algún otro uso del protocolo HTTP que no sea servir páginas web
El protocolo HTTP se utiliza también para el intercambio de información entre un cliente y un servidor. En ese caso lo que se intercambian son documentos de datos, que típicamente van en formatos como el XML o el JSON
Dado el siguiente documento en xML
<?xml version="1.0" encoding="UTF-8"?>
<tienda>
<producto>
<nombre>Alhambra II</nombre>
<descripcion>Placa con FPGA ice40HX8K</descripcion>
<stock>3</stock>
</producto>
<producto>
<nombre>Icestick</nombre>
<stock>10</stock>
</producto>
</tienda>
Reescríbelo en formato JSON
[
{
"nombre": "Alhambra II",
"descripción": "Placa con FPGA ice40HX8K",
"stock": 3
},
{
"nombre": "Icestick",
"stock": 10
}
]
Una tienda tiene una base de datos para almacenar la siguiente información:
- Productos: En la tienda hay varios productos. Cada producto tiene un campo nombre y otro precio
- Pedidos: Almacena todos los pedidos pendientes que hay. Cada pedido tiene un nombre de cliente (cliente) y una dirección de entrega (direccion)
Actualmente la situación de la tienda es que tiene sólo dos productos A y B, cuyos precios son 10 y 20 respectivamente. Hay un pedido pendiente, realizado por el usuario Chuck Norris cuya dirección es "Puedo vivir donde quiera"
Escribe el documento JSON que almacena esa base de datos en la situación actual
{
"productos": [
{
"nombre": "A",
"precio": 10
},
{
"nombre": "B",
"precio": 20
}
],
"pedidos": [
{
"cliente": "Chuck Norris",
"Direccion": "puedo vivir donde quiera"
}
]
}
Analiza el siguiente programa e indica qué información imprime en la consola
const cad = `[
{
"A": {
"a": [50, 30]
},
"D": "Soy A"
},
{
"A": {
"b": [33, 55]
},
"D": "Soy B"
}
]`
const f = JSON.parse(cad);
console.log(f[1]["A"]["b"][0]);
El programa crea la variable f a partir de la estructura dada en una cadena JSON. Luego se accede al primer número de la propiedad b dentro de la propiedad A del segundo elemento, que vale 33. En la consola se escribe 33
- Juan González-Gómez (Obijuan)
- Jose María Cañas