Lo esencial
parte de Ingeniería de Software para Aplicaciones de Internet por Eve
Andersson , Philip Greenspun y Andrew Grumet ; revisado en febrero de 2005
En este capítulo aprenderá a evaluar los entornos de desarrollo de aplicaciones
de Internet. Entonces elegirás uno. Entonces aprenderás cómo usarlo.
También aprenderá sobre el protocolo anónimo y sin estado que hace que
el desarrollo web sea diferente del desarrollo clásico de aplicaciones entre
computadoras. Aprenderá por qué el sistema de administración de bases de
datos relacionales es clave para controlar el problema de concurrencia que
surge de múltiples usuarios simultáneos. Desarrollará un software para leer y
escribir Lenguaje de marcado extensible (XML).
Protocolos de comunicaciones de estilo antiguo
En un protocolo de comunicaciones tradicional, el programa informático A
abre una conexión con el programa informático B. Ambos programas se
ejecutan continuamente durante la comunicación. Esto facilita que el
Programa B recuerde lo que el Programa A ya ha dicho. El programa B puede
acumular estado en su memoria. De hecho, la memoria puede contener un
registro completo de todo lo que ha pasado por el cable del Programa A.
**** inserte la figura aquí ****
Figura 2.1: En un protocolo de comunicaciones con estado tradicional, dos
programas que se ejecutan en dos computadoras separadas establecen una
conexión y proceden a usar esa conexión durante el tiempo que sea necesario,
generalmente hasta que uno de los programas finalice.
HTTP: sin estado y anónimo
El protocolo de transferencia de hipertexto (HTTP) es el medio fundamental
para intercambiar información y solicitar servicios en la Web. HTTP también
se usa al desarrollar servicios de texto para usuarios de teléfonos móviles y,
con VoiceXML, también se usa para implementar aplicaciones controladas
por voz.
Lo más importante que debe saber sobre HTTP es que no tiene estado . Si
ve diez páginas web, su navegador realiza diez solicitudes HTTP
independientes del servidor web del editor. En cualquier momento entre esas
solicitudes, puede reiniciar el programa de su navegador. En cualquier
momento entre esas solicitudes, el editor es libre de reiniciar su programa de
servidor.
Aquí está la anatomía de una sesión HTTP típica:
el usuario escribe "www.yahoo.com" en un navegador
el navegador traduce www.yahoo.com a una dirección IP e intenta
abrir una conexión TCP con el puerto 80 de esa dirección (TCP es el
"Protocolo de Control de Transmisión" y es el sistema fundamental a
través del cual dos computadoras en Internet envían flujos de bytes a
cada una otro.)
una vez que se establece una conexión, el navegador envía la
siguiente secuencia de bytes: "GET / HTTP / 1.0" (más dos avances
de línea de retorno de carro). "GET" significa que el navegador está
solicitando un archivo. El "/" es el nombre del archivo, en este caso
simplemente la página de índice raíz. El "HTTP / 1.0" dice que este
navegador preferiría obtener un resultado adherido al protocolo
HTTP 1.0.
Yahoo responde con un conjunto de encabezados que indican qué
protocolo se está utilizando realmente, si se encontró o no el archivo
solicitado, cuántos bytes contiene ese archivo y qué tipo de
información contiene (las Extensiones multipropósito de correo de
Internet o "Tipo de Mimica)
El servidor de Yahoo envía una línea en blanco para indicar el final
de los encabezados
Yahoo envía el contenido de su página de índice
La conexión TCP se cierra cuando el archivo ha sido recibido por
el navegador.
Puede probarlo usted mismo desde un shell del sistema operativo:
bash-2.03 $ telnet www.yahoo.com 80
Intentando 216.32.74.53 ...
Conectado a www.yahoo.akadns.net.
El carácter de escape es '^]'.
GET / HTTP / 1.0
HTTP / 1.0 200 OK
Longitud del contenido: 18385
Tipo de contenido: texto / html
<html><head> <title> Yahoo! </title> <base href = http:
//www.yahoo.com/> ...
En este caso, hemos utilizado el telnetcomando Unix con un argumento
opcional que especifica el número de puerto para el host de destino; todo lo
que escribe el programador se indica aquí en negrita. Escribimos la línea
"GET ..." nosotros mismos y luego presionamos Enter dos veces en el
teclado. El primer encabezado de Yahoo es "HTTP / 1.0 200 OK". El código
de estado HTTP de 200 significa que se encontró el archivo ("OK").
Consulte el estándar HTTP en http://www.w3.org/Protocols/ para obtener más información sobre HTTP.
No te pierdas demasiado en los detalles del ejemplo HTTP. El punto es
que cuando se termina la conexión, se termina. Si el usuario sigue un
hipervínculo de la página principal de Yahoo a "Fotografía", por ejemplo, esa
es una nueva solicitud HTTP. Si Yahoo está utilizando múltiples servidores
para operar su sitio, la segunda solicitud podría ir a una máquina
completamente diferente. Esto suena bien para navegar Yahoo. Pero suponga
que está comprando en un sitio de comercio electrónico como Amazon. Si
coloca algo en su carrito de compras en una solicitud HTTP, aún desea que
esté allí diez clics más tarde. O suponga que ha iniciado sesión en photo.net
con Click 23 y con Click 45 están respondiendo a una publicación en un foro
de discusión. No desea que el servidor de photo.net haya olvidado su
identidad y vuelva a exigir su nombre de usuario y contraseña.
Esto le presenta a usted, el ingeniero, un desafío: crear una experiencia de
usuario con estado además de un protocolo fundamentalmente sin estado.
¿Dónde puede almacenar el estado de una solicitud a otra? Quizás en un
archivo de registro en el servidor web. El servidor escribiría "Joe Smith quiere
tres copias de Bus Nine to Paradise de Leo Buscaglia". En cualquier solicitud
posterior de Joe Smith, el script del lado del servidor puede simplemente
verificar el registro y mostrar el contenido del carrito de compras. Sin
embargo, un problema con esta idea es que HTTP es anónimo. Un servidor
web no sabe que se está conectando Joe Smith. El servidor solo conoce la
dirección IP de la computadora que realiza la solicitud. A veces esto se
traduce en un nombre de host. Si se trata de joe-smiths-desktop.stanford.edu,
quizás pueda identificar las solicitudes posteriores de esta dirección IP como
provenientes de la misma persona. Pero, ¿qué sucede si es cache-
rr02.proxy.aol.com, uno de los servidores proxy HTTP que conecta a los 20
millones de usuarios de America Online a la Internet pública? Es probable que
la próxima solicitud del mismo usuario provenga de una dirección IP
diferente, es decir, otra computadora física dentro de los bastidores y
bastidores de máquinas proxy de AOL. La próxima solicitud de cache-
rr02.proxy.aol.com probablemente vendrá de una persona diferente, es decir,
otro ser humano físico entre los 20 millones de suscriptores de AOL que
comparten un grupo común de máquinas proxy.
De alguna manera, debe escribir cierta información a un usuario
individual que se devolverá en la próxima solicitud de ese usuario.
Si todas sus páginas son generadas por programas de computadora en
lugar de ser HTML estático, una idea sería reescribir todos los hipervínculos
en las páginas servidas. En lugar de enviar los mismos archivos a todos, con
las mismas URL incrustadas, personalice la salida para que un usuario que
sigue un enlace envíe información adicional al servidor. Aquí hay un ejemplo
de cómo amazon.com incrusta una clave de sesión en las URL:
1. Suponga que un comprador sigue un enlace a una página que muestra
un solo libro para la venta, por
ejemplo, http://www.amazon.com/exec/obidos/ASIN/1588750019/ . Te
nga en cuenta que 1588750019 es un número de libro estándar
internacional (ISBN) e identifica completamente el producto que se
presentará.
2. El servidor de amazon.com redirige la solicitud a una URL que incluye
una ID de sesión después de la última barra, por ejemplo,
"http://www.amazon.com/exec/obidos/ASIN/1588750019/103-
9609966-7089404"
3. Si el comprador pasa el mouse sobre los hipervínculos en la página
servida, notará que todos los hipervínculos contienen, al final, esta
misma ID de sesión.
Tenga en cuenta que la ID de esta sesión no cambia de longitud, sin importar
cuánto tiempo dura la sesión de un comprador o cuántos artículos se colocan
en el carrito de compras. El ID de sesión se está utilizando como clave para
buscar el contenido de la cesta de la compra en una base de datos dentro de
amazon.com. Una implementación alternativa sería codificar el contenido
completo del carrito de compras en las URL en lugar de la ID de la
sesión. Supongamos, por ejemplo, que Joe Shopper pone tres libros en su
carrito de compras. El servidor de Amazon podría simplemente agregar tres
ISBN a todas las URL de hipervínculo que pudiera seguir, separadas por
barras. Las URL se alargarán un poco, pero los programadores de Amazon
pueden alentarse con esta cita de la especificación HTTP:
El protocolo HTTP no establece ningún límite a priori en la longitud de un
URI. Los servidores DEBEN poder manejar el URI de cualquier recurso que
sirvan, y DEBERÍAN poder manejar los URI de longitud ilimitada si
proporcionan formularios basados en GET que podrían generar dichos
URI. Un servidor DEBERÍA devolver el estado 414 (Request-URI Too Long)
si un URI es más largo de lo que el servidor puede manejar (consulte la
sección 10.4.15).
No hay necesidad de preocuparse por rechazar a los mejores clientes de
Amazon, aquellos con carritos de compras realmente grandes, con un estado
de devolución de "414 Request-URI Too Long". O hay Aquí hay un
comentario de la especificación HTTP:
Nota: Los servidores deben tener cuidado al depender de las longitudes de
URI superiores a 255 bytes, porque algunas implementaciones de cliente o
proxy más antiguas podrían no ser compatibles con estas longitudes.
Tal vez es por eso que amazon.com en vivo real almacena solo la ID de sesión
en las URL.
Galletas
En lugar de jugar juegos con la reescritura de hipervínculos en páginas
HTML, podemos aprovechar una extensión de HTTP conocida
como cookies . Dijimos que necesitábamos una forma de escribir cierta
información a un usuario individual que se devolverá en la próxima solicitud
de ese usuario. El primer párrafo de "Cookies HTTP de estado de cliente
persistente de Netscape - Especificación preliminar"
( http://wp.netscape.com/newsref/std/cookie_spec.html ) dice
Las cookies son un mecanismo general que las conexiones del lado del
servidor (como los scripts CGI) pueden usar para almacenar y recuperar
información en el lado del cliente de la conexión. La adición de un estado
simple, persistente, del lado del cliente extiende significativamente las
capacidades de las aplicaciones cliente / servidor basadas en la Web.
¿Como funciona? Después de que Joe Smith agrega un libro a su carrito de
compras, el servidor escribe
Set-Cookie: cart_contents=1588750019; path=/
Mientras Joe no cierre su navegador, en cada solicitud posterior a su servidor,
el navegador agrega un encabezado:
Cookie: cart_contents=1588750019
Sus scripts del lado del servidor pueden leer este encabezado y extraer el
contenido actual del carrito de compras.
¿Suena como la solución perfecta? En cierto modo lo es. Si eres un
experto en informática, puedes enorgullecerte del hecho de que este es un
sistema de administración de bases de datos distribuidas. En lugar de
mantener un gran archivo de registro en su servidor, está guardando
fragmentos de información en miles de máquinas de usuarios en todo el
mundo. Pero un problema con las cookies es que la especificación lo limita a
pedirle a cada navegador que almacene no más de 20 cookies en nombre de su
servidor y cada una de esas cookies no debe tener más de 4 kilobytes de
tamaño. Un problema menor es que la información de las cookies se pasará de
nuevo a su servidor en cada carga de página. Si realmente se ha entregado al
estacionar 80 Kbytes de información en 20 cookies y su usuario está en un
módem, esto ralentizará la interacción en la Web.
Un problema más profundo con las cookies es que no son portátiles para
el usuario. Si Joe Smith comienza a comprar desde su computadora de
escritorio en el trabajo y quiere continuar desde un teléfono móvil en un taxi o
desde un navegador web en casa, no puede recuperar el contenido de su
carrito hasta el momento. El carrito de compras reside en la memoria de su
computadora en el trabajo.
Un último problema con las cookies es que un pequeño porcentaje de
usuarios las ha desactivado debido a los problemas de privacidad ilustrados en
la figura 2.2.
Figura 2.2: Las cookies junto con el comportamiento abierto de los
navegadores de los años 90 significaron el fin de la privacidad en
Internet. Supongamos que tres editores cooperan y aceptan publicar todos sus
anuncios publicitarios de http://noprivacy.com. Cuando Joe User visita search-
engine.com y escribe "crema para el acné", la página vuelve con un IMG que
hace referencia a noprivacy.com. El navegador de Joe visitará
automáticamente noprivacy.com y solicitará "el GIF para SE9734". Si esta es
la primera vez que Joe usa cualquiera de estos tres servicios de cooperación,
noprivacy.com emitirá un encabezado Set-Cookie al navegador de
Joe. Mientras tanto, search-engine.com envía un mensaje a noprivacy.com
diciendo "SE9734 fue una solicitud de páginas de crema para el acné". La
cadena "crema para el acné" se almacena en la base de datos de
noprivacy.com junto con "browser_id 7586". Cuando Joe visita
bigmagazine.com, se ve obligado a registrarse y dar su nombre, dirección de
correo electrónico, dirección de Snail y número de tarjeta de crédito. No hay
anuncios en bigmagazine.com. Tienen demasiada integridad para eso. Por lo
tanto, incluyen en sus páginas un IMG que hace referencia a un GIF en blanco
en noprivacy.com. El navegador de Joe solicita "el GIF en blanco para
BM17377" y, debido a que está hablando con noprivacy.com, el sitio que
emitió el encabezado Set-Cookie, el navegador incluye un encabezado de
cookie que dice "I'm browser_id 7586". Cuando todo está dicho y hecho, la
gente de noprivacy.com conoce el nombre del usuario de Joe, sus intereses y
el hecho de que ha descargado seis archivos JPEG desde
kiddieporn.com. Tienen demasiada integridad para eso. Por lo tanto, incluyen
en sus páginas un IMG que hace referencia a un GIF en blanco en
noprivacy.com. El navegador de Joe solicita "el GIF en blanco para
BM17377" y, debido a que está hablando con noprivacy.com, el sitio que
emitió el encabezado Set-Cookie, el navegador incluye un encabezado de
cookie que dice "I'm browser_id 7586". Cuando todo está dicho y hecho, la
gente de noprivacy.com conoce el nombre del usuario de Joe, sus intereses y
el hecho de que ha descargado seis archivos JPEG desde
kiddieporn.com. Tienen demasiada integridad para eso. Por lo tanto, incluyen
en sus páginas un IMG que hace referencia a un GIF en blanco en
noprivacy.com. El navegador de Joe solicita "el GIF en blanco para
BM17377" y, debido a que está hablando con noprivacy.com, el sitio que
emitió el encabezado Set-Cookie, el navegador incluye un encabezado de
cookie que dice "I'm browser_id 7586". Cuando todo está dicho y hecho, la
gente de noprivacy.com conoce el nombre del usuario de Joe, sus intereses y
el hecho de que ha descargado seis archivos JPEG desde kiddieporn.com.
Un enfoque de ingeniería razonable para usar cookies es enviar un
identificador único para los datos en lugar de los datos, tal como en el ejemplo
de "ID de sesión en la URL" de amazon.com descrito anteriormente. La
información sobre el contenido del carrito de compras se mantendrá en algún
tipo de registro en el servidor. Esto significa que se puede recoger desde otra
ubicación. Para ver cómo funciona esto en la práctica, vaya al shell de un
sistema operativo y solicite la página de inicio de photo.net:
bash-2.03 $ telnet www.eveandersson.com 80
Intentando con 64.94.245.206 ...
Conectado a www.eveandersson.com.
El carácter de escape es '^]'.
GET / HTTP / 1.0
HTTP / 1.0 200 OK
Set-Cookie: ad_browser_id = 3291092; Ruta = /; Caduca = Vie, 01-Ene-
2010 01:00:00 GMT
Set-Cookie: ad_session_id = 3291093% 2c0% 2c6634C478EF46FC%
2c10622158; Ruta = /; Edad máxima = 86400
Set-Cookie: last_visit = 1071622158; ruta = /; caduca = Vie, 01-Ene-
2010 01:00:00 GMT
Tipo de contenido: texto / html; juego de caracteres = iso-8859-1
Versión MIME: 1.0
Fecha: jueves, 03 de febrero de 2005 00:49:18 GMT
Servidor: AOLserver / 3.3.1 + ad13
Longitud del contenido: 8289
Conexión: cerrar
<html>
<head>
...
Tenga en cuenta que se establecen dos cookies. El
primero, ad_browser_idtiene una fecha de vencimiento explícita en enero de
2010. Esto le indica al navegador que registre el valor de la cookie, en este
caso "3291092", en el disco duro. El valor de la cookie continuará siendo
enviado de vuelta al servidor durante los próximos cinco años, incluso si el
usuario cierra y reinicia el navegador. ¿Cuál es el punto de tener una cookie
de navegador? Si el usuario dice "Prefiero solo texto" o "Prefiero el idioma
francés", es probable que valga la pena mantener esta información con el
navegador. La preferencia de solo texto puede estar relacionada con una
conexión lenta de Internet a esa computadora. Si la computadora está en una
casa llena de francófonos, es probable que todas las personas que comparten
el navegador prefieran el francés.
El segundo conjunto de cookies, ad_session_idexpirará después de una
hora ("Max-Age = 3600"). Si no se establece explícitamente para caducar,
caducaría cuando el usuario salga de su navegador. Las cosas que vale la pena
asociar con una ID de sesión incluyen el contenido de un carrito de compras
en un sitio de comercio electrónico, aunque tenga en cuenta que si photo.net
fuera un sitio de compras, ¡no sería una buena idea caducar la cookie de
sesión después de una hora! Es molesto construir un carrito, recibir llamadas
de su computadora durante unas horas y luego volver a comenzar cuando
regresa a lo que creía que era una página web que funcionaba.
Si iniciamos sesión en photo.net, habría una tercera cookie, una que
identifica al usuario. Los idiomas y las preferencias de presentación
almacenados en el servidor en nombre del usuario anularían las preferencias
mantenidas con la ID del navegador.
Almacenamiento del lado del servidor
Tiene información de identificación que sale y regresa de los navegadores, ya
sea a través de la extensión de cookies a HTTP o reescritura de URL. Ahora
tiene que encontrar una manera de mantener la información asociada en el
servidor web.
Para obtener flexibilidad en la forma en que presenta y analiza los datos
aportados por los usuarios, es probable que desee mantener la información en
forma estructurada. Por ejemplo, sería bueno que varios usuarios pusieran una
tabla de todos los artículos en los carritos de compras. Y otra tabla de
pedidos. Y otra tabla de reseñas de productos aportados por el lector. Y otra
tabla de preguntas y respuestas.
¿Cuál es una buena herramienta para almacenar tablas de
información? Considere primero un programa de hoja de cálculo. Estos son
económicos y fáciles de usar. Nunca se debe aplicar una tecnología más
compleja que la necesaria para resolver un problema. Algo como Visicalc,
Lotus 1-2-3 , Microsoft Excel o StarOffice Calc parecería funcionar bien.
El problema con un programa de hoja de cálculo es que está diseñado
para un usuario. El programa escucha la entrada del usuario de dos fuentes:
mouse y teclado. El programa informa sus resultados a un solo lugar: la
pantalla. Cualquier fuente de persistencia para un servidor web tiene que lidiar
con miles de usuarios simultáneos que leen y escriben en la base de
datos. Este es el problema que los sistemas de administración de bases de
datos (DBMS) estaban destinados a resolver.
Una buena manera de pensar en un sistema de gestión de bases de datos
relacionales (RDBMS, el tipo más popular de DBMS) es como un programa
de hoja de cálculo que se encuentra dentro de un armario oscuro. Si necesita
crear una nueva mesa, deslice una pequeña tira de papel debajo de la puerta
con "CREAR TABLA ..." escrito en ella. Para agregar una fila de datos a esa
tabla, desliza otra pequeña tira debajo de la puerta que dice
"INSERTAR ...". Para cambiar algunos datos dentro de la tabla, escriba
"ACTUALIZAR ..." en una tira de papel. Para eliminar una fila, envía una tira
que comienza con "BORRAR".
Tenga en cuenta que hemos resuelto el problema
de concurrencia aquí. Supongamos que solo tiene una copia del Bus Nine to
Paradise en el inventario y 1000 usuarios al mismo tiempo solicitan el trabajo
del Dr. Buscaglia. Al organizar las tiras de papel en una fila, el programa en el
armario puede decidir procesar un INSERTAR en la tabla de pedidos y
rechazar los otros 999. Esto es mejor que 1000 personas peleando por un solo
teclado y mouse.
Una vez que hayamos enviado información al armario, ¿cómo podemos
recuperarla? Podemos escribir una solicitud de informe en una tira de papel
que comience con "SELECCIONAR" y deslizarla debajo de la puerta. El
DBMS en el armario oscuro preparará un informe para nosotros y lo deslizará
hacia nosotros bajo la misma puerta.
¿Cómo evaluamos si un DBMS es o no lo suficientemente potente para
nuestra aplicación? A partir de la década de 1960, IBM propuso la "prueba
ACID":
Atomicidad
Los resultados de la ejecución de una transacción son todos
confirmados o revertidos. Todos los cambios surten efecto, o
ninguno lo hace. Suponga que un usuario se está registrando
cargando el nombre, la dirección y el retrato JPEG en tres tablas
separadas. Un script web le dice a la base de datos que realice
tres inserciones como parte de una transacción. Si el disco duro
se llena después de insertar el nombre y la dirección pero antes
de que se pueda almacenar el retrato, los cambios en las tablas de
nombre y dirección se revertirán.
Consistencia
La base de datos se transforma de un estado válido a otro estado
válido. Una transacción es legal solo si obedece las restricciones
de integridad definidas por el usuario. No se permiten
transacciones ilegales y, si no se puede satisfacer una restricción
de integridad, la transacción se revierte. Por ejemplo, suponga
que define una regla que las publicaciones en una tabla del foro
de discusión deben atribuirse a una ID de usuario válida. Luego
contratas a Joe Novice para que escriba algunas páginas de
administración. Joe escribe una página de eliminación de
usuarios que no se molesta en verificar si la eliminación dará
como resultado una publicación huérfana en el foro de
discusión. Sin embargo, un DBMS compatible con ACID
verificará y anulará cualquier transacción que resulte en que un
usuario eliminado publique un foro de discusión.
Aislamiento
Los resultados de una transacción son invisibles para otras
transacciones hasta que se complete la transacción. Por ejemplo,
suponga que tiene una página para mostrar nuevos usuarios y sus
fotografías. Esta página está codificada de acuerdo con la
directiva del editor de que habrá un retrato para cada usuario y
presentará una imagen rota si no la hay. Jane Newuser se está
registrando en su sitio al mismo tiempo que Bill Olduser está
viendo la nueva página de usuario. El script que procesa el
registro de Jane ha completado la inserción de su nombre y
dirección en sus respectivas tablas. Pero no se hace almacenando
su retrato JPEG. Si la consulta de Bill comienza antes de que se
confirme la transacción de Jane, Bill no verá a Jane en absoluto
en su página de nuevos usuarios, a pesar de que la inserción de
Jane en algunas de las tablas esté completa.
Durabilidad
Una vez comprometidos (completados), los resultados de una
transacción son permanentes y sobreviven a fallas futuras del
sistema y los medios. Suponga que su sistema de comercio
electrónico inserta un pedido de un cliente en una tabla de base
de datos y luego le indica a CyberSource que le facture al cliente
$ 500. Un milisegundo más tarde, antes de que CyberSource
reciba una respuesta de su servidor, alguien tropieza con el cable
de alimentación de la máquina. Un DBMS compatible con ACID
no se habrá olvidado del nuevo pedido. Además, si un
programador derrama café en una unidad de disco, será posible
instalar un nuevo disco y recuperar las transacciones hasta el
derrame de café, lo que demuestra que intentó facturar a alguien
por $ 500 y aún no está seguro de lo que sucedió en
CyberSource. Tenga en cuenta que para lograr la parte D de
ACID se requiere que su computadora tenga más de un disco
duro.
¿Por qué el sistema de gestión de bases de datos relacionales?
¿Por qué el sistema de gestión de bases de datos relacionales (RDBMS) es la
tecnología dominante para la persistencia detrás de un servidor web? Hay tres
factores principales.
El primer pilar de la popularidad de RDBMS es un lenguaje de consulta
declarativo llamado "SQL". El estilo de programación más común no es
declarativo; se llama "imperativo" o "procesal". Le dice a la computadora qué
hacer, paso a paso:
hacer esto
hacer esto
hacer esto
si es después del 17 de marzo de 2023, haga esto, esto y luego
esto; de lo contrario haz esto
haz esto
...
Los programas escritos en este estilo tienen dos inconvenientes. Primero, se
vuelven rápidamente complejos y luego solo pueden ser desarrollados y
mantenidos por programadores profesionales. En segundo lugar, contienen
muchos errores. Por ejemplo, el programa esbozado anteriormente puede tener
bastantes errores. No es después del 17 de marzo de 2023. Por lo tanto, no
podemos estar seguros de que los pasos especificados en la cláusula
ENTONCES de la declaración IF no contengan errores.
Un estilo alternativo de programación es "declarativo". Le decimos a la
computadora lo que queremos, por ejemplo, un informe de usuarios que han
estado registrados por más de un año pero que no han respondido ninguna
pregunta en el foro de discusión. No le decimos al RDBMS si primero debe
escanear la tabla de usuarios y luego verificar la tabla del foro de discusión o
viceversa. Solo especificamos las características deseadas del informe y es
tarea del RDBMS prepararlo.
Detener a alguien en la calle. Elija a alguien con ropa de moda para
asegurarse de que no sea un programador profesional. Pregúntele a esta
persona: "¿Alguna vez ha programado en un lenguaje informático
declarativo?" Siga eso con "¿Alguna vez ha usado un programa de hoja de
cálculo?" Lo más probable es que pueda encontrar algunas personas que le
dirán que nunca han escrito ningún tipo de programa de computadora, pero
que han desarrollado modelos de hoja de cálculo bastante sofisticados. ¿Por
qué? El lenguaje de la hoja de cálculo es declarativo: "Haga que esta celda sea
la suma de estas otras tres celdas". El usuario no le dice al programa de hoja
de cálculo en qué orden realizar el cálculo, simplemente el resultado deseado.
El lenguaje declarativo de la hoja de cálculo creó una explosión en la
cantidad de personas que pudieron desarrollar programas de computadora en
funcionamiento. A mediados de la década de 1970, las organizaciones que
trabajaban con datos mantenían un equipo de programadores. Si desea realizar
un análisis, llame a uno a su oficina, explique los supuestos y las fórmulas que
se utilizarán, luego espere unos días para recibir un informe. En 1979, Dan
Bricklin (MIT EECS '73) y Bob Frankston (MIT EECS '70) desarrollaron
Visicalc y, de repente, la mayoría de las personas que habían estado pidiendo
servicios de programación pudieron construir sus propios modelos.
Con un RDBMS, las pequeñas tiras metafóricas de papel empujadas
debajo de la puerta son programas declarativos en lenguaje
SQL. (Consulte SQL para Web Nerds en http://philip.greenspun.com/sql/ para
obtener un tutorial de lenguaje SQL).
El segundo pilar de la popularidad de RDBMS es el aislamiento de datos
importantes de los errores de los programadores. Con otros tipos de sistemas
de gestión de bases de datos, es posible que un programa informático realice
cambios arbitrarios en el conjunto de datos. Esto puede ser conveniente para
aplicaciones como sistemas de diseño asistidos por computadora con
estructuras de datos muy complejas. Sin embargo, si su objetivo es preservar
un conjunto de datos durante un período de veinticinco años, dejar que los
programas imperativos con errores arbitrarios hagan cambios arbitrarios no es
una buena idea. El RDBMS limita a los programadores a pronunciar
declaraciones muy simples de la forma INSERTAR, ELIMINAR y
ACTUALIZAR. Además, si no está satisfecho con el contenido de su base de
datos, simplemente puede revisar todas las tiras de papel que se empujaron
debajo de la puerta. Cada tira contendrá una instrucción SQL y el nombre del
programa o programador que creó la tira. Esto facilita corregir errores y
reformar delincuentes.
El tercer y último pilar de la popularidad de RDBMS es un buen
rendimiento con muchos miles de usuarios simultáneos. Esto es más una
reflexión sobre el estado refinado del desarrollo comercial de sistemas como
IBM DB2, Oracle, Microsoft SQL Server y PostgreSQL de código abierto,
que una característica inherente del propio RDBMS.
Los pasos
Al crear cualquier aplicación de Internet, deberá seguir los siguientes pasos:
1. Desarrollar un modelo de datos. ¿Qué información vas a almacenar y
cómo la representarás?
2. Desarrolle una colección de transacciones legales en ese modelo, por
ejemplo, inserciones y actualizaciones.
3. Diseña el flujo de la página. ¿Cómo interactuará el usuario con el
sistema? ¿Qué pasos llevarán a una de esas transacciones
legales? (Tenga en cuenta que el "flujo de página" abarca el diseño de
interacción en la Web, navegadores móviles, y también a través de
menús jerárquicos de voz en VoiceXML pero no en sistemas de
conversación de voz).
4. Implementar las páginas individuales. Escribirá scripts que consultan
información del modelo de datos, ajustan esa información en una
plantilla (en HTML para una aplicación web) y devuelven el resultado
combinado al usuario.
Es muy poco probable que tenga una opción de herramientas para el
almacenamiento persistente. Utilizará un RDBMS y no tomará ninguna
decisión tecnológica fundamental en los Pasos 1 o 2. Diseñar el flujo de la
página es un ejercicio puramente abstracto. Hay algunos límites impuestos por
la tecnología en la interfaz, pero generalmente se derivan de estándares
públicos como HTML, XHTML Mobile Profile y VoiceXML. Por lo tanto, no
necesita hacer ninguna elección de tecnología para el Paso 3.
El paso 4 es intelectualmente poco interesante y también poco interesante
desde el punto de vista de la ingeniería. Un servicio de Internet vive o muere
según los pasos 1 a 3. ¿Qué puede hacer el servicio por el usuario? ¿El flujo
de la página es comprensible y utilizable? Las respuestas a estas preguntas se
determinan en los Pasos 1 a 3. Sin embargo, el Paso 4 es donde tiene una
amplia gama de opciones tecnológicas y, por lo tanto, parece generar mucha
discusión. Este curso y este libro son neutrales sobre el tema de cómo se lleva
a cabo el Paso 4, pero proporcionamos alguna orientación sobre cómo tomar
decisiones.
Primero, sin embargo, retrocedamos y asegurémonos de que todos sepan
HTML.
HTML
Aquí hay algunos HTML legales:
My Samoyed is really hairy.
Ese es un documento HTML perfectamente aceptable. Escríbalo en un
editor de texto, guárdelo como index.html y póngalo en su servidor web. Un
servidor web puede servirlo. Un usuario con Netscape Navigator puede
verlo. Un motor de búsqueda puede indexarlo.
Supongamos que quieres algo más expresivo. Desea que la
palabra realmente esté en cursiva:
My Samoyed is <I>really</I> hairy.
HTML significa lenguaje de marcado de hipertexto. El <I> es
marcado. Le dice al navegador que comience a representar palabras en
cursiva. </I> cierra el elemento <I> y detiene las cursivas. Si quieres ser más
sabroso, puedes decirle al navegador que realmente enfatice la palabra :
My Samoyed is <EM>really</EM> hairy.
La mayoría de los navegadores usan cursiva para enfatizar, pero algunos
usan negrita y los navegadores para terminales ASCII antiguos (por ejemplo,
Lynx) tienen que ignorar esta etiqueta o proponer un método de
representación inteligente. Un usuario exigente con el programa de navegador
adecuado puede incluso personalizar la representación de etiquetas
particulares.
Hay unas pocas docenas más de etiquetas en HTML. Puede aprenderlos
eligiendo Ver código fuente desde su navegador web cuando visite sitios cuyo
formato admire. Puede consultar el capítulo de referencia HTML de este
libro . Puede aprenderlos comenzando en el directorio de guías y tutoriales
HTML de
Yahoo, http://dir.yahoo.com/Computers_and_Internet/Data_Formats/HTML/
Guides_and_Tutorials/ . O puede comprar HTML y XHTML: la guía
definitiva (Musciano y Kennedy; O'Reilly, 2002).
Estructura del documento
Armado con una gran pila de etiquetas, puede comenzar a esparcirlas entre sus
palabras más o menos al azar. Aunque los navegadores son extremadamente
indulgentes con el marcado técnicamente ilegal, es útil saber que un
documento HTML consta oficialmente de dos partes: la cabeza y
el cuerpo . El encabezado contiene información sobre el documento en su
conjunto, como el título. El cuerpo contiene información que debe mostrar el
navegador del usuario.
Otro problema de estructura es que debe intentar asegurarse de cerrar
todos los elementos que abra. Si su documento tiene un <BODY>, debería
tener un </BODY> al final. Si inicia una tabla HTML con un <TABLE> y no
tiene un </TABLE>, un navegador puede mostrar nada. Las etiquetas pueden
superponerse, pero debe cerrar la última vez abierta antes del resto, por
ejemplo, para algo en negrita y cursiva:
My Samoyed is <B><I>really</I></B> hairy.
Algo que confunde a muchos usuarios nuevos es que el elemento <P>
utilizado para rodear un párrafo tiene una etiqueta de cierre opcional
</P>. Los navegadores por convención suponen que un elemento <P> abierto
está implícitamente cerrado por el siguiente elemento <P>. Esto lleva a
muchos editores (incluido el viejo vago) a usar elementos <P> como
separadores de párrafos.
Aquí está el código fuente HTML de un documento web simplemente
formateado:
<html>
<head>
<title>Nikon D1 Digital Camera Review</title>
</head>
<body bgcolor=white text=black>
<h2>Nikon D1</h2>
by <a href="http://philip.greenspun.com/">Philip Greenspun</a>
<hr>
Little black spots are appearing at the top of every ...
<h3>Basics</h3>
The Nikon D1 is a good digital camera for ...
<p>
The camera's 15.6x23.7mm CCD image sensor ...
<h3>User Interface</h3>
If you wanted a camera with lots of buttons, switches, and dials ...
<hr>
<address>
<a href="mailto:[email protected]">[email protected]</a>
</address>
</body>
</html>
Repasemos este documento pieza por pieza (vea cómo
se ve un navegador).
La etiqueta <HTML> en la parte superior dice "Soy un documento
HTML". Tenga en cuenta que esta etiqueta se cierra al final del
documento. Resulta que esta etiqueta es innecesaria. Hemos guardado el
documento en el archivo "simply-page.html". Cuando un usuario solicita este
documento, el servidor web mira la extensión ".html" y agrega
un encabezado MIME para indicarle al navegador del usuario que este
documento es del tipo "text / html".
El elemento HEAD aquí es útil principalmente para que el elemento
TITLE se pueda usar para dar un nombre a este documento. Cualquier texto
que coloque entre <TITLE> y </TITLE> aparecerá en la parte superior de la
ventana del navegador del usuario, en el menú Ir (Netscape) o Atrás (MSIE),
y en el menú de marcadores si el usuario marca esta página. Después de cerrar
la cabeza con un </HEAD>, abrimos el cuerpo del documento con una
etiqueta <BODY>, a la que se agregan algunos parámetros que establecen el
fondo en blanco y el texto en negro. Algunos navegadores web tienen un
fondo gris predeterminado, y la falta de contraste resultante entre el fondo y el
texto es tan difícil para los usuarios que puede valer la pena cambiar los
colores manualmente. Esto es una violación de los principios de diseño de la
interfaz, ya que potencialmente introduce una inconsistencia en la experiencia
del usuario en la Web.
Justo debajo del cuerpo, tenemos un título, tamaño 2, envuelto en una
etiqueta <H2>. Esto se mostrará al usuario en la parte superior de la
página. Probablemente deberíamos usar <H1>, pero los navegadores suelen
representarlo en una fuente terriblemente grande. Debajo del titular, la frase
"Philip Greenspun" es un ancla de hipertexto , por lo que está envuelto en un
elemento A. El <A HREF=dice "esto es un hipervínculo". Si el lector hace clic
en cualquier lugar desde aquí hasta </A>, el navegador debe buscar
http://philip.greenspun.com/.
Después del título, el autor y la navegación opcional, colocamos una
etiqueta de regla horizontal: <HR>. Una de las cosas buenas que aprendimos
del diseñador Dave Siegel (ver http://philip.greenspun.com/wtr/getting-dates )
es no usar en exceso las reglas horizontales: los diseñadores gráficos reales
usan espacios en blanco para la separación. Usamos titulares <H3> en el texto
para separar las secciones y solo ponemos un <HR> en la parte inferior del
documento.
Debajo del último <HR>, firmamos nuestros documentos con la dirección
de correo electrónico del autor. De esta manera, un lector puede desplazarse
hasta la parte inferior de la ventana del navegador y averiguar quién es
responsable de lo que acaba de leer y dónde enviar las correcciones. La
etiqueta <ADDRESS> generalmente produce una representación en cursiva
de los programas del navegador. Tenga en cuenta que este está envuelto en
una etiqueta de anclaje con un destino de "mailto:" en lugar de "http:". Si el
usuario hace clic en el texto de anclaje (dirección de correo electrónico de
Philip), el navegador mostrará una ventana de "enviar correo a
[email protected]".
Elegir un entorno de programación
Ahora puedes elegir un entorno de programación para el resto del semestre. Si
ha estado creando aplicaciones de Internet respaldadas por RDBMS durante
algún tiempo, puede usar lo que haya estado usando. El cambio de
herramientas rara vez es un camino hacia la gloria. Si no ha creado este tipo
de software antes, siga leyendo ...
Elegir un RDBMS
Probablemente hay tres opciones razonables para un RDBMS este semestre:
(1) Microsoft SQL Server, (2) Oracle y (3) PostgreSQL.
Para programadores experimentados de Windows, Microsoft SQL Server
es fácil de instalar y administrar. Y si espera pasar el resto de su vida
profesional en un entorno de Microsoft, también podría aprenderlo.
La concurrencia es la demanda más fuerte de Oracle en relación con sus
competidores comerciales. En Oracle, los lectores nunca esperan a los
escritores y los escritores nunca esperan a los lectores. Supongamos que el
editor en un sitio grande inicia una consulta a las 12:00 p.m., resumiendo el
uso por parte del usuario. Oracle podría tener que pasar una hora revisando
200 GB de datos de seguimiento. Las unidades de disco se muelen y una CPU
se usa completamente hasta la 1:30 PM. Supongamos además que el Usuario
# 356712 entra a las 12:30 PM y cambia su dirección de correo electrónico,
actualizando así una fila en elusersmesa. Si la consulta de seguimiento de uso
llega a esta fila a las 12:45 p.m., Oracle notará que la fila se modificó por
última vez después de que comenzó la consulta. Debajo de la "I" en ACID, se
requiere que Oracle aísle al editor de la actualización del usuario. Oracle lo
hace al alcanzar el segmento de reversión y producir datos de la fila de
usuarios # 356712 como era a las 12:00 PM cuando comenzó la
consulta. Aquí está el escenario en una tabla:
Hora Editor Aplicación web pública
12:00 PM Inicia una consulta de 90 minutos que -
resume el uso del año anterior.
12:30 PM el resumen de uso continúa disminuyendo El usuario # 356712 actualiza la
dirección de correo electrónico
de "
[email protected]" a
"
[email protected]"
12:45 p.m. el resumen de uso llega al usuario # -
356712; Oracle llega al segmento de
reversión y saca "
[email protected]" para el
informe, ya que ese era el valor a las 12:30
p.m.
1:30 DE informe de resumen de uso completado -
LA
TARDE
¿Cómo se desarrollaría esto en Microsoft SQL Server? Cuando estás leyendo,
tomas bloqueos de lectura en la información que estás a punto de leer. Nadie
puede escribir hasta que los sueltes. Cuando escribes, tomas bloqueos de
escritura en la información que estás a punto de actualizar. Nadie puede leer ni
escribir hasta que suelte las cerraduras. En el ejemplo anterior, el usuario #
356712 enviaría su solicitud de cambio de dirección a las 12:30 p.m. El
subproceso en el servidor web se bloquearía esperando que se borren los
bloqueos de lectura. ¿Cuánto tiempo esperaría? Una hora completa con un
ícono de "navegador que sigue recibiendo información" en la esquina superior
derecha de la ventana del navegador. Si está atento, puede programar en torno
a esta arquitectura de bloqueo en SQL Server,
La única opción realista del purista de código abierto para un RDBMS es
PostgreSQL, disponible en www.postgresql.org . De alguna manera,
PostgreSQL tiene características más avanzadas que cualquier RDBMS
comercial, y tiene un sistema de concurrencia de múltiples versiones estilo
Oracle. PostgreSQL es fácil de instalar y administrar, pero no es utilizado por
operadores de grandes servicios porque no hay forma de construir una
instalación de PostgreSQL realmente masiva o una que pueda tolerar fallas de
hardware.
La mayoría de los ejemplos de SQL en este libro usarán la sintaxis de
Oracle. Esto se debe en parte a que Oracle es el RDBMS más popular del
mundo, pero principalmente porque Oracle es lo que teníamos en MIT cuando
comenzamos a trabajar en esta área en 1994 y, por lo tanto, tenemos sistemas
de archivos completos llenos de código Oracle. Los suplementos del conjunto
de problemas (consulte el final del capítulo) pueden contener traducciones
para bases de datos SQL ANSI, como Microsoft SQL Server y PostgreSQL.
Elegir un lenguaje de procedimiento
Como se mencionó anteriormente, la mayoría de las veces su código de
procedimiento, también conocido como "scripts web", hará poco más que
consultar el RDBMS y fusionar los resultados con una plantilla HTML,
XHTML Mobile Profile o VoiceXML. Por lo tanto, su productividad y la
capacidad de mantenimiento del código no se verán muy afectadas por la
elección del lenguaje de procedimiento.
Dicho esto, pongamos una palabra amable para los lenguajes de script. Si
necesita escribir algunas abstracciones pesadas, siempre puede hacerlas en
Java ejecutándose dentro de Oracle o C # ejecutándose dentro de Microsoft
.NET. Pero para su capa de presentación, es decir, páginas individuales, no
pase por alto las ventajas de usar lenguajes más simples y terser como Perl,
Tcl y Visual Basic.
Elegir un entorno de ejecución
A continuación hay algunas cosas que debe buscar al elegir servidores web y
servidores web / de aplicaciones.
una URL = un archivo
Lo primero que debe buscar en un entorno de ejecución es la propiedad de que
una URL visible para el usuario corresponde a un archivo en el sistema de
archivos. Es mucho más rápido depurar un sistema si, dada una queja sobre
http://photo.net/foobar, puede saber que encontrará el programa informático
responsable en el sistema de archivos en
/web/photonet/www/foobar.something . Programación de entornos donde esto
es cierto
Perl CGI
Páginas de Microsoft Active Server
Páginas del servidor Java
Plantillas ADP de AOLserver y scripts .tcl
Una notable excepción a esta propiedad son los servlets de Java. Un servlet
normalmente procesa varias URL. Esto resulta engorroso en la práctica
porque te ralentiza cuando intentas corregir un error en el código de otra
persona. Las ideas de modularidad y reutilización de código son agradables,
pero trate de pensar en cuántos archivos debe pasar un programador para
corregir un error. Uno es genial Dos probablemente está bien. N donde N es
incierto no está bien.
filtros
Dijimos que la modularidad y la reutilización de código podrían ser arrojadas
a favor de preservar el principio sagrado de "una URL = un archivo". La
forma en que obtiene la modularidad y la reutilización del código es a través
de filtros , la capacidad de indicar al servidor web que "ejecute este fragmento
de código antes de servir cualquier URL que comience con / yow /". Esto es
particularmente útil para el código de control de acceso. Suponga que tiene
quince scripts que constituyen la experiencia de administración para un
sistema de concurso. Desea asegurarse de que solo los administradores
autorizados puedan usar las páginas. La comprobación del acceso
administrativo requiere una consulta SQL. Podrías escribir un procedimiento
llamado CheckForContestAdminAuthoritye indique a sus autores de guiones
que incluyan una llamada a este procedimiento en cada uno de los quince
guiones de administración. Todavía tiene quince copias de algún código: una
instrucción IF, una llamada a procedimiento y una llamada a un procedimiento
de mensaje de error si CheckForContestAdminAuthoritydevuelve "no
autorizado". Pero la consulta SQL se produce solo en un lugar y puede
actualizarse centralmente.
El principal problema con este enfoque no son las quince copias de la
declaración IF y sus consecuentes. El problema es que inevitablemente uno de
los autores del guión olvidará incluir el cheque. Entonces su sitio tiene un
agujero de seguridad. Cierra el agujero y elimina catorce copias de la
declaración IF instalando el código como filtro de servidor. Tenga en cuenta
que para que esto funcione, el mecanismo de filtro debe incluir una API para
cancelar el servicio de la página solicitada. Su filtro debe poder decirle al
servidor web "No continúe sirviendo al usuario con el script o documento
solicitado".
URL abstractas
Como ingeniero, sus principales contribuciones a un servicio de Internet serán
el modelo de datos y el diseño de interacción (Pasos 1 a 3). Cuando está
esbozando el flujo de la página para un foro de discusión en una pizarra
blanca, le da a las páginas nombres como "todos los temas", "un tema", "un
hilo", "respuesta posterior", "publicación- responder-confirmar ", etc.
Llamemos a estas URL abstractas. Suponga que elige implementar su servicio
en las páginas del servidor Java. ¿Tiene sentido que las URL sean "all-
topics.jsp", "one-topic.jsp", "one-thread.jsp", etc.? ¿Por qué los usuarios
deberían ver que has usado JSP? ¿Deberían importarles? Y si cambia de
opinión y cambia a Perl, ¿cambiará las URL visibles para el usuario a "all-
topics.pl", "one-topic.pl", "one-thread.pl", etc.? Esto romperá los marcadores
de todos. Más importante aún, este cambio romperá todos los enlaces de otros
sitios a los suyos. Es un alto precio a pagar por un cambio de implementación
que debería haber sido invisible para los usuarios finales.
Necesita un entorno de programación web lo suficientemente potente
como para poder construir algo que llamaremos un procesador de
solicitudes . Este programa analiza una URL abstracta entrante, por ejemplo,
"un tema", y sigue la siguiente lógica:
¿hay un archivo .jsp en el sistema de archivos? si es así, ejecútelo
busque encabezados que soliciten el perfil móvil XHTML para un
navegador de teléfono celular; si es así y hay un archivo .mobile en el
sistema de archivos, sírvase, si no, continúe
busque un archivo .html
busca un .jpg
buscar un .gif
(Querrá personalizar el orden de preferencia para su servidor).
registro centralizado de consultas RDBMS
El trabajo principal de sus scripts web será formular consultas y transacciones
SQL. Si las cosas salen mal, la información más valiosa que puede obtener es
"qué le dijeron mis scripts web al RDBMS y en qué orden". Los mejores
programas de servidor web / de aplicaciones tienen un único archivo de
registro de errores en el que opcionalmente escribirán todas las consultas que
se envían al RDBMS.
Ejercicios
Después de resolver estos problemas sabrás
Cómo iniciar sesión en su servidor de desarrollo
Rudimentos de cualquier lenguaje de programación que hayas
elegido
Cómo crear, ejecutar, probar y depurar una página web dinámica
Cómo escribir una página web que consulta un servidor extranjero
Rudimentos de SQL
Cómo consultar un RDBMS desde el shell
Cómo escribir una página web que consulta un RDBMS
Cómo personalizar aplicaciones web mediante la emisión y lectura
de cookies
Cómo leer y escribir datos en XML
Cómo cargar un archivo plano de datos en una tabla RDBMS
Si está utilizando Microsoft .NET, encontrará ejemplos útiles
en http://philip.greenspun.com/seia/examples-basics/dot-net-examples/ .
Ejercicio 1: Encuentra tu lugar en el mundo
Encuentre la raíz de la página de su servidor web, el directorio donde el
servidor web comienza a buscar archivos. Coloque un archivo llamado
"index.html" y llénelo con texto que lo identifique como su servidor. Incluya
su dirección de correo electrónico con hipervínculo en la parte inferior de la
página.
Conéctese a su servidor desde un navegador web, utilizando solo el
nombre de host. Para el resto de este conjunto de problemas, asumiremos que
su nombre de host es "yourhostname.com". Verifique que cuando solicite
http://yourhostname.com se presente su página personalizada. Si obtiene una
lista de directorio, su servidor web probablemente no esté configurado para
buscar archivos de índice llamados "index.html"; Tendrá que volver a
configurar su servidor. Ahora use un validador HTML para asegurarse de que
su HTML sea legal (consulte el directorio de validadores HTML de Yahoo
en http://dir.yahoo.com/Computers_and_Internet/Data_Formats/HTML/Valid
ation_and_Checkers/ para obtener una lista de programas y servicios).
Ha realizado al menos dos solicitudes desde su servidor web ahora. Estos
se habrán registrado en el registro de acceso al servidor. Encuéntrelo en el
sistema de archivos y verifique que los tiempos y archivos solicitados
mostrados tienen sentido para usted.
Ejercicio 2: tu primer programa
Cree un subdirectorio llamado "básicos" en el mismo nivel en el sistema de
archivos que el archivo index.html que acaba de crear, es decir, los básicos
deben estar un nivel por debajo de la raíz del servidor web. Este directorio
debe estar accesible en http://yourhostname.com/basics/
Coloque un archivo en el directorio para que sea accesible en
http://yourhostname.com/basics/my-first-program (si aún no ha descubierto
cómo implementar URL abstractas, esto puede ser "my-first- program.pl "o"
my-first-program.asp "o similar).
Cuando visitemos http://yourhostname.com/basics/my-first-program
deberíamos ver la hora actual envuelta en una página HTML legal de algún
tipo, firmada con su dirección de correo electrónico.
Agregue un código que generará un error de división por cero en su
programa. Busque y visite el registro de errores del servidor para ver cómo se
le comunica este error. Con algunos entornos de ejecución, es posible que el
mensaje de error y el seguimiento de la pila se presenten en la ventana del
navegador cuando se produce el error. Si puede configurar su servidor de esta
manera, encontrará que la depuración va mucho más rápido este semestre. De
lo contrario, asegúrese de saber cómo mostrar rápidamente los últimos
errores. En una máquina Unix, usaría el comando "tail -f error.log" en un shell
o "Mx revert-buffer" en un editor de Emacs que visita el registro de errores.
Justo antes del código que genera el error de división por cero, agregue
una línea de código para escribir el siguiente mensaje en el registro de errores:
"A punto de dividir por cero". Solicite http://yourhostname.com/basics/my-
first-program de un navegador nuevamente y luego visite el registro de errores
para verificar que su declaración "A punto de dividir por cero" precede al
error real.
Ejercicio 3: procesamiento de formularios
Visite http://philip.greenspun.com/seia/examples-basics/lens y mire la
calculadora de distancia focal en "¿Exactamente cuánto tiempo necesita una
lente?"
Haga que este servicio funcione en su servidor. Tenga en cuenta que esto
implicará (1) aprender un poco sobre formularios HTML, (2) seguir el enlace
"ver el código fuente" en la página de resultados en photo.net y extraer la
fórmula matemática del programa allí, (3) estacionamiento un archivo .html
estático que contiene el formulario en su servidor en / basics / lens-calculator,
y (4) estacionando un programa para procesar el formulario en / basics / lens-
calculator-2.
(Tenga en cuenta la convención de nomenclatura anterior. Cuando sea
posible este semestre, nos gustaría que adhiera a la idea de que un script que
procesa un formulario en "foobar" se encuentra en "foobar-2". Si hay una
tubería de pasos que el usuario debe seguir, nos gusta verlos en "foobar",
"foobar-2", "foobar-3", etc.)
Ejercicio 3a: Agregar un enlace de código fuente de vista
Una gran parte de nuestro trabajo este semestre es mirar el código fuente de
otras personas. Hacemos esto para poder examinar enfoques alternativos para
el mismo problema. Puede facilitar esto agregando un enlace "ver fuente" en
la parte inferior de la página que acaba de crear. Un usuario que haga clic en
este enlace debe recibir un archivo que muestre todo el código fuente detrás
de la página en cuestión, pero que no incluya los procedimientos compartidos
con otras páginas del sitio.
Sugerencias: querrá entregar su script y cualquier archivo de plantilla, si
corresponde, con un tipo MIME de "texto / sin formato". De esta manera, el
navegador receptor no intentará representar la fuente HTML. Algunos
navegadores web son súper agresivos e intentan representar cualquier cosa
que se parezca a HTML, incluso si aparece sin el tipo MIME text / html. Un
enfoque alternativo que funciona con dichos navegadores es citar todo su
HTML reemplazando <con <, >con >y & con &, luego envolver el
código fuente en una <PRE>etiqueta.
Servidores que consultan servidores externos
Algunas de las proporciones más altas de logro a esfuerzo se pueden lograr
agregando información de múltiples fuentes de datos existentes. Considere,
por ejemplo, el Reloj de riqueza personal de Bill Gates,
en http://philip.greenspun.com/WealthClock (Figura 2.3). Este programa
consulta a un servidor público de cotización de acciones (el primer "servidor
extranjero") para encontrar el precio actual de las acciones de Microsoft
Corporation. El segundo servidor extranjero consultado es un "reloj de
población" de la Oficina del Censo de EE. UU. Para obtener una estimación
de la población actual de EE. UU.
Figura 2.3: El reloj de riqueza personal de Bill Gates. Este programa consulta
un servidor público de cotizaciones de acciones para encontrar el precio de las
acciones de Microsoft y el servidor de la Oficina del Censo de los Estados
Unidos para la población actual de los Estados Unidos, luego combina los
números en una página.
Hay varias cosas interesantes sobre este programa, que fue creado por uno de
los autores en 1995. Uno es que fue habilitado por la existencia de un
procedimiento integrado en AOLserver que salió y tomó una página de
Internet en general,ns_httpget. Esto permitió que todo el proyecto se
completara en una hora. La ingeniería tiene que ver con el costo. Si la
creación de esta pequeña aplicación hubiera requerido varios días de trabajo,
probablemente no se hubiera hecho. Un segundo elemento que vale la pena
señalar es que el programa ha requerido un mantenimiento sustancial a lo
largo de los años, superando con creces su costo de desarrollo inicial. El
programa se basa en el uso de expresiones regulares para extraer datos de
páginas HTML que están diseñadas para los ojos humanos. Como los editores
de las fuentes de datos subyacentes han cambiado su formato HTML a lo
largo de los años, estas expresiones regulares han tenido que actualizarse.
El último punto que vale la pena mencionar acerca de este programa es
que parte de la hora de codificación fue para construir un almacenamiento en
caché o una memoria de propósito generalsistema para registrar los resultados
de evaluar cualquier expresión Tcl en una variable global. ¿Por qué? Parecía
un mal netiquette escribir un programa que tuviera el potencial de imponer
una carga irrazonable en la Oficina del Censo y los servidores de cotización
de acciones. Además, en caso de que el reloj de riqueza se hiciera popular,
pediría los mismos datos a los servidores subyacentes varias veces por
segundo. Por último, parecía que los usuarios no deberían tener que esperar a
que se buscaran las dos páginas subsidiarias si no necesitaban datos
actualizados. Con la página HTML completa almacenada en una variable
global, está disponible desde el espacio de memoria virtual de AOLserver y se
puede acceder a ella mucho más rápido que incluso un archivo estático. Los
usuarios que desean una respuesta en tiempo real pueden exigir una con un
clic adicional del mouse. El cálculo realizado para ellos luego actualiza el
caché para usuarios ocasionales.
El mecanismo de almacenamiento en caché puede sonar como una
ingeniería excesiva, pero de vez en cuando el reloj de riqueza se vincularía
desde sitios de noticias extremadamente populares y recibiría varias
solicitudes por segundo. La capacidad de manejar una carga razonablemente
alta como esa, a mediados de la década de 1990, sin una enorme granja de
servidores era bastante rara. Si esas solicitudes se hubieran transmitido
directamente a la Oficina del Censo, por ejemplo, todo el servicio se habría
ralentizado.
El código fuente de este programa está disponible
en http://philip.greenspun.com/seia/examples-basics/wealth-clock.tcl.txt y
puede resultar útil para hacer el próximo ejercicio.
Ejercicio 4: compra comparativa de libros
Basándose en el Reloj de riqueza personal de Bill Gates y su código fuente
como modelo, cree una nueva aplicación web que tome el ISBN de un libro de
un formulario y consulte a varias librerías en línea para encontrar información
sobre precios y acciones. Los resultados deben mostrarse en una tabla HTML
(precio y en stock / fuera de stock en cada tienda). Haga que su servicio esté
disponible en / basics / books (el formulario de inscripción) y / basics / books-
2 (la página de resultados).
Sugerimos consultar barnesandnoble.com y www.powells.com. Su
programa debe ser robusto a los tiempos de espera, errores en sitios
extranjeros y problemas de red. En otras palabras, en ninguna situación su
usuario debería obtener una página de "Error de servidor 500". Para garantizar
esto, tendrá que aprender sobre el manejo de excepciones en el idioma
elegido. En Java, por ejemplo, querrás usar tryy catch. Pruebe su programa
con los siguientes ISBN: 0590353403, 0140260404, 0679762906,
1588750019.
Intente agregar más librerías, pero es posible que tenga problemas para
que funcionen. Por ejemplo, amazon.com y wordsworth.com tienden a
responder con una redirección 302 si el cliente no les da una ID de sesión en
la consulta.
Crédito adicional: ¿Cuál de los libros anteriores establece que "El avance
matemático obvio sería el desarrollo de una manera fácil de factorizar
números primos grandes"?
"Recuerda que es un error comparar a Harry Potter con Shakespeare ... Eso es porque Harry Potter es un personaje
ficticio mientras que Shakespeare era un autor. Lo que realmente deberías hacer es comparar a JK Rowling con
Shakespeare" - Jin S. Choi .
Ejercicio 5: Hablando con el RDBMS
Resulta que toma menos tiempo aprender los conceptos básicos de SQL que
averiguar cómo entregar un comando SQL a su RDBMS. Estas instrucciones
son para Oracle. Consulte su suplemento si está utilizando otro RDBMS.
En Unix, la forma más conveniente de conducir Oracle es generalmente
desde Emacs, suponiendo que ya es un usuario de Emacs. Escriba "Mx shell"
para obtener un shell de Unix. Escriba "Mx rename-buffer" para cambiar el
nombre del shell a "sql-shell" para que siempre pueda escribir "Mx shell"
nuevamente y obtener un shell del sistema operativo. En el búfer de sql-shell,
escriba "sqlplus" para iniciar SQL * Plus, el cliente de shell de Oracle. Si está
utilizando Windows, busque el programa "SQLPLUS.EXE" o
"PLUS80.EXE".
SQL * Plus le pedirá un nombre de usuario y contraseña. Si está
utilizando un servidor de desarrollo proporcionado por la escuela, es posible
que necesite obtenerlos de su TA. Si configura el RDBMS usted mismo, es
posible que necesite crear un nuevo espacio de tabla y usuario antes de poder
hacer este ejercicio.
Escriba lo siguiente en el indicador de SQL * Plus para crear una tabla
para realizar un seguimiento de las clases que está tomando este semestre:
create table my_courses (
course_number varchar(20)
);
Tenga en cuenta que debe finalizar sus comandos SQL con un punto y coma
en SQL * Plus. Estos no son parte del lenguaje SQL y no debe usarlos al
escribir SQL en sus scripts web.
Inserte algunas filas, por ejemplo,
insert into my_courses (course_number) values ('6.171');
Mira lo que tienes:
select * from my_courses;
Compromete tus cambios:
commit;
Tenga en cuenta que hasta que haya escrito este COMMIT, otro usuario de la
base de datos conectada no habría podido ver la fila que insertó. El "usuario
de la base de datos conectada" incluye el servidor web. Una fuente común de
consternación de los estudiantes con Oracle es que insertaron información con
SQL * Plus y descuidaron COMPROMETERSE. La nueva información no
aparece en ninguna de sus páginas web, y se arrancan el pelo de la
depuración. Por supuesto, no hay nada malo con sus guiones. Es solo que las
garantías de ACID significan que el servidor web ve una vista diferente de la
base de datos que el usuario que está en medio de una transacción.
Su vista de la tabla no debería cambiar después de un COMPROMISO,
pero tal vez verifique nuevamente:
select * from my_courses;
Uno de los principales beneficios de usar un RDBMS es la persistencia . Todo
lo que cree se queda incluso después de cerrar sesión. Normalmente, eso es
algo bueno, pero en este caso probablemente quieras limpiar después de tu
experimento:
drop table my_courses;
Salga de SQL * Plus con el quitcomando.
Interludio de lectura
Ahora sería un buen momento para tomar un descanso y leer sobre
SQL. Sugerimos los capítulos 1 a 9 de SQL para Web
Nerds en http://philip.greenspun.com/sql/ .
Ejercicio 6: scripts web que hablan con el RDBMS
Mire el archivo http://philip.greenspun.com/seia/examples-basics/quotations-
pseudo-code.txt , que es un seudocódigo para una página que muestra las citas
que se han almacenado en la base de datos Oracle.
Si sus instructores son amables con usted, ya habrán traducido este
pseudocódigo en algo que funcione con la infraestructura que está utilizando
en su escuela. Si no, tendrá que traducirlo usted mismo, junto
con http://philip.greenspun.com/seia/examples-basics/quotation-add-pseudo-
code.txt . Estacione su programa terminado en / basics / quotes (más una
extensión de archivo si es necesario). Agregue un hipervínculo desde la
página de índice de su sitio a este servicio.
Use el formulario en la página web para agregar manualmente algunas
citas. Si no se siente inspirado para surfear, aquí hay algunos para comenzar:
"Me siento como ese pueblo judío en Alemania en 1942". - Ted
Turner (al no poder comprar otra estación de TV)
"Si un hombre habla en el bosque y no hay una mujer allí para
escucharlo, ¿sigue equivocado?" - Heroína desconocida
"Los hombres son como un buen vino. Todos comienzan como
uvas, y es nuestro trabajo pisotearlos y mantenerlos en la oscuridad,
donde madurarán y se convertirán en algo con lo que desearían
cenar". - Heroína desconocida
"Una mujer necesita cuatro animales en su vida. Un visón en el
armario. Un jaguar en el garaje. Un tigre en la cama. Y un asno para
pagar todo". - Anne Slater
"Un editor debería tener un proxeneta para un hermano, así que
tendría a alguien a quien admirar". - Gene Fowler
"La computadora más nueva puede simplemente agravar, a la
velocidad, el problema más antiguo en las relaciones entre los seres
humanos, y al final el comunicador se enfrentará con el viejo
problema, qué decir y cómo decirlo". - Edward R Murrow
"El egotismo es el anestésico que mitiga el dolor de la estupidez". -
Frank Leahy
"Algunos por su renombre, en pedazos de aprendizaje, y piensan
que se vuelven inmortales como citan". - Edward Young
Regrese a su cliente de shell RDBMS (por ejemplo, SQL * Plus para
Oracle) y select *desde la tabla para ver que su cotización ha sido insertada
en la tabla.
En su cliente de shell RDBMS, inserte una cita con un código SQL
codificado a mano. Para ver la forma del comando INSERT de SQL que debe
usar, examine el código en la página cita-agregar. Después de crear esta nueva
fila de tabla, select *vuelva a hacerlo , y ahora debería ver dos filas.
Sugerencia: no olvide que las cadenas de comillas SQL utilizan comillas
simples, no comillas dobles.
Ahora vuelva a cargar la quotationsURL desde su navegador web. Si no
ve su nueva cita aquí, es porque no escribió "commit"; en SQL * Plus y el
servidor web está protegido de ver la transacción sin terminar.
Ejercicio 6a: eliminación de la lock tablevía a través de una secuencia
Lea sobre el objeto de base de datos de secuencia de Oracle en los capítulos
"Modelado de datos" y "Transacciones" de SQL para Web
Nerds en http://philip.greenspun.com/sql/data-modeling y http://philip.greensp
un.com/sql / transacciones . Al crear una secuencia, debería poder editar el
guión de agregar comillas a
eliminar la necesidad de lock table
elimine la maquinaria de transacción (ya que ya no está vinculando
varias instrucciones SQL juntas)
generar una clave única para la nueva cita dentro de la instrucción
INSERT
Ejercicio 7: mejora de la interfaz de usuario para la entrada de datos
Vuelva a la página principal de citas y modifíquela para que la entrada de
categorías se realice a través de un cuadro de selección de categorías
existentes (deseará utilizar el comando SQL "SELECCIONAR
DISTINCT"). Para las nuevas categorías, proporcione un cuadro de entrada de
texto alternativo denominado "nueva categoría". Asegúrese de modificar
quote-add para que reconozca cuándo se está definiendo una nueva categoría.
Ejercicio 8: búsqueda
Agregue un pequeño formulario en la parte superior de / basics / quotes que
toma una sola palabra de consulta del usuario. Cree un objetivo para este
formulario que devuelva todas las citas que contengan la palabra
especificada. Su búsqueda debe ser entre mayúsculas y minúsculas y también
mirar a través de la columna de autores. Sugerencias: like '%foo%'y
SQL UPPERy LOWERfunciones.
Ejercicio 9: personaliza tu servicio con cookies
Ahora implemente la personalización por navegador de la base de datos de
cotizaciones. El objetivo general debe ser
Un usuario puede "matar" una cita y hacer que nunca vuelva a
aparecer desde la página de nivel superior o desde la página de
búsqueda.
Matar una cita es persistente y sobrevive a la salida y reinicio de un
navegador.
Las citas eliminadas por un usuario no tienen efecto sobre lo que
ven otros usuarios.
Los usuarios pueden borrar sus personalizaciones y volver a ver la
base de datos completa de cotizaciones haciendo clic en el enlace
"borrar mi personalización" en la página principal. Este enlace
debería aparecer solo si el usuario ha personalizado la base de datos
de cotizaciones.
Implementará esto usando cookies. A partir de su suplemento tecnológico,
deberá aprender a leer los encabezados de solicitud HTTP entrantes y luego
analizar el encabezado de la cookie o quizás tenga una API que le permita
obtener fácilmente el valor de una cookie en particular. Tenga en cuenta que
puede expirar una cookie volviendo a emitirla con una fecha de vencimiento
que ya ha pasado.
Sugerencia 1: es posible construir este sistema utilizando una cookie de
ID para el navegador y manteniendo el conjunto de citas canceladas en el
RDBMS. Sin embargo, si no va a permitir que los usuarios inicien sesión y
reclamen su perfil, realmente no tiene mucho sentido mantener los datos en el
servidor.
Sugerencia 2: no es estrictamente copacetic con la especificación de
cookies, pero los navegadores aceptan valores de cookies que contienen
espacios. Por lo tanto, puede almacenar las citas eliminadas como una lista
separada por espacios si lo desea.
Sugerencia 3: no filtre las citas en su script web. Generalmente es una
señal de programación incompetente cuando consulta más datos del RDBMS
de los que va a mostrar al usuario final. SQL es un lenguaje de consulta muy
poderoso. Puede usar la función NO EN para excluir una lista de citas.
Ejercicio 10: publicación de datos en XML
Como aprendió anteriormente al consultar las librerías, los datos en la Web no
se han formateado tradicionalmente para su uso conveniente por parte de los
programas de computadora. En teoría, las personas que desean intercambiar
datos a través de la Web pueden cooperar utilizando XML, un estándar de
1998 del Consorcio Web ( http://www.w3.org/XML/ ). En la práctica, tendrá
dificultades para obtener cualquier cooperación basada en XML del sitio web
promedio en este momento (2005). Afortunadamente para completar este
conjunto de problemas, puede cooperar con sus compañeros: el objetivo
general es hacer que las citas en su base de datos se puedan exportar en un
formato estructurado para que las aplicaciones de otros estudiantes puedan
leerlas.
Esto es lo que necesitamos para cooperar:
una URL acordada en el servidor de todos donde se puede obtener
la base de datos de citas: "/ basics / quotes-xml"
Un formato acordado para las citas.
(De hecho, podríamos evitar la necesidad de un acuerdo previo estableciendo
infraestructuras para el descubrimiento de servicios y empleando técnicas
para la autodescripción de datos , los cuales trataremos más adelante en el
semestre, pero mantendremos las cosas simple por ahora)
Formatearemos las citas usando XML, una notación convencional para
describir datos estructurados. Las estructuras XML consisten en cadenas de
datos encerradas en etiquetas tipo HTML del formulario <foo>y
que </foo>describen qué tipo de cosas se supone que son los datos.
Aquí hay un ejemplo informal, que muestra la estructura que usaremos
para nuestras citas:
<quotations>
<onequote>
<quotation_id>1</quotation_id>
<insertion_date>2004-01-26</insertion_date>
<author_name>Britney Spears</author_name>
<category>Pop Musician Leisure Activities</category>
<quote>I shop, go to movies, soak up the sun when possible and go
out to eat.</quote>
</onequote>
<onequote>
.. another row from the quotations table ...
</onequote>
... some more rows
</quotations>
Observe que hay una etiqueta separada para cada columna en nuestro modelo
de datos SQL:
<quotation_id>
<insertion_date>
<author_name>
<category>
<quote>
También hay una etiqueta de "envoltorio" que identifica cada fila como
una <onequote>estructura, y un envoltorio externo que identifica una secuencia
de <onequote>estructuras como un <quotations>documento.
Construyendo un DTD
Podemos dar una descripción formal de nuestra estructura XML, en lugar de
un ejemplo informal, por medio de una Definición de Tipo de Documento
XML (DTD).
Nuestro DTD comenzará con una definición de la quotations etiqueta:
<!ELEMENT quotations (onequote)+>
Esto dice que el quotationselemento debe contener al menos una aparición
de onequotepero puede contener más de uno. Ahora tenemos que decir qué
constituye un onequoteelemento legal :
<!ELEMENT onequote
(quotation_id,insertion_date,author_name,category,quote)>
Esto dice que los subelementos, como quotation_idcada uno, deben aparecer
exactamente una vez y en el orden especificado. Ahora tenemos que definir un
elemento XML que realmente contenga algo distinto de otros elementos
XML:
<!ELEMENT quotation_id (#PCDATA)>
Esto dice que todo lo que se interponga <quotation_id> y </quotation_id>se
interpretará como caracteres sin formato en lugar de contener etiquetas
adicionales (PCDATA significa "datos de caracteres analizados").
Aquí está nuestra DTD completa:
<!-- quotations.dtd -->
<!ELEMENT quotations (onequote)+>
<!ELEMENT onequote
(quotation_id,insertion_date,author_name,category,quote)>
<!ELEMENT quotation_id (#PCDATA)>
<!ELEMENT insertion_date (#PCDATA)>
<!ELEMENT author_name (#PCDATA)>
<!ELEMENT category (#PCDATA)>
<!ELEMENT quote (#PCDATA)>
Encontrará esto extremadamente útil ... Oye, en realidad no encontrará este
DTD útil para completar esta parte del conjunto de problemas. La única
situación en la que un DTD es útil es cuando se alimentan documentos a un
analizador XML porque el analizador puede simular automáticamente cada
documento XML. Para implementar su página quotes-xml, solo tendrá que
mirar el ejemplo informal.
El meollo de este ejercicio: escriba un script que consulte
la quotationstabla, produzca un documento XML en el formulario anterior y
lo devuelva al cliente con un tipo MIME de "aplicación / xml". Coloque esto
en el sistema de archivos en / basics / quotations-xml, para que otros usuarios
puedan recuperar los datos visitando esa URL acordada.
Ejercicio 11: Importar XML
Escriba un programa para importar las citas de la página de salida XML de
otro alumno. Su programa debe
Agarra /basics/quotations-xmldel servidor de otro estudiante.
Analice la estructura XML resultante en registros y luego analice
los registros en campos.
Si una cita del servidor externo tiene un autor y contenido idénticos
a los de su propia base de datos, ignórelo; de lo contrario, insértelo en
su base de datos con un nuevo quotation_id. (No desea que las
claves del servidor externo entren en conflicto con lo que ya está en
su base de datos).
Sugerencia: puede configurar una tabla temporal utilizando create table
quotations_temp as select * from quotationsy luego soltarla una vez que
haya terminado de depurar, para no estropear su propia base de datos de citas.
No se espera que escriba un analizador XML como parte de este
ejercicio. Utilizará un analizador XML de uso general o sus TA le
proporcionarán un programa simple que solo es capaz de analizar este formato
en particular. Si no recibe ayuda de sus TA y está utilizando Oracle, tenga en
cuenta que Oracle RDBMS tiene un amplio soporte incorporado para procesar
XML. Lea la documentación de Oracle, en particular la Guía del
desarrollador de Oracle XML DB: Oracle XML DB . Si está utilizando Java o
Perl, hay muchos analizadores XML de código abierto disponibles. La
biblioteca de clases de Microsoft .NET Framework contiene clases que
proporcionan un conjunto completo de herramientas XML.
Ejercicio 12: tomar crédito
Revisa tus archivos de código fuente. Asegúrese de que haya un encabezado
en la parte superior que explique (1) quién escribió el código, (2) en qué fecha
se escribió y (3) qué problema está tratando de resolver. Visite sus páginas
web. Asegúrese de que en la parte inferior de cada página haya un mailto:
enlace a su dirección de correo electrónico permanente.
Es su obligación profesional con otros programadores asumir la
responsabilidad de su código fuente. Es su obligación profesional que los
usuarios finales asuman la responsabilidad de su experiencia con su programa.
Ejercicios de base de datos
Vamos a cambiar de marcha ahora a una parte del conjunto de problemas
diseñado para enseñarle más sobre RDBMS y SQL. Vea su suplemento si está
utilizando un RDBMS que no sea Oracle.
Para facilitar la entrega de su conjunto de problemas, mantenga una
transcripción de archivo de texto de partes relevantes de su sesión de base de
datos en http://yourhostname.com/basics/db-exercises.txt.
Ejercicio DB 1: SQL * Loader
Use un editor de texto estándar para crear un archivo de texto sin
formato que contenga cinco líneas, cada línea para contener su
símbolo de acciones favorito, un número entero de acciones de
propiedad y una fecha de adquisición (en forma MM / DD /
AAAA). Separe los campos en cada línea con pestañas.
cree una tabla Oracle para contener estos datos:
crear tabla my_stocks (
el símbolo varchar (20) no es nulo,
n_shares entero no nulo,
date_acquired date not null
);
use el sqlldrcomando de shell en Unix para invocar SQL * Loader
para sorber su archivo separado por tabulaciones en la my_stockstabla
Dependiendo de lo ingenioso que sea con la documentación de descremado,
este ejercicio puede tomar quince minutos o toda la vida. El libro Oracle: The
Complete Reference , discutido en la sección Más de este capítulo, es muy
útil. También puede leer sobre SQL * Loader en los documentos oficiales de
Oracle, vinculados desde http://www.oracle.com/ , generalmente en
el libro Utilities . Tenga en cuenta que la búsqueda de documentación de
Oracle en línea requiere un poco de persistencia y, a menudo, el registro
(gratis). Busque enlaces que digan "ver biblioteca" y pestañas que digan
"libros".
Ejercicio de base de datos 2: copia de datos de una tabla a otra
Este ejercicio existe porque descubrimos que, cuando nos enfrentamos a la
tarea de mover datos de una tabla a otra, los programadores arrastraban los
datos a través de SQL * Net desde Oracle a su servidor web, manipulándolos
en un script web y luego volviéndolos a introducir. Oracle sobre SQL *
Net. ¡Esta no es la manera! SQL es un lenguaje muy poderoso y no es
necesario incorporar otras herramientas si lo que desea hacer es mover datos
dentro del RDBMS.
usando sólo una instrucción SQL, cree una tabla
llamada stock_pricescon tres columnas: symbol, quote_date,
price. Dentro de esta declaración, llene la tabla que está creando con
una fila por símbolo my_stocks. Las columnas de fecha y precio
deben rellenarse con la fecha actual y un precio
nominal. Sugerencia: select symbol, sysdate as quote_date,
31.415 as price from my_stocks; .
crear una nueva tabla:
crear tabla recientemente_stock_acquired (
el símbolo varchar (20) no es nulo,
n_shares entero no nulo,
date_acquired date not null
);
usando una sola insert into ... select ... declaración (con una
cláusula WHERE apropiada para sus datos de muestra), copie
aproximadamente la mitad de las
filas my_stocksennewly_acquired_stocks
DB Ejercicio 3: ÚNETE
Con una sola instrucción SQL JOINing my_stocksy stock_prices, produzca
un informe que muestre el símbolo, el número de acciones, el precio por
acción y el valor actual.
DB Ejercicio 4: UNIÓN EXTERNA
Insertar una fila en my_stocks. Vuelva a ejecutar su consulta del ejercicio
anterior. Tenga en cuenta que su nuevo stock no aparece en el informe. Esto
se debe a que se unió a ellos con la restricción de que el símbolo aparezca en
ambas tablas.
Modifique su estado de cuenta para usar una UNIÓN EXTERNA en su
lugar para obtener un informe completo de todas sus existencias, pero no
obtendrá información de precios si no hay ninguna disponible.
Ejercicio DB 5: PL / SQL
Inspirados en los métodos de Wall Street para valorar las compañías de
Internet, hemos desarrollado nuestro propio método de valoración para este
conjunto de problemas: una acción se valora por la suma de los caracteres
ASCII que forman su símbolo. (Tenga en cuenta que los estudiantes que han
usado letras minúsculas para representar símbolos tendrán carteras de mayor
valor que aquellos que han usado símbolos en mayúsculas; "IBM" vale solo $
216 mientras que "ibm" vale $ 312!)
definir un PL / SQL función que toma un símbolo comercial como
su argumento y devuelve el valor de las acciones. Sugerencia: la
función incorporada de Oracle ASCIIserá útil.
con una sola instrucción UPDATE, actualice stock_prices para
establecer el valor de cada acción a lo que sea devuelto por este
procedimiento PL / SQL
defina una función PL / SQL que no tome argumentos y devuelva
el valor agregado de la cartera ( n_shares * pricepara cada
acción). Querrá definir su JOIN del ejercicio de base de datos 3
(arriba) como un cursor y luego usar el cursor PL / SQL Cursor FOR
LOOP. Sugerencia: cuando haya terminado, puede ejecutar este
procedimiento desde SQL * Plus con select portfolio_value()
from dual;.
Consejo de SQL * Plus: aunque no es parte del lenguaje SQL, le resultará
muy útil escribir "/" después de sus definiciones PL / SQL si las está enviando
a Oracle a través de la aplicación SQL * Plus. A menos que escriba un código
perfecto, también querrá saber sobre el comando SQL * Plus "mostrar
errores". Para conocer la gama completa de este tipo de oscurantismo,
consulte la Guía y referencia del usuario de SQL * Plus , uno de los libros
incluidos en la documentación de la base de datos de Oracle.
DB Ejercicio 6: Compre más de los ganadores
En lugar de llevar sus ganancias a los ganadores, ¡compre más de ellos!
use SELECT AVG () para calcular el precio promedio de sus
tenencias
Usando una sola instrucción INSERT con SELECT, duplique sus
tenencias en todas las acciones cuyo precio sea más alto que el
promedio (con el date_acquiredconjunto a sysdate)
Vuelva a ejecutar su consulta desde el ejercicio 4. de DB. Tenga en cuenta que
en algunos casos tendrá dos filas para el mismo símbolo. Si lo que realmente
le interesa es su posición actual, desea un informe con como máximo una fila
por símbolo.
utilice una select ... group by ...consulta de my_stockspara
generar un informe de símbolos y acciones compartidas totales
use una select ... group by ...consulta UNIRSE
con stock_pricespara generar un informe de símbolos y el valor total
contenido por símbolo
utilice una select ... group by ... having ...consulta para
generar un informe de símbolos, acciones compartidas totales y valor
total mantenido por símbolo restringido a símbolos en los que tenga
al menos dos bloques de acciones (es decir, los "ganadores")
Ejercicio 7 de DB: encapsule sus consultas con una vista
Usando la consulta final anterior, cree una vista llamada stocks_i_likeque
encapsule la consulta final.
Más
en HTTP: El estándar canónico del Consorcio Web
en http://www.w3.org/Protocols/
en HTML: el capítulo de referencia HTML de este libro
en ASP.NET: ASP.NET desatado de Stephen Walther (Sams 2003)
en el RDBMS de Oracle: un libro impreso muy útil es el Oracle
XX de Kevin Loney : The Complete Reference de Oracle Press,
donde "XX" es la versión más reciente de Oracle. Al cierre de esta
edición, Oracle 10g: The Complete Reference (2004) está
disponible. Toda la documentación de Oracle está disponible en línea
en www.oracle.com , pero puede ser abrumadora para los
principiantes.
Suplementos del conjunto de problemas
para personas que usan Microsoft
.NET: http://philip.greenspun.com/seia/examples-basics/dot-net-
examples/
para personas que usan
Java: http://philip.greenspun.com/seia/examples-basics/java-
examples/
Consulte la versión en línea de este capítulo periódicamente para
encontrar nuevos
suplementos: http://philip.greenspun.com/seia/basics
Tiempo y movimiento
Los estudiantes más afortunados pasan solo dos horas configurando su
RDBMS y su entorno de desarrollo. Un estudiante promedio que toma
decisiones tecnológicas razonables puede esperar pasar un día o dos
conectando las cosas correctamente. Algunos estudiantes que no tienen suerte
con sysadmin, hardware o que no tienen recursos con Internet y fuentes de
ayuda cara a cara pueden pasar muchos días sin crear un entorno de
trabajo. En MIT, los estudiantes comienzan con sysadmin / dbadmin al menos
tres semanas antes de la primera clase.
Dado un entorno de desarrollo establecido, los ejercicios en este capítulo
toman entre seis y doce horas para los estudiantes del MIT que trabajan en un
laboratorio donde hay asistentes de enseñanza disponibles y posiblemente
hasta veinte horas para los que trabajan solos.
Regresar a la tabla de contenido
[email protected] , [email protected] , [email protected]