Saltar al contenido principal
LibreTexts Español

9.4: Computación Distribuida

  • Page ID
    60981
    • Anonymous
    • LibreTexts

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Objetivos de aprendizaje

    Después de estudiar esta sección deberías poder hacer lo siguiente:

    1. Comprender el concepto de computación distribuida y sus beneficios.
    2. Comprender el modelo cliente-servidor de la computación distribuida.
    3. Conoce qué son los servicios web y los beneficios que los servicios web aportan a las empresas.
    4. Aprecie la importancia de los estándares de mensajería y comprenda cómo enviar mensajes entre máquinas puede acelerar los procesos, reducir costos, reducir errores y habilitar nuevas formas de hacer negocios.

    Cuando las computadoras en diferentes ubicaciones pueden comunicarse entre sí, esto a menudo se conoce como computación distribuida. La computación distribuida puede generar enormes eficiencias en velocidad, reducción de errores y ahorro de costos y puede crear formas completamente nuevas de hacer negocios. El diseño de la arquitectura de sistemas para sistemas distribuidos implica muchos temas técnicos avanzados. En lugar de proporcionar una descomposición exhaustiva de la computación distribuida, los ejemplos que siguen están destinados a ayudar a los gerentes a comprender las ideas más grandes detrás de algunos de los términos que probablemente encuentren.

    Empecemos con el término servidor. Esto es complicado porque se usa con frecuencia de dos maneras: (1) en un contexto de hardware, un servidor es una computadora que se ha configurado para admitir solicitudes de otras computadoras (por ejemplo, Dell vende servidores) y (2) en un contexto de software un servidor es un programa que satisface las solicitudes (por ejemplo, la Web de código abierto Apache servidor). La mayoría de las veces, el software de servidor reside en hardware de clase servidor, pero también puede configurar una PC, computadora portátil u otra computadora pequeña para ejecutar software de servidor, aunque con menos potencia. Y también puedes usar máquinas de clase mainframe o súper computadoras como servidores.

    La World Wide Web, como muchos otros servicios de computación distribuida, es lo que los geeks llaman un sistema cliente-servidor. Cliente-servidor se refiere a dos piezas de software, un cliente que realiza una solicitud y un servidor que recibe e intenta cumplir con la solicitud. En nuestro escenario WWW, el cliente es el navegador (por ejemplo, Internet Explorer, Firefox, Safari). Cuando escribe la dirección de un sitio web en el campo de ubicación de su navegador, le dice al cliente que “busque el software del servidor web en la dirección proporcionada y dígale al servidor que devuelva el sitio web solicitado”.

    Es posible vincular lenguajes de scripting simples a un servidor Web para realizar cálculos, acceder a bases de datos o personalizar sitios Web. Pero los entornos distribuidos más avanzados pueden usar una categoría de software llamada servidor de aplicaciones. El servidor de aplicaciones (o servidor de aplicaciones) alberga lógica de negocio para un sistema distribuido. Los servicios web individuales servidos por el servidor de aplicaciones están programados para realizar diferentes tareas: devolver un cálculo (“el impuesto a las ventas para su pedido será de $11.58"), acceder a un programa de base de datos (“aquí están los resultados que buscó”), o incluso hacer una solicitud a otro servidor en otro organización (“Visa, por favor verifique el número de tarjeta de crédito de este cliente por mí”).

    Figura 9.6

    En este sistema distribuido de varios niveles, los navegadores cliente en diversas máquinas (escritorio, laptop, móvil) acceden al sistema a través del servidor Web. La caja registradora no utiliza un navegador web, por lo que en su lugar la lógica de la caja registradora está programada para acceder directamente a los servicios que necesita desde el servidor de aplicaciones. A los servicios web a los que se accede desde el servidor de aplicaciones se les puede pedir que realicen una variedad de funciones, que incluyen realizar cálculos, acceder a bases de datos corporativas o incluso hacer solicitudes de servidores de otras empresas (por ejemplo, para verificar la tarjeta de crédito de un cliente).

    En este sistema distribuido de varios niveles, los navegadores cliente en diversas máquinas (escritorio, laptop, móvil) acceden al sistema a través del servidor Web. La caja registradora no utiliza un navegador web, por lo que en su lugar la lógica de la caja registradora está programada para acceder directamente a los servicios que necesita desde el servidor de aplicaciones. A los servicios web a los que se accede desde el servidor de aplicaciones se les puede pedir que realicen una variedad de funciones, que incluyen realizar cálculos, acceder a bases de datos corporativas o incluso hacer solicitudes de servidores de otras empresas (por ejemplo, para verificar la tarjeta de crédito de un cliente).

    Esos pequeños trozos de código a los que se accede a través del servidor de aplicaciones a veces se denominan servicios web. El consorcio World Wide Web define los servicios web como sistemas de software diseñados para soportar la interacción interoperable máquina a máquina a través de una red 2. Y cuando las computadoras pueden hablar juntas (en lugar de personas), esto a menudo resulta en menos errores, ahorro de tiempo, reducciones de costos, ¡e incluso puede crear formas completamente nuevas de hacer negocios! Cada servicio web define el método estándar para que otros programas lo soliciten para realizar una tarea y define el tipo de respuesta que el cliente llamante puede esperar de vuelta. Estos estándares se conocen como interfaces de programación de aplicaciones (API).

    Mira las ventajas que los servicios web aportan a una firma como Amazon. Al usar los servicios web, la firma puede permitir que la misma lógica de entrada de pedidos sea utilizada por navegadores web, aplicaciones para teléfonos móviles o incluso por terceros que quieran acceder a la información de productos de Amazon y realizar pedidos con la firma (hay un incentivo para canalizar las ventas a Amazon; la firma le dará un corte de cualquier venta que envíes a Amazon). Se dice que las organizaciones que han creado un conjunto sólido de servicios web en torno a sus procesos y procedimientos tienen una arquitectura orientada a servicios (SOA). Organizar sistemas como este, con aplicaciones separadas a cargo de la presentación del cliente, la lógica de negocios y la base de datos, hace que los sistemas sean más flexibles. El código se puede reutilizar y cada capa se puede mantener, actualizar o migrar por separado a hardware nuevo, todo con poco impacto en las demás.

    Los servicios web suenan geek, pero aquí hay un ejemplo concreto que ilustra su poder. Southwest Airlines tenía un sitio Web donde los clientes podían reservar vuelos, pero muchos clientes también querían alquilar un auto o reservar un hotel, también. Para mantener a los clientes en Southwest.com, la firma y sus socios hoteleros y de alquiler de automóviles crearon un conjunto de servicios web y compartieron las API. Ahora los clientes que visitan Southwest.com pueden reservar una estadía de hotel y un auto de alquiler en la misma página donde hacen su reservación de vuelo. Este proceso transforma Southwest.com en un destino de viaje de servicio completo y permite que el sitio compita cara a cara con personas como Expedia, Travelocity y Orbitz (McCarthy, 2002).

    Piense por qué los servicios web son importantes desde una perspectiva estratégica. Al agregar servicios de hotel y alquiler de autos, Southwest ahora puede eliminar al agente de viajes, junto con cualquier tarifa que puedan compartir con el agente. Este atajo permite a la firma capturar más ganancias o transmitir ahorros a los clientes, asegurando su posición como el primer lugar al que acuden los clientes para viajes de bajo costo. Y quizás lo más importante es que Southwest puede capturar datos clave de búsquedas y reservas de viajes de visitantes (algo que probablemente no podría hacer si los clientes fueran a un sitio como Expedia o Travelocity). Los datos son un activo muy valioso, y este tipo de datos de clientes pueden ser utilizados por Southwest para enviar mensajes de correo electrónico personalizados y otras campañas de marketing para traer a los clientes de regreso a la aerolínea. Por geek que puedan parecer al principio, ¡los servicios web pueden ser muy estratégicos!

    Figura 9.7

    Southwest.com utiliza los servicios Web para permitir el alquiler de autos y las empresas hoteleras reservar servicios a través de Southwest. Este proceso transforma Southwest.com en un agente de viajes en línea de servicio completo.

    Southwest.com utiliza los servicios Web para permitir el alquiler de autos y las empresas hoteleras reservar servicios a través de Southwest. Este proceso transforma Southwest.com en un agente de viajes en línea de servicio completo.

  • Estándares de mensajería

    Dos términos adicionales que puede escuchar dentro del contexto de la computación distribuida son EDI y XML. EDI (intercambio electrónico de datos) es un conjunto de estándares para el intercambio de información entre aplicaciones informáticas. El EDI se utiliza con mayor frecuencia como una forma de enviar el equivalente electrónico de documentos estructurados entre diferentes organizaciones. Mediante EDI, cada elemento del documento electrónico, como el nombre de una empresa, dirección o número de cliente, se codifica para que pueda ser reconocido por el programa informático receptor. La eliminación de los documentos en papel hace que las empresas sean más rápidas y reduce los costos de entrada Un estudio mostró que las firmas que utilizaron EDI disminuyeron sus tasas de error en 82 por ciento y su costo de producción de cada documento cayó hasta en 96 por ciento 2.

    El EDI es un estándar muy antiguo, con raíces que se remontan al Berlin Air Lift de 1948. Mientras aún se usa, una nueva generación de tecnologías más flexibles para especificar estándares de datos está tomando su lugar. La principal de las tecnologías que reemplazan a EDI es el lenguaje de marcado extensible (XML). XML tiene muchos usos, pero en el contexto de los sistemas distribuidos, permite a los desarrolladores de software crear un conjunto de estándares para elementos de datos comunes que, como los mensajes EDI, se pueden enviar entre diferentes tipos de computadoras, diferentes aplicaciones y diferentes organizaciones. A menudo se considera que el XML es más fácil de codificar que EDI, y es más robusto porque se puede ampliar; las organizaciones pueden crear formatos para representar cualquier tipo de datos (por ejemplo, un número de pieza común, fotos, el campo de quejas recopilado por el personal de atención al cliente). De hecho, la mayoría de los mensajes enviados entre servicios web están codificados en XML (la tecnología es un habilitador clave en mashups, discutido en el Capítulo 7 “Producción entre pares, redes sociales y Web 2.0”). Muchos programas de computadora también usan XML como una forma de exportar e importar datos en un formato común que se puede usar independientemente del tipo de hardware de computadora, sistema operativo o programa de aplicación utilizado. Y si diseñas sitios Web, es posible que encuentres XML como parte de la codificación detrás de las hojas de estilo en cascada (CSS) que ayudan a mantener una apariencia consistente en las distintas páginas web de un sitio web determinado.

    Rearden Commerce: Un negocio construido sobre servicios web

    Los servicios web, las API y los estándares abiertos no solo transforman los negocios, sino que pueden crear firmas completamente nuevas que cambien la forma en que hacemos las cosas. Para ver las posibilidades ampliadas, integradas e hiperautomatizadas que los servicios web hacen posibles, echa un vistazo a Rearden Commerce, una firma de Foster City, California, que está utilizando esta tecnología para convertirse en lo que la Oficina Principal de Investigación de AMR denominó “Travelocity on Steroids”.

    Usando Rearden, las empresas pueden ofrecer a sus empleados ocupados una especie de conserje/asistente personal basado en la web. Rearden ofrece a las empresas una ventanilla única donde los empleados no solo pueden hacer las reservas de vuelos, autos y hoteles que podrían hacer de un agente de viajes, también pueden reservar reservaciones para cenas, boletos para deportes y teatro, y organizar servicios de negocios como conferencias telefónicas y envío de paquetes. Rearden no suministra los bienes y servicios que vende. En cambio, actúa como intermediario entre transacciones. Un conjunto de API abiertas a sus servicios web permite a los ciento sesenta mil proveedores de Rearden enviar datos de productos y servicios a Rearden, y recibir datos de reservas y ventas del sitio.

    En este mashup de negocios definitivo, un usuario de Rearden móvil podría usar su teléfono para reservar un vuelo a una ciudad cliente, ver restaurantes a cierta distancia de la oficina de su cliente, hacer que estas ubicaciones apareen en un mapa de Google, tener listados acompañados de calificaciones de Zagat y tipo de cocina, reservar reservas en restaurantes a través de Open Table, haga arreglos para que un automóvil y chofer se reúnan con ella en la oficina de su cliente a una hora específica, y sincronice estas reservas con los sistemas de calendario corporativo de su firma. Si surge algo inesperado, como un retraso de vuelo, Rearden se asegurará de que reciba el mensaje. El sistema realizará un seguimiento de cualquier crédito de reservación cancelado, y también registrará los programas de recompensas de viaje, por lo que Rearden se puede utilizar para gastar esos puntos en el futuro.

    Para lograr este esfuerzo, los maestros de Rearden no solo son expertos en orquestación técnica, sino también en coordinar los requisitos de clientes y proveedores. Como dijo Erick Schonfeld de TechCrunch, “Lo difícil no es solo la tecnología, que se trata de integrar un desorden rebelde de API y servicios web, [también implica] firmar acuerdos de nivel de servicio comercialmente vinculantes con [ahora más de 160.000] comerciantes de todo el mundo”. Por sus esfuerzos, Rearden consigue mantener entre 6 por ciento y 25 por ciento de cada dólar que no sea de viaje gastado, dependiendo del servicio. La firma también gana dinero con suscripciones y acuerdos de distribución.

    Los primeros clientes de la firma fueron grandes negocios e incluyeron Conagra, GlaxoSmithKline y Motorola. Los clientes de Rearden pueden configurar el sistema en función de parámetros especiales únicos para cada empresa: favorecer a una aerolínea específica, beneficiarse de un descuento corporativo o restringir algunas ofertas solo para empleados aprobados. Los inversores de Rearden incluyen a JPMorgan Chase y American Express, los cuales ofrecen Rearden a sus empleados y clientes. Incluso antes de que estuviera disponible la versión para consumidores, Rearden contaba con más de cuatro mil clientes corporativos y dos millones de usuarios totales, una base de usuarios mayor que firmas más conocidas como Salesforce.com (Arrington, 2007; Schonfeld, 2008; Arrington, 2009). Por todo el entusiasmo reconocemos que, como start-up, el futuro de Rearden Commerce sigue siendo incierto; sin embargo, el uso efectivo de los servicios web por parte de la firma ilustra las posibilidades de negocio ya que las tecnologías permiten a las empresas conectarse con mayor facilidad y eficiencia.

    La conectividad ha hecho que nuestros sistemas sean más productivos y posibilita estrategias y modelos de negocio completamente nuevos. Pero estos maravillosos beneficios vienen al precio de un mayor riesgo. Cuando los sistemas están más interconectados, también aumentan las oportunidades de infiltración y abuso. Piénsalo de esta manera: cada oportunidad de “conexión” es como agregar otra puerta a un edificio. Cuantas más puertas hay que defender, más difícil se vuelve la seguridad. No debería sorprender que el auge de Internet y la computación distribuida haya provocado una explosión en las pérdidas de seguridad por parte de organizaciones de todo el mundo.

    Claves para llevar

    • La computación cliente-servidor es un método de computación distribuida donde un programa (un cliente) realiza una solicitud para ser atendida por otro programa (un servidor).
    • Servidor es un término complicado y a veces se usa para referirse al hardware. Si bien el hardware de clase servidor se refiere a computadoras más potentes diseñadas para admitir múltiples usuarios, casi cualquier PC o portátil se puede configurar para ejecutar software de servidor.
    • Los servidores web sirven sitios web y pueden realizar algunas secuencias de comandos.
    • La mayoría de las empresas atienden complejas lógicas de negocios desde un servidor de aplicaciones.
    • Aislar la lógica de un sistema en tres o más capas (presentación o interfaz de usuario, lógica de negocios y base de datos) puede permitir una flexibilidad firme en el mantenimiento, la reutilización y el manejo de actualizaciones.
    • Los servicios web permiten que diferentes aplicaciones se comuniquen entre sí. Las API definen el método para llamar a un servicio web (por ejemplo, para conseguir que haga algo), y el tipo de respuesta que el programa de llamada puede esperar de vuelta.
    • Los servicios web facilitan el enlace de aplicaciones como sistemas distribuidos y pueden facilitar a las empresas vincular sus sistemas entre organizaciones.
    • Los estándares de mensajería populares incluyen EDI (más antiguo) y XML. El envío de mensajes entre máquinas en lugar de documentos físicos puede acelerar los procesos, reducir drásticamente el costo de las transacciones y reducir los errores.
    • La computación distribuida puede generar enormes eficiencias en velocidad, reducción de errores y ahorro de costos y puede crear formas completamente nuevas de hacer negocios.
    • Cuando las computadoras pueden comunicarse entre sí (en lugar de personas), esto a menudo resulta en menos errores, ahorro de tiempo, reducciones de costos e incluso puede crear formas completamente nuevas de hacer negocios.
    • Los servicios web, las API y los estándares abiertos no solo transforman los negocios, sino que pueden crear firmas completamente nuevas que cambien la forma en que hacemos las cosas.

    Preguntas y ejercicios

    1. Diferenciar el término “servidor” utilizado en un contexto de hardware, de “servidor” utilizado en un contexto de software.
    2. Describir el modelo “cliente-servidor” de computación distribuida. ¿Qué productos que utiliza clasificarían como aprovechamiento de la computación cliente-servidor?
    3. Enumere las ventajas que los servicios web han traído a Amazon.
    4. ¿Cómo ha utilizado Southwest Airlines los servicios Web para su ventaja competitiva?
    5. ¿Qué es Rearden Commerce y qué tecnologías emplea? Describir el modelo de ingresos de Rearden Technology. ¿Quiénes fueron los primeros clientes de Rearden Technology? ¿Quiénes estuvieron entre sus primeros inversionistas?
    6. ¿Cuáles son los riesgos de seguridad asociados con la conectividad, Internet y el procesamiento distribuido?

  • This page titled 9.4: Computación Distribuida is shared under a CC BY-NC-SA 3.0 license and was authored, remixed, and/or curated by Anonymous via source content that was edited to the style and standards of the LibreTexts platform.