UADY SymWeb Simulación de Modelos Matemáticos en la Web
Upcoming SlideShare
Loading in...5
×
 

UADY SymWeb Simulación de Modelos Matemáticos en la Web

on

  • 2,605 views

 

Statistics

Views

Total Views
2,605
Views on SlideShare
2,605
Embed Views
0

Actions

Likes
0
Downloads
39
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

UADY SymWeb Simulación de Modelos Matemáticos en la Web UADY SymWeb Simulación de Modelos Matemáticos en la Web Document Transcript

  • 1
  • En la actualidad la web ha impactado de manera significativa la forma en la que las personas acceden y distribuyen la información. A su vez, la web ha repercutido en los paradigmas de diversas áreas de la ciencia, y en particular de las ciencias de la computación. La simulación por computadora no pudo escapar al impacto de la red de redes y vislumbrar posibles extensiones de ella a través de la web. De esta forma nace la simulación web, como necesidad de la simulación por darse un nuevo aire y expandirse. Este trabajo se enfoca en el desarrollo de una aplicación web que está relacionada con la simulación de modelos dinámicos de nutrición animal mediante métodos numéricos, los cuales son producidos a través de un proceso de preprocesamiento de archivos generados por un software de simulación local (en PC). De esta forma, el propósito general de este trabajo es la comentar el proceso de desarrollo de una aplicación web, en particular esta de simulación que ha sido denominada SymWeb por “Simulación y Modelado vía Web”. En la primera sección, los preliminares, están comentarios breves sobre los tipos de modelos matemáticos usados en la simulación y su relación con el área bovina; además está una pequeña explicación de cómo realizar modelos matemáticos con Stella, el software de modelado matemático del que se extrae los archivos fuente para utilizarse en la aplicación web. En la revisión de la literatura, es presentada la información explicativa de lo que la simulación web, sus principios e impactos, y aspectos críticos que deben considerarse durante la creación de un proyecto de simulación en general. Después, en la sección de métodos, se encuentra narrado el proceso de ingeniería de hipermedia utilizado para el desarrollo de ésta aplicación. Posteriormente se hace una pequeña discusión sobre el contenido del marco teórico presentado en la sección de revisión de la literatura para enfatizar aspectos personales del realizador de este trabajo y señalar la diferencia entre la teoría ideal y vivir un proyecto de simulación web. Para concluir, conclusiones y recomendaciones sobre el trabajo realizado, en los que se señalan puntos importantes que afectaron el desarrollo de la aplicación y se presentan comparaciones sobre los resultados de simulación efectuados con la aplicación web y el software de simulación para PC. Como anexo, son presentados los listados del código fuente de las páginas más importantes que componen SymWeb como referencia a futuras modificaciones o extensiones. 2
  • 3
  • “Las funciones biológicas en los seres vivos pueden cuantificarse y representarse mediante el proceso denominado ‘simulación de modelos’. El modelado en la producción animal permite reproducir los diferentes procesos digestivos y metabólicos que se llevan a cabo dentro del animal para así estudiarlos con una base cuantitativa y dinámica a más bajo costo que en la investigación pecuaria convencional” (Ku, 2000). La cita anterior resume en sí la importancia del modelado matemático y la simulación por computadora en las ciencias veterinarias. De esta idea surge el proyecto de la creación de un simulador de modelos matemáticos veterinarios disponible para todos que se presenta en este documento intitulado “Desarrollo de un Programa Web para la Simulación de Modelos Dinámicos Ligados a Base de Datos”. 2.1 Modelado Matemático y Simulación por Computadora Comencemos explicando lo que es el modelado matemático. La manera en la que Ku (2000) explica el concepto de modelo matemático y simulación sin duda se adapta muy bien a nuestro contexto y es clara: “Debido a que las funciones biológicas están determinadas por dinámicas cuantitativas que son factibles de representarse matemáticamente, es posible mediante un procedimiento llamado simulación, describir matemáticamente este proceso. A la representación matemática y esquemática de este proceso se le llama modelo”. En sí, el modelo consiste en especificar un problema, desarrollar las relaciones conceptuales entre sus entidades y representarlas cuantitativamente (Taffe, 1991). En palabras un poco más coloquiales, podemos decir simplemente que un modelo matemático es una representación aproximada de la realidad. La realidad, tal y como la vivimos, es muy compleja y llena de detalles por lo que no podemos modelarla en su totalidad. No es que existan modelos malos, sino que existen modelos con diferentes “enfoques”. Entenderemos lo anterior en un sentido subjetivo, por lo que interpretaremos la palabra “enfoque” como lo útil que es el modelo según lo que se quiera simular. De lo anterior encontramos que existe una relación entre la palabra modelado y la palabra simulación. Según Taffe (1991), la simulación puede ser explicada como la acción que “resuelve” la matemática de varias entradas y para una variedad de parámetros. De manera simple podemos entender que un modelo tiene un conjunto de entradas que al ser “procesadas” por el modelo nos otorgará una o varias salidas. Entonces podemos decir simular que es “hacer trabajar al modelo para que de salidas con base a sus entradas”. Aquellos valores de modelo que al ser cambiados influyen en lo que obtengamos por salidas, son llamados parámetros. Es fácil que nos imaginemos los modelos como un conjunto de ecuaciones extrañas con muchas entradas y parámetros. Es importante que sepamos que no siempre es así, a veces existen modelos de una sola ecuación y de un solo parámetro. Lo que sí podemos afirmar es que en muchos de los casos es un poco “engorroso” hacer las simulaciones de forma “manual” porque es posible que las operaciones sean muy complicadas de resolver de esta forma. Ahora 4
  • con el avance tecnológico, y en particular el de la computación, es fácil que consideremos la forma de “resolver los modelos en la computadora”. De forma un poco más propia: “Simular los modelos en la computadora”. Esto es el área de las ciencias de la computación que se conoce como Simulación por Computadora, que en palabras de Fishwick (1995) nos define la simulación por computadora como “la disciplina de diseñar un modelo de un sistema físico actual, ejecutando el modelo en una computadora digital, y analizando la salida de la ejecución”. Los modelos pueden ser clasificados (Box, et al. 1999, Heylighen, 2000 y Chí, 2000) según sus características, los cuales pueden ser: • Formales: Tales como lo son las expresiones matemáticas, los diagramas, las tablas, etc. • De juicio: Formados por una serie de deducciones y afirmaciones contenidas en la mente de un experto. • Causales: Reflejan relaciones de causa y efecto. • Correlacionales: Los cuales no siempre revelan cuando un fenómeno observado es causado por otros. • Determinísticos: Aquellos que generan la respuesta de una entrada dada por una ley fija. • Estocásticos: Aquellos que seleccionan la respuesta del conjunto de las posibles respuestas de acuerdo a una distribución de probabilidad fija. • Dinámicos: Describen fenómenos que suceden en el tiempo, los proceso dinámicos. • Estáticos: Describen el sistema en un instante del tiempo y en un estado asumido de equilibrio. • Analíticos: Son los modelos matemáticos cuyas salidas se expresan en términos de ecuaciones y variables. • Numéricos: Son los modelos matemáticos cuyas salidas se obtienen a partir de aplicar en ellos métodos numéricos para resolverlo. • Mecanísticos: Están basados en una apreciación de la teoría física o mecanicista que gobierna el proceso. • Empíricos: Son modelos propuestos con base en el conocimiento del área, que se van ajustando según resultados experimentales. 2.2 Modelos y bovinos Los modelos que están relacionados con la producción bovina de carne extensiva en el trópico son de carácter dinámico y mecanístico (Ku, 2000). Entre los modelos más completos y conocidos encontramos el de Baldwin (1995) y el de Dijkstra (1992), siendo este último el más usado en el trópico. Estos son modelos dinámicos para el estudio de la digestión ruminal. Según Ku (2000), otros aspectos a considerar en el desarrollo de modelos de digestión y metabolismo en el trópico son el consumo voluntario, potencial de animal, aspectos hormonales y balance de calor que influyen directamente sobre la dinámica de crecimiento en ambientes tropicales. También nos comenta en la justificación del desarrollo de modelos matemáticos que la “ausencia de un sistema de alimentación para bovinos en pastoreo en el 5
  • trópico en nuestro país es una de las grandes dificultades a las que se enfrenta el productor pecuario. Con un sistema de alimentación mexicano se podría mejorar la exactitud de los proyectos de inversión en el campo y por ende el interés de los inversionistas en éste. Por otro lado, los modelos en rumiantes han sido elaborados principalmente para zonas templadas, sin embargo son factibles de ser transformados para adaptarlos a la situación particular de México y el trópico”. De ahí que en la Facultad de Veterinaria y Zootecnia de la Universidad Autónoma de Yucatán (UADY) encontremos personas trabajando con los modelos actuales para estudiarlos, conocerlos y adaptarlos a las características de la región. El proyecto del estudio y simulación de modelos en la UADY nos adentra como universidad en esta línea de investigación. La importancia del estudio y simulación de modelos según Ku (2000) está en que: • Nos permiten obtener resultados de procesos biológicos, experimentar con pequeños cambios en ellos y obtener nuevos resultados. • Tienen un mayor impacto en los procesos productivos en México debido a que no requieren de gastar muchos recursos para la investigación. • Es más fácil estudiar las consecuencias biológicas de las conclusiones usando modelos que cuando realizamos trabajos experimentales ya que estamos trabajando con seres vivos. • Nos permite explotar con mucha mayor claridad las nuevas teorías mucho antes de llevarlas a la práctica a un costo muy bajo. • Es muy difícil en México, y en general en los países subdesarrollados, tener la infraestructura, los recursos humanos y económicos y la participación de los productores pecuarios para realizar predicciones de ésta. • Nos otorga la posibilidad como investigadores pecuarios en concentrarnos en otras áreas de investigación de no tan bajo costo. En conclusión: “los modelos dinámicos son importantes en el estudio de nutrición y especialmente en la dinámica de la digestión y metabolismo para simular el aumento de peso de la producción en rumiantes del trópico... Con pocos recursos el modelado es capaz de demostrar cambios en el comportamiento productivo de los animales y de formar en los alumnos el concepto cuantitativo de eficiencia”. Añadimos también: “Lo anterior es una necesidad urgente en la preparación de los estudiantes de nutrición de rumiantes en México debido, principalmente, a que la producción está basada en el pastoreo, lo cual dificulta más el estudio de la dinámica digestiva ya que no se conoce el consumo animal. Además, debido a las condiciones típicas del trópico existen factores que modifican las curvas de crecimiento, las cuales sin lugar a dudas podrían ser mejor estudiadas con una herramienta como es el modelado” (Ku, 2000). 2.3 Software para Modelado y Simulación 6
  • Para realizar los modelos matemáticos, es posible que nos auxiliemos de un software de modelado matemático. Existe gran variedad de software de este tipo como lo es el Mathlab (Mathworks, 2002) u otros especializados en sistemas dinámicos como el Dynamo (Rirchardson, 1981) o el Stella (HPS, 2000). Este último es el que encontramos disponible en la universidad y sirve muy bien para el modelado biomatemático, además presenta una interfaz gráfica para realizarlo y que además ayuda al aprendizaje de este concepto. El software Stella nos introduce el concepto de simulación a través del diseño de modelos mediante iconos, además de que es un lenguaje no procedural de tal forma que el modelador describe el sistema con base en éstos (Taffe, 1991 y Steed, 1996). Figura 1. Entorno de aplicación de Stella La manera en la que hacemos modelado en Stella es utilizando sus cuatro descriptores básicos para modelar que son representados, como ya mencionamos, de manera iconográfica: • Stock. Repositorio. Sirve para atribuir las cantidades que existen de las entidades (e.g. número de venados). • Flow. Flujo. Representa el cambio en el tiempo del contenido del stock. Los flujos pueden ser de entrada (aumento de cantidad) o de salida (pérdida de cantidad). • Converter. Convertidor. Permite atribuirle cálculos relacionados con las entidades con lo que se realizan cambios de los valores de entrada para devolver una salida. • Connector. Conector. Hace la conexión entre los repositorios y los flujos. Esto es equivalente a decir que establece la relación entre la entidad y su cambio con respecto al tiempo. Figura 2. Barra principal de botones para modelado de Stella. Los cuatro primeros iconos corresponden a los descriptores básicos. 7
  • Según comenta Steed (1996), una de las funciones únicas de este software es la opción de graficar (séptimo icono de la figura anterior de izquierda a derecha). Así, podemos dibujar gráficas en Stella donde veamos el comportamiento de una entidad con respecto al tiempo o la relación entre dos entidades. La forma en la que hace esto el software es usando ecuaciones diferenciales, les aplica un método numérico y corre la simulación. También se pueden presentar los resultados en forma tabulada. Para resolver las ecuaciones diferenciales, Stella usa por defecto el método de Euler, aunque también puede utilizar el método Runge-Kutta de segundo y cuarto orden (Sánchez et al., 1983). Cómo nos menciona Taffe (1991), la mejor manera de explicar cómo funciona Stella es a través de un sencillo ejemplo. Tomaremos entonces su ejemplo propuesto (el de crecimiento poblacional) para ir mostrando como usar de este software. Este modelo se describe fácilmente como el estado de la población con el flujo de entrada por parte de los nacimientos (aumento de población) y el flujo de salida debido a las muertes (disminución de la población). Figura 3. Modelo de crecimiento poblacional realizado en Stella en modo mapa. En la figura anterior tenemos el modelo de crecimiento poblacional ya realizado en Stella. Debido a su naturaleza de interfaz gráfica, básicamente lo que hacemos es hacer clic en el botón que tiene el icono que deseamos utilizar, posicionamos el mouse en el lugar deseado del área de trabajo y hacemos clic para que el elemento se cree. En casos como el del flujo y el de los conectadores, tenemos que arrastrar desde el elemento inicial (e.g. el stock de la población) hacia el elemento final (e.g. el flow de muertes). 8
  • Figura 4. Cambio de modo mapa a modo modelo. Pasamos al modo modelo, el cual nos presenta lo mismo que el modo mapa (cuyo propósito es únicamente la visualización del modelo), en donde se nos obliga a asignar los valores correspondientes a las entidades o definir los cálculos u operaciones que se van a realizar entre ellas. Cuando existan elementos en el modelo en los que no se ha trabajado (no tienen ninguna asignación), el software nos presentará un signo de interrogación dentro del mismo elemento (véase la siguiente figura). Para modificar los elementos entonces hacemos doble clic en ellos. Figura 5. Modelo de crecimiento poblacional en modo ecuación sin asignaciones. A continuación queremos indicarle al Stella que los nacimientos representan el 3% de la población. Por lo explicado anteriormente, hacemos doble clic en nacimientos y procedemos a definir el cálculo. Como población está conectada a nacimientos, será necesario hacer uso de la entidad población; por eso decimos que los conectadores establecen relaciones. 9
  • Figura 6. Asignación para el flujo de nacimientos del modelo de crecimiento poblacional De manera similar, hacemos doble clic en el stock de población para asignarle el valor de 500 que será considerado de esta manera como el valor inicial. Figura 7. Asignación del valor inicial en el modelo de crecimiento poblacional Supongamos que los fallecimientos son el 1% de la población. Procedemos a realizar esta asignación de manera similar a como lo hicimos en el flujo de nacimientos. Luego, mediante la opción Time Specs... del menú Model, especificamos los valores del tiempo inicial y final, así como la diferencial del tiempo que representa la cantidad que cambia conforme el tiempo avanza (i.e. que tanto flujo sale o que tanto flujo entra). También seleccionamos en esta opción la unidad de tiempo que usaremos y el método de integración para resolver el modelo (e.g. método de Euler), etc. 10
  • Figura 8. Especificaciones de tiempo para el modelo de crecimiento poblacional Ahora usaremos la función de graficación de Stella para ver los resultados. De nuevo, hacemos clic en el icono que corresponde al graficador. Luego hacemos clic en cualquier lugar del área de trabajo para crear el elemento gráfica y un doble clic para abrir la gráfica. Doble clic en cualquier parte de ella para obtener la lista de elementos disponibles para graficación. Figura 9. Opciones de graficación. Por último seleccionamos los elementos a graficar, aceptamos y al regresar seleccionamos la opción Run del menú Run. 11
  • Figura 10. Gráfica de la población, nacimientos y muertes del modelo de crecimiento poblacional Aunque Stella es un software de interfaz gráfica, también nos permite ver y trabajar con las ecuaciones de manera textual. Figura 11. Cambio del nivel de ecuaciones al nivel de modos mapa y modelo Así, tenemos que en el nivel de ecuaciones se nos muestra: 12
  • Figura 12. Ecuaciones del modelo de crecimiento poblacional De donde vemos claramente la ecuación que se resuelve (al menos con el método de Euler) que en sencillas palabras la interpretamos como el número de individuos de la población en un tiempo determinado es igual al numero de individuos de la población en el tiempo anterior más el incremento de nacimientos menos el decremento de muertes. Después pasamos a realizar la asignación inicial (i.e. INIT) de la población con el valor de 500. Inmediatamente encontramos la determinación de los flujos con nacimiento igual al 3% de la población y muertes igual al 1% de la población respectivamente. Por otra parte, podemos distribuir en la ventana las ecuaciones del modelo según la manera en la que se van a ir resolviendo. Para lograr esto, una vez que estamos en el modo de ecuaciones seleccionamos la opción Equation Prefs.... del menú Equation. Una vez estando en las preferencias de las ecuaciones, le indicamos que nos muestre las ecuaciones en orden de ejecución (order of execution) y aceptamos. Figura 13. Instrucciones para mostrar las ecuaciones en orden de ejecución Ahora las ecuaciones se nos presentan de la siguiente manera: 13
  • Figura 14. Ecuaciones del modelo de crecimiento poblacional presentadas en orden de ejecución En este caso, el listado de ecuaciones comienza ahora con la iniciación del stock de la población para pasar a la definición de los flujos de nacimientos y muertes. En el siguiente bloque están entonces las ecuaciones como se irán resolviendo en tiempo de ejecución. Primero se define la cantidad de individuos de la población para un instante en el tiempo, después vuelven a definirse los flujos. El segundo bloque se encuentra así porque la simulación comienza a correr para el tiempo cero t0 (sea cual sea su valor) y los valores iniciales (tanto del stock como de los flujos) se definen para este tiempo en el primer bloque. A partir de este momento las iteraciones hasta el tiempo final tn se realizan en el segundo bloque. Al final se tendrá todos los valores que tomaron la población, los nacimientos y las muertes desde el tiempo t0 a tn en incrementos de dt. Estos son los resultados que se grafican. Los modelos en Stella tienen la ventaja de que se pueden exportar sus ecuaciones a archivos de texto ASCII. Para realizar esa exportación debemos estar en el nivel de ecuaciones y entonces seleccionar la opción Save as Text... del menú File. Luego, una ventana típica de guardado de archivos de Windows se nos presenta, procedemos a seleccionar la ubicación de almacenamiento y darle nombre al archivo de texto que contendrá las ecuaciones. Aceptamos. 14
  • Figura 15. Almacenamiento de las ecuaciones de un modelo de Stella en un archivo de texto La manera en la que nuestro modelo de crecimiento poblacional fue almacenado en el archivo de texto es la siguiente: Figura 16. Ecuaciones del modelo de crecimiento poblacional en un archivo de texto ASCII Como el paquete de software nos brinda entonces las ecuaciones en un medio de fácil acceso como lo es un archivo de texto, es posible que hagamos uso de éstas para poder llevar a cabo la simulación en otro ambiente, tal como lo es la Web. 15
  • 16
  • 3.1 La Hipermedia y la World Wide Web La hipermedia se define como el conjunto de aplicaciones (software para uso específico) que son producto de la combinación del hipertexto (el texto que posee ligas) y multimedia (la generación de sonidos y gráficos en la computadora). Las páginas web en la actualidad son una combinación del hipertexto con el que originalmente fueron concebidas y a su vez elementos multimedia. Así, las presentaciones, discos compactos interactivos (como las enciclopedias en CD) y las páginas web pueden ser consideradas como hipermedia. A principios de la “era web”, las páginas transmitidas mediante el protocolo HTTP (W3C, 2002b) eran prácticamente “estáticas”. Por “estáticas” debemos entender que éstas son desplegadas por los visores web o browsers tal y como se encuentran estructuradas dentro de su código HTML (W3C, 2002a) sin modificación alguna; no existen en ellas funciones de personalización o despliegue de menús secundarios tal como vemos hoy en la mayoría. No tiene que ver con el hecho de que podamos encontrar animaciones o sonido en el contenido de las páginas, eso está más relacionado con el diseño de interfaz de usuario y no con su estructura interna. Cuando tenemos una colección de páginas con una interfaz consistente y relacionadas a través de ligas o links entonces hablamos de un sitio. Como usuarios es muy natural el navegar dentro de un sitio si estamos acostumbrados a surfear la Web, ya que aprendemos de forma “inconsciente” el poder distinguir entre dos sitios o bien, el cómo ir navegando dentro de uno y también identificar elementos clave del contenido que sabemos que no están disponibles para otros usuarios, como en el caso del correo electrónico. Cuando páginas web poseen características como las antes mencionadas, éstas reciben el nombre de páginas “dinámicas”. Existen varias formas para poder desarrollar este tipo de páginas; estas formas reciben el nombre de tecnologías. Las tecnologías para la creación de páginas se pueden dar de dos formas: • Tecnologías para el cliente • Tecnologías para el servidor Como sabemos, nuestra máquina es el cliente que pide servicios a otra capacitada para ofrecerlos (el servidor). Podemos hacer todas las combinaciones de estas dos formas para dar paso a varios maneras de implementación con lo cual se puede desarrollar un sitio de páginas “dinámicas”. Éstas son conocidas como arquitecturas (Fraternali, 1999). Las arquitecturas pueden ser simples o múltiples. Usamos una arquitectura simple cuando tenemos el caso en que un cliente pide información a una máquina que funciona de servidor. Pero podemos encontrar los casos en el que el cliente pida la información a un servidor que a su vez interactúe con otros, este es el caso de las arquitecturas múltiples. El término para expresar el tipo de arquitectura que usamos es atadura y la palabra 1-atadura para llamar a una arquitectura simple, y multi-atadura en el caso de las múltiples, en particular 1-atadura, 2- atadura, etc. 17
  • Una aplicación de hipermedia puede describirse como software para uso específico que posee hipertexto y multimedia. Describiremos entonces a las aplicaciones web como un software de uso específico que es parte de la Web y que puede desplegarse a través de un visor web. 3.2 Simulación Web Todo lo anterior ha crecido el interés de las personas en usar la Web como una nueva plataforma para aplicaciones. La presión impuesta por la proliferación de la Web ha forzado a la comunidad que se dedica a la simulación a migrar a la Web para mantenerse viva (Kuljis et al., 2000). La historia de la simulación web comienza como un área de trabajo académico que fue presentada en una sesión de tres artículos en el Congreso de Simulación de Invierno (WSC por sus siglas en inglés) y según nos comenta Page (1998), fue la sesión con más concurrencia junto con el bloque correspondiente a metodologías para modelado. El primer congreso dedicado a esta nueva área fue en el año 1998, llamado WEBSIM ’98, y fue parte de la Multiconferencia Anual del Oeste de la Sociedad de Simulación por Computadora (SCS, 2002). La simulación web es el término que introdujo Paul A. Fishwick (Fishwick, 1996) para representar la conexión entre la Web y el campo de la simulación. Young et al. (1998) añaden a la definición que el propósito de la simulación web es ejecutar más simulaciones eficientes. La simulación web es un área que está emergiendo y de sumo interés tanto para los investigadores en simulación como para los practicantes de ésta (Arsham, 2002). Básicamente la simulación web es la consecuencia de que la simulación no haya podido escapar del auge que tiene ahora la Internet. Es por eso que muchas personas, como Ernest Page (Page et al., 2000), han afirmado que este enfoque en ver todo vía web es nada más que una fascinación por la tecnología. De hecho, Fishwick (1996) comenta que por presentarse tal situación, los artículos en simulación web están enfocados en la tecnología (en el sentido que leímos anteriormente), señalando que los investigadores en esta área requieren de un conocimiento substancial de la tecnología si desean aplicar la Web. A esto le añadimos el hecho de que las aplicaciones web cambian tan rápido que la información del área tiene que cambiar tan rápido como ésta. Tomemos en cuenta que con el auge de la World Wide Web (WWW) y el nuevo ambiente de trabajo que presenta, son muchas disciplinas las que están reevaluando sus enfoques, técnicas y filosofías (Page, 1998). La plataforma más popular para las aplicaciones web es la computadora personal (PC) debido al gran número de PC’s que existen en el mundo, las plataformas Apple de Macintosh y Unix quedan en segundo lugar. Por otra parte, la mayoría del software para Web está disponible para Windows 95, luego para Windows NT y Windows 3.1 y por último para las diferentes versiones de Unix (Fishwick, 1996). En el caso de la simulación web, la Web puede servir como sistema operativo y como el canal de distribución para sus aplicaciones. Además, la simulación web puede tomar las características de la Web (Kakakota y Whinston citados por Kuljis et al., 2000) a su favor: • Facilidad de navegación • Facilidad de publicación 18
  • • Nueva distribución de los modelos • Habilitación de un nuevo paradigma centrado en la red • Habilitación de nuevas aplicaciones de negocios internas (i.e. intranets) Entonces la problemática de la simulación web es definirse de manera autónoma dejando la definición de simulación clásica debido a que a que la Web per se redefine las características de la simulación web: Características de la Web Simulación Web Simulación Clásica Estándares comunes Sí No Independencia de Sí No plataforma Generalmente no Interoperabilidad No soportada soportada Facilidad de Navegación Varía Varía No requiere de Conocimiento Conocimiento conocimiento especializado requerido especializado requerido especializado No afectada por el cambio Afectada por el cambio Afectada por el cambio Sin estructura Estructurada Estructurada Tabla 1. Tabla comparativa entre las características de la Web y la Simulación Nos referimos a la interoperabilidad como la capacidad que tiene un software de estar en diferentes máquinas y compartir datos (INT, 2002). Fishwick (1996) describe los impactos potenciales de la Web en la simulación, enfocándose en tres áreas: 1. Educación y Entrenamiento 2. Publicaciones 3. Programas de Simulación Nos comenta que las tres áreas están interrelacionadas entre sí. Pero que el interés de la persona que trabaja en un área en particular de la simulación le da mayor importancia a una de éstas. En la actualidad la pregunta de la simulación web con respecto a la educación y entrenamiento es si podrá la primera establecer un nuevo paradigma de esta área. Los cimientos para establecerlo parten del simple hecho de que la mayoría de los paquetes de simulación son de interfaz gráfica (i.e. front-end gráfico). Esto permite al estudiante aprender a través de la exploración de un mundo virtual. La manera en la que la Web afecta esto es debido a que no existen las limitaciones usuales de las computadoras personales como el espacio de almacenamiento ya que la Web, al ser una red de computadoras, presenta un esquema distribuido. Por ejemplo, una forma de utilizar este recurso es almacenar de manera local 19
  • información básica del modelo pero que sus elementos estén en la Web. En general, incide a enfocarnos en reusar la información y el conocimiento. Muy interesante es el planteamiento de Fishwick (1996) sobre este enfoque: Mientras los académicos se revelarán para usar este tipo de conocimiento reusable, la industria tendrá que pensar de nuevo los términos de propiedad. Esto es porque además de producir software de simulación de buena calidad, necesitarán lucrar y desde luego, deberán permitir el uso de su información para otros sitios. Lo anterior, causado por el fenómeno web, produce incertidumbre de cómo se manejarían las autorías, derechos de autor, registros, etc. Otra forma en la que puede establecerse la educación y entrenamiento mediante la simulación web es simplemente colocar el software requerido en el web. Más que el hecho de cómo presentar el software de simulación a los usuarios, en la educación es el hecho de cómo enseñar simulación. La Web al ser hipermedia, tiene la posibilidad de contener elementos multimedia que marcan una ventaja en el aprendizaje a distancia por encima de la manera típica basada en libros de texto. La Web sumerge al estudiante en un ambiente de aprendizaje sintético que congenia más la formación del estudiante de simulación que leyendo un libro o viendo una cinta de video. Por otra parte, prácticamente todo elemento de hipermedia puede ser visualizado en el browser y si no es así, existe la posibilidad de encontrar un plug-in (agregados para el browser para usar dicho elemento) de forma gratuita en la Web. Con respecto a las publicaciones, la Web está cambiando la manera de publicar y el cambio es tan rápido que las personas han reestablecido la manera de realizarla y distribuirla. Publicar, como sabemos, es el medio que utilizamos para difundir la información de los nuevos conocimientos. Ese es el motivo de la gente que publica en simulación: dar a conocer los avances de sus investigaciones y sus aplicaciones. Para la gente de simulación que hace publicaciones, la Web viene a cambiar la manera en la que se lleva a cabo el proceso de informar a los demás. Aspectos como referenciar el contenido del artículo, revisiones, aceptación del editor en jefe, estar en cola para la publicación y la forma de archivación en papel han quedado atrás. De hecho la postura que han adoptado las personas relacionadas con el modelado y la simulación para publicar en las revistas más conocidas, es hacerlo de forma electrónica (Fishwick, 1996). El nuevo proceso adoptado orienta más a realizar búsquedas en la Internet, tener el documento y las referencias en algún estándar para documentos de la Web (e.g. PDF), permitir que el autor haga comentarios sobre el documento, pagar por servicios digitales y almacenamiento en vez de impresión en papel y, crear la cultura de definir el contenido del documento en palabras claves exactas que faciliten encontrar dicho documento por un usuario a través de los robots de búsqueda. Por último tenemos que el impacto de la Web en los programas de simulación, es lo emocionante que es realizar las simulaciones en la Web. Anteriormente hablamos de 20
  • tecnologías para el cliente y tecnologías para el servidor para el desarrollo de páginas. En general, podemos pensar en las diferentes opciones que tenemos para lograr la simulación en el web. La simulación requiere que exista un modelo y el modelo a su vez requiere de software para ejecutarse. De esta forma pensemos que algunas partes del modelo pueden ejecutarse en nuestras máquinas y el resto en otras. También es posible no llevar a cabo la simulación en nuestra máquina pero acceder a información general o a los resultados a través de la Web. Incluso nos distribuiríamos partes del modelo de tal forma que la simulación sea simultanea y no tan pesada para un solo equipo. Claramente el continuo avance y sofisticación de la Web nos brinda nuevas formas de expandir y utilizar el modelado y la simulación. Posteriormente Page (1998) después de una revisión de la literatura presenta una revisión de lo comentado por Fishwick (1996), estableciendo ahora cinco áreas de impacto: 1. La simulación como hipermedia 2. La simulación como metodología de investigación 3. Acceso vía web para los programas de simulación 4. Modelado y simulación distribuida 5. Simulación de la Web La hipermedia por su naturaleza característica puede ser explotada para presentar la simulación mediante elementos de multimedia e hipertexto. Entre las ventajas de ver la simulación como hipermedia está el hecho de que podemos acceder cómodamente a ella desde nuestro navegador o como un acceso directo colocado en nuestro escritorio. Similar a como hemos visto anteriormente, esta forma de realizar aplicaciones de modelado y simulación con este enfoque, nos abren la posibilidad a nuevas formas de educación y entrenamiento, en particular el establecimiento de nuevos paradigmas enfocados en aprendizaje a distancia e interactivo. La Web es un medio de alcance tan extenso que los nuevos modelos pueden ser diseminados muy rápidamente, así como sus resultados. Ya hemos visto un poco del cambio debido a la Web sobre la forma de publicar. Lo anterior estimula a establecer una nueva metodología de la investigación en simulación e investigación científica en general. Una de las ideas más comunes con la que el término simulación web es asociado, es la ejecución remota de la simulación proveniente de programas que son ejecutados en el servidor y enviando los datos (a través de formularios HTML por ejemplo). A las simulaciones que se hacen de este tipo las conocemos con el nombre de simulaciones legadas. La otra idea más común es desarrollar simulaciones basadas en código móvil que corran en el cliente. Es decir, acceder a pequeños programas ya realizados que se descargan en nuestra máquina para ser utilizado (e.g. applets). 21
  • El modelado y simulación distribuida es el área en el que están considerados todas las tecnologías orientadas a la Web y que son utilizadas para realizar ambas. Volvemos a tomar la palabra tecnología en el sentido presentado al principio. Son un conjunto de normas que en este caso le indican a la gente que quiere trabajar en aplicaciones web como desarrollarlas y concierne al manejo de los datos, transmisión, autentificación, entre otras cosas. Entre las comunes que se utilizan en la simulación distribuida están el Método de Invocación Remota (Java, 2002), la Arquitectura de Alto Nivel (DoD, 1998) y la Arquitectura de Controlador de Solicitud de Objetos Comunes (OMG, 2002). Las arquitecturas son más conocidas por sus siglas en inglés RMI, HLA y CORBA respectivamente. Por último es importante que tengamos en cuenta la simulación de la Web. Podemos hacer modelado y simulación para caracterizar la manera en la que se desenvuelve la Web y optimizarla. Por otra parte, Arnold Buss (en Page et al., 2000a) explica que el impacto de la explosión de las redes de computadoras en los últimos años ha causado un efecto revolucionario en la simulación, por lo que indica que para explotar los recursos actuales la naturaleza de la simulación obviamente debe cambiar. Explica que los modelos de simulación han sido diseñados de manera monolítica y que el advenimiento de la Programación Orientada a Objetos (Rumbaugh, 1991) lo que hace es presentarnos tan solo monolitos más elegantes. La simulación, ya sea de aplicación militar o industrial, han sido diseñadas para la ejecución de modelos en una sola máquina. Nos dice que para tales modelos la red ofrece poco. Piensa que usar el poder completo de las redes beneficia a la simulación y al modelado solo si se diseñan de manera diferente. El uso de datos al día que interactúan con base de datos a través de la red, aceleran el ciclo de modelado y toma de decisiones en gran magnitud. Él piensa que los modelos por computadora tienen gran potencial para el análisis y entrenamiento militar. En sí, considera que la simulación debe hacer uso de aplicaciones que reciban datos a través de una red de una base de datos dinámicamente generada, que creen los elementos y datos que usarían en el momento que se ejecuten los datos y que los componentes de software que las conformarían sean fáciles de integrar en otras aplicaciones. 3.3 Filosofía de la Simulación Web Page (en Page et al., 2000b) comenta que la piedra angular de la filosofía de la computación por mucho en los pasados 30 años, es el principio de Edsger Dijkstra de la “separación de preocupaciones” (Dijkstra, 1976). Este principio discute que el objetivo fundamental de un sistema de software es su corrección y que está dada por las consideraciones de diseño (del software) sin tomar en cuenta la infraestructura computacional que servirá para su ejecución. Esto nos induce a una separación de la especificación y la implementación. La fuerza de esta filosofía hace que sea tomada como la temática de muchos de los campos de las ciencias de la computación. 22
  • De manera informal, podemos definir la especificación como el conjunto de normas o estándares que seleccionamos con el que describimos el funcionamiento del software a desarrollar. Mientras que la implementación está enfocada a la manera en la que hacemos el desarrollo: lenguaje de programación, arquitectura seleccionada, etc. Page (1998) también menciona que esta filosofía ha sido cuestionada bajo observaciones pragmáticas. Menciona como ejemplo la conclusión de Swartout y Balzer (citados en Page et al., 2000a) de que esta separación no siempre es alcanzada en su totalidad, afirmando que cualquier especificación puede ser vista como la implementación de una especificación de orden mayor. Dentro de la comunidad de simulación existe el punto de vista de que la especificación del modelo es el dominio del modelador y que la implementación del modelo es el dominio de la automatización. Tal punto de vista va en contra del principio de Dijkstra, afirmando que la implementación no debe ser atrasada hasta que la especificación se termine y que el modelador debe permanecer aislado de los detalles de implementación en el mayor grado posible. Kevin J. Heavly (en Page et al., 2000a) comenta que la evolución de los lenguajes de especificación de modelos de alto nivel y sus formalismos han motivado a desarrollar más simulación, sobre todo por evitar la parte de programación. Indica que sin embargo, tales sistemas son frecuentemente difíciles de modificar o extender debido a una separación impuesta de la especificación y de su implementación. Lo anterior lleva a los modelos a reflejar un comportamiento pobre del sistema y no presentar potencial para distribución y reuso en otras empresas. Los comentarios de Page et al. (2000a) son bastante claros: “Si la World Wide Web está por efectuar grandes cambios en la metodología del modelado, entonces debemos alterar o abolir los principios existentes o introducir nuevos principios”. Lo anterior hace que analicemos el hecho de la Web influye en la tecnología de construcción de modelos, su ejecución y la manera de compartirlo, pero dicha influencia es poco palpable respecto a los principios. Sin embargo, Ray J. Paul (Page et al., 2000a) piensa que además de las ideas de impacto de la Web mencionadas anteriormente, una muy importante es el cambio de la naturaleza humana ante la Web. La generación actual está acostumbrada con la Web, juegos de video, aplicaciones de software para trabajos escolares, interfaces multimedia, correo electrónico, etc. También los Natural Born Webbers¸ como los llama Paul, están acostumbrados a un constante y rápido acceso a la información. Comenta que por lo anterior, estas personas de la era web poseen rápida retroalimentación y se enfocan en un punto de vista para el análisis y solución de problemas, tal y como sucede en juegos con múltiples jugadores por la Internet. Afirma que por la naturaleza de estas personas, en la medida que hagan uso de la simulación, necesitarán y 23
  • desearán desarrollar herramientas que permitan la rápida construcción de modelos y experimentación. Interesante es la afirmación de Paul sobre el hecho de que la generación de la era web tomará la simulación como un enfoque para el entendimiento de problemas. Es importante que tengamos en cuenta que la simulación web debe enfocarse siempre en el usuario. El usuario es una parte crucial para la simulación web independientemente de su desempeño. Cuando una aplicación no fue dirigida a los usuarios, rara vez progresa o tienen impacto social y la situación actual de la simulación web es esta (Kuljis et al., 2000). 3.4 Principios de la Simulación Web Para Page y Opper (en Page et al., 2000b) los principios de la simulación web son: 1. Proliferación de objetos digitales 2. Proliferación de estándares de software 3. Construcción de modelos por composición 4. Incremento del uso de los enfoques de “prueba y error” 5. Proliferación de la simulación por usuarios no expertos 6. Arquitecturas de múltiple atadura y sistemas multilenguajes Según Fishwick (1996), en el futuro cercano de la simulación web haremos uso de lo que él denomina objetos digitales en casi todo nuestro día a día. Estos objetos digitales son representaciones en la computadora de objetos físicos que encontramos en nuestro alrededor. Esta propuesta es la que generaliza su idea sobre el documento del futuro. Para él, pensar en documentos de hipermedia, es pensar en la posibilidad de documentos de simulación, por lo que el concepto de documento cambiará. Aun más, piensa que la idea de presentar la simulación usando símiles de documento (e.g. una página web) será reemplazada con el uso de símiles de objetos (los objetos digitales). Por ejemplo, en el caso de las manufactureras, llevarían a cabo el modelado con objetos digitales para efectuar simulaciones durante el proceso de desarrollo de los objetos físicos que modelarían. Los modelos de objetos digitales serían entonces equivalencias de los objetos físicos con la ventaja de ponerlos disponibles para muchos a través de la Web. Page et al. (2000b) comentan que Fishwick nos señala las preguntas que son planteadas por tal hecho como lo son el mantenimiento de los objetos digitales, los derechos de sus autores y cómo protegerlos y, los derechos de sus usuarios y cómo protegerlos. Fishwick piensa que una analogía de cómo controlamos, distribuimos e incluso alcanzamos el lucro con los objetos físicos, puede ser usada con los objetos digitales; aunque admite que todavía no está claro que tanto se podría lucrar. Obviamente tal proliferación de los objetos digitales no puede hacerse sin establecer estándares. Como la mayoría de las cosas que suceden en la Web, los estándares son de facto. Pero como la simulación es prácticamente nueva, el grupo de personas que trabajan en ella desde sus inicios no ha crecido mucho. Es común entonces que utilicen herramientas de desarrollo y tecnologías similares. 24
  • Perakath (2000) dice que el desarrollo se puede categorizar en dos grupos: • Desarrollo de software basado en componentes • Agentes de Software El desarrollo de software por componentes es un paradigma de la tecnología de información que se basa en ensamblar aplicaciones completas a partir de pequeñas partes denominadas componentes de tal forma que poseen la característica de que pueden usarse de nuevo en otras aplicaciones. Los componentes pueden distribuirse por red para dar paso a las aplicaciones distribuidas. Arquitecturas como RMI y CORBA son arquitecturas diseñadas para dar paso a este tipo de aplicaciones. En adición a éstas tenemos otros como el Modelo de Objeto Componente o COM de Microsoft y su versión distribuida llamada DCOM, y muy ligada a ellas (por tratarse de la misma compañía), está la tecnología para el desarrollo de componentes llamada ActiveX (Microsoft, 2002a y 2002b). Así, los componentes de software y el enfoque de desarrollo basado en componentes pueden ser utilizados para facilitar la simulación distribuida y la aplicación de la simulación de modelos en la Internet. Los agentes de software, por otro lado, son un área emergente que según Jennings, en palabras de Perakath (2000), en apariencia ofrecen una ventaja significativa a la comunidad de simulación. El concepto de agente fue introducido por Carl Hewitt y según Shoham (en Perakath, 2000) un agente de software es “una entidad de software la cual funciona continuamente y autónomamente en un ambiente particular, frecuentemente habitado por otros agentes y procesos”. Un ejemplo trivial, es nuestro agente de revisión ortográfica que va verificando las palabras conforme las vamos tecleando en un procesador de texto (e.g. Word). También nos comenta Shoham que un agente puede poseer las siguientes características: 1. Autonomía: El agente tiene sus estados y metas definidas de manera interna, y se comportan según su proximidad con sus metas o dependiendo del comportamiento del usuario. 2. Cooperación: El agente debe ser capaz de cooperar con otros agentes y con usuarios humanos. 3. Aprendizaje: El agente debe mejorar su desempeño con el tiempo. A este tipo de agentes que demuestran aprendizaje se les conoce con el nombre de agentes inteligentes. Los agentes entonces pueden ser adaptados y usados para beneficiar la simulación web, tanto en su desarrollo como en su aplicación. De esta manera el tercer principio, el de construcción del modelo por composición, establece que como consecuencia directa de la proliferación de objetos digitales y el establecimiento de estándares, haremos el modelado a partir de todos los objetos digitales a nuestro alcance. Este principio marca la filosofía de programar como ultimo recurso. Hemos visto que Paul comenta comportamientos típicos de los hijos de la era web: los natural born webbers. Pues bien, es claro que el principio de prueba y error está cimentado en el hecho de que la rapidez con la que acceden y retroalimentan la información las nuevas generaciones, y su necesidad de obtener algo que les funcione adecuadamente hace que 25
  • enriquezcan su proceso de análisis. Por lo que al usar los objetos digitales, ellos serán capaces de hacer búsquedas de manera masiva y rápida sobre cómo combinar los objetos digitales de manera que funcionen, lo cual se contrapone a la manera actual de hacer las cosas de realizar estas búsquedas en un espacio muy reducido. Debido a que la simulación podría volverse algo de uso común para los que usamos computadoras, entonces es importante que la educación avance como lo hace la tecnología. Claramente la proliferación de usuarios de simulación no expertos es algo que puede tomarse en dos vías. Una es la ventaja que muchas personas puedan acceder a procesos de simulación de manera tan cómoda y natural al usar su computadora, que no necesiten de mucho conocimiento previo sobre la técnica de modelado involucrada. Por otra parte, lo último es lo que marca el otro sentido. Presentar al usuario simulaciones de tipo lo que ves es lo que tienes (WYSIWYG, por sus siglas en inglés), puede tener por consecuencia que éste no sepa aplicar la técnica o lo haga de manera errónea. De ahí que la educación, y a esto se añade la metodología de modelado, tengan que avanzar juntos. Page et al. (2000b) de una vez proponen el uso de dar soporte a los usuarios a través de agentes de decisión inteligentes para establecer mecanismos seguros. Además, Page et al. (2000b) están seguros de que el mercado de objetos digitales en el futuro causará entonces una heterogeneidad de lenguajes de programación por lo que el proceso de composición naturalmente producirá sistemas multilenguajes. Por otro lado, señalan que las arquitecturas de multi-atadura son el enfoque que domina en la actualidad, lo cual es obvio en cierto punto. Acceder a información distribuida motiva a implementar formas de realizarla de manera más eficiente. Así, creen que esta tendencia de las arquitecturas múltiples durará bastante, y que en el contexto de la simulación podría usarse para ejecuciones repetibles con fines de análisis y en otros casos para ejecuciones en tiempo real con fines de entrenamiento. 3.5 Simulación web distribuida y paralela Como hemos visto anteriormente, la simulación web puede implementarse de manera distribuida (los elementos del modelo son ejecutados de manera ajena en equipos de posible diferente plataforma) o paralela (el modelo es resuelto de manera simultanea en equipos diferentes cuya plataforma puede ser la misma). También sabemos que RMI, CORBA y HLA y el uso de componentes (e.g. ActiveX) establecen los medios para realizarlas. “El propósito de la simulación distribuida y paralela es reducir el tiempo de simulación mediante la distribución del trabajo de simulación en múltiples procesos y habilitar la interoperabilidad en tiempo real con cada máquina de simulación” (Young et al., 1998). Así, Young et al. (1998) nos comentan que es posible alcanzar tal meta esencialmente usando paralelismo el cual implementa el proceso distribuido en una Simulación de Evento Discreto (DES, por sus siglas en inglés) asíncrona de una manera síncrona. Es ahí donde entran en juego las arquitecturas y tecnologías existentes. 26
  • En otras palabras, Young et al. realizan una combinación del paralelismo y los procesos distribuidos. El proceso distribuido es asíncrono, es decir, se da en intervalos no constantes en el tiempo; pero el paralelismo es un proceso síncrono, se realiza en intervalos de tiempo constantes. Aparentemente las simulaciones son llevadas a cabo de manera síncrona bajo un esquema de paralelismo, aunque en realidad los procesos se están dando de manera distribuida de forma intrínseca y por ende, asíncronos. De esta forma, Young et al (1998) muestran los tres tipos en los que se pueden implementar las herramientas desarrolladas para una DES en la web o una simulación distribuida en general: 1. Simulación alojada en el servidor 2. Simulación ejecutada en el cliente 3. Simulación híbrida cliente / servidor A su vez, caracterizan a la simulación web distribuida en dos: 1. Las que corren la simulación en un sistema de soporte para DES paralelas (PDES) estructuradas de forma aislada 2. Las que corren la simulación de forma distribuida en la Web En otras palabras. La primera categoría equivale a realizar las simulaciones en plataformas paralelas pero que sean consecuencia de la petición de un solo cliente. Es decir, por cada petición hay una simulación paralela trabajando y por último, los resultados son devueltos. En el segundo caso, es para cada petición, existe un servidor de simulación distribuida que se encarga de repartir el trabajo entre varios clientes para su ejecución. 27
  • Figura 17. Tipos de implementación de DES. a) La simulación alojada en el cliente. b) La simulación cliente / servidor distribuida en la Web. Claramente vemos que la primera categoría pertenece a las simulaciones de tipo alojadas en el cliente. Notemos que no es necesario una ejecución en paralelo de la simulación. Podría usarse un servidor que realice la simulación de forma secuencial siempre y cuando sea recomendable y no afecte mucho el desempeño. La categoría dos a su vez representa el tipo cliente / servidor de las simulaciones. Entonces, el tipo de simulación trivial corresponde a la simulación en el cliente. Young et al. (1998) se concentran en la implementación de la primera categoría afirmando que es la más seguida y que tienen los siguientes méritos: • Proporciona una forma fácil de construir el ambiente de simulación. Tan solo es necesario conectarnos al sistema local el cual soporta PDES y que tiene motores de simulación para las peticiones de los clientes. • El desempeño de la simulación está certificado y seguro. • No es necesario que el cliente se preocupe por la implementación de los procesos de simulación. • No es un problema que la velocidad actual de la Internet sea físicamente lenta e inestable. Con respecto a la segunda categoría, Young et al. (1998) presentan sus afirmaciones basándose en los experimentos realizados por Yücesan y su grupo. Piensan que estar haciendo simulaciones que se ejecutan en los clientes y en los servidores conducen a aspectos críticos para esta categoría como son la congestión y seguridad de la red, así como la eficiencia en la comunicación. A esto se añaden cuestiones sobre el desempeño de la simulación distribuida en función de su velocidad y el desarrollo de algoritmos eficientes para la distribución que sean inteligentes. 3.6 Aspectos Críticos del Proceso de Simulación que afectan a la Simulación Web “La simulación como una herramienta para el análisis, diseño, experimentación, prueba, entrenamiento y logística se ha vuelto viable con el advenimiento de la tecnología computacional práctica” (Amico et al., 1997). Entre los años 40 y 60 las computadoras análogas dominaban la época y servían para hacer simulaciones en tiempo real. Después vino el surgimiento de las computadoras digitales a finales de los 50 y a principios de los 60, remplazando a las anteriores en el campo de la simulación por computadora. Lo curioso del asunto, según nos comentan Amico et al. (1997), 28
  • es que a pesar de que la tecnología ha mejorado considerablemente, los problemas típicos de la simulación siguen siendo lo mismos. El proceso de simulación comienza básicamente con la identificación de los requerimientos tal y como lo hacemos en el desarrollo de cualquier software. Cuando hemos escuchado tales requerimientos o tenemos un documento de éstos, entonces procedemos a hacer un modelo conceptual de lo que vamos a simular. De aquí lo que hacemos a continuación es ir desarrollando las cuatro fases básicas para la simulación (Amico et al., 1997) que son: 1. Desarrollo del modelo o modelos matemáticos 2. Obtención de datos válidos y los datos basados en conocimiento previo 3. Seleccionar el hardware y desarrollar el software para llevar a cabo la simulación 4. Validación de la simulación De esta manera, los aspectos críticos relacionados con el proceso general de la simulación son: 1. Modelado 2. Datos 3. Implementación 4. Validación Además, tenemos que Amico et al (1997) ha encontrado tres aspectos muy significativos y que no están relacionados directamente con las fases que ya hemos visto: Limitaciones del Presupuesto de Planeación. Claramente el presupuesto nos limita al acceso de los recursos. Como estamos limitados en cuanto a presupuesto, debemos verificar que el tiempo de desarrollo y el costo de la simulación no lo exceda. El Tiempo del Ciclo de Desarrollo. Son muchos los factores que pueden afectar el ciclo de desarrollo del proyecto de simulación. Puede ser que conforme se vaya desarrollando el proyecto nos topemos con problemas inesperados que requieren de una replantación del proyecto y que no estaba considerado en el presupuesto, tal vez el sistema haya cambiado con el tiempo o que la gente involucrada con el proyecto al pasar el tiempo ya no sea la misma. La Comunicación durante el Ciclo de Desarrollo. La falta de comunicación o la mala presentación de ésta puede comenzar desde el proceso de pasar de las explicaciones verbales o del documento de requerimientos a la creación del modelo. Cuando no tenemos una comunicación clara dentro de los miembros del proyecto de simulación, claramente podemos hacer muchas malas interpretaciones de la meta del proyecto, de cómo implementarlo o bien de los resultados. 29
  • 3.6.1 Aspectos Críticos del Modelado Regresemos a los problemas que enfrentamos según Amico et al. (1997) en el proceso del desarrollo de la simulación. Primero tenemos el modelado. Los aspectos relacionados con ella podemos particionarlos en: • Clasificación de los modelos • Actualización del modelo para los cambios • Aplicación del modelo • Confianza del modelo • Reusabilidad del modelo Los modelos podemos clasificarlos según Amico et al. (1997) en: Modelos de Componentes: Son el tipo de modelos que están constituidos de pequeñas partes denominadas componentes. Lo que hacemos es dividir el modelo de un sistema complejo en sus partes mínimas. Además, esta forma de hacer modelado se adapta muy bien a los nuevos paradigmas de programación. Modelos de subsistemas: A diferencia de los modelos de componentes, los modelos de subsistemas ya son una conformación de éstos, de tal forma que se enfocan más en las entradas y en las salidas y en cómo funcionan. Modelos de sistemas: Estos modelos son en esencia una colección de subsistemas y de componentes. Obviamente esta es una vista del sistema a un nivel más alto. Modelos de Multisistema: Aquí ya vemos los modelos relacionados con simulaciones que manejan grandes cantidades de plataformas utilizadas. Este tipo de modelos, por su dimensión, está involucrado con logística, comunicaciones y otros sistemas que pueden influenciar la salida de un escenario dado (i.e. nos indican como se comportarían sistemas muy grandes). Por otra parte, es claro que los modelos deben estar preparados para las actualizaciones. Es posible que cuando estemos realizando el diseño detallado del modelo, su fabricación o prueba, se nos presenten cambios. El éxito de nuestro modelo radica en parte si este se puede adaptar adecuadamente a los cambios sin sufrir grandes alteraciones o de plano ser desechado. Las aplicaciones del modelo van desde la fase conceptual pasando por la de diseño, producción y logística. Cuando estamos en la fase conceptual, los modelos deben ser teóricamente correctos y representar los objetivos de la simulación de manera precisa; por esto no debemos hacer simplificaciones en esta fase. Es importante que la integridad del modelo la mantengamos desde su formación por componentes hasta ir agrupándolos en subsistemas y luego en sistemas. Es importante que nuestro modelo sea exacto en detalles. Cuando tratamos de detallar mucho un modelo podemos atrasar el proyecto o excedernos en costos. La confianza del modelo se 30
  • basa en el hecho de que podemos usar los recursos y datos disponibles y no alejarnos de los objetivos del proyecto de simulación. El enfoque de reusabilidad en el desarrollo de software ha tomado mucho auge debido a que podemos usar una y otra vez fragmentos de software ya realizados en situaciones diferentes pero que tienen los mismos requerimientos. La reusabilidad de los modelos busca el mismo fin; la posibilidad de tomar modelos ya validados y poder utilizarlos en proyectos diferentes de los que nacieron. 3.6.2 Aspectos Críticos de los Datos Después de tener bien definido el modelo con el que vamos a trabajar, nuestro siguiente paso según Amico et al. (1997) es la recolección de los datos de tal forma que sean adecuados en el uso del modelo. Debemos incluir en este aspecto las características de los sistemas físicos involucrados, el ambiente, el conocimiento del sistema e incluso conocer el comportamiento de los datos. Todo lo anterior es una parte esencial de la simulación de modelos y tales aspectos podemos clasificarlos como sigue: • Obtención de los datos • Datos de sistema • Datos ambientales • Datos de conocimiento • Datos del comportamiento humano En la obtención de los datos la precisión juega un papel crucial en la simulación del modelo, aunque podemos encontrarnos en algunos casos datos incompletos e incluso imprecisos. Una vez que tengamos los datos, debemos evaluarlos y tomaremos decisiones de cómo representarlos matemáticamente. Es posible que cuando no tengamos los datos disponibles podamos crearlos, aunque es importante que seamos muy suspicaces al hacerlo por el motivo de que podemos obtener resultados no deseados o frustrantes. Obviamente, apenas tengamos los datos disponibles para ejecutar la simulación del modelo, debemos sustituir los datos asumidos que utilizamos previamente. Podemos obtener los datos de una gran variedad de fuentes. De aquí tenemos que los datos del sistema válidos serán más fáciles de obtener cuando tengamos un modelo más maduro (i.e. bien diseñado) y un sistema actualizado (i.e. replanteado a lo que observamos actualmente). Los datos ambientales son considerados para aquellos sistemas que están relacionados con el modelado de la naturaleza como en el caso de modelar el océano, sistemas sensoriales o de visión. Manejar este tipo de datos puede ser algo complicado debido a que provienen de sistemas complejos que nos presentan gran variabilidad en los datos que podemos usar para ellos. Obtener el comportamiento real de un sistema para un proyecto de simulación puede ser una tarea muy compleja. Los datos de conocimiento son aquellos que manejamos en situaciones 31
  • donde están involucrados expertos del sistema real junto con las personas encargadas de la simulación. Su conocimiento sobre el sistema ayuda a realizar el proyecto. Por último, los datos de comportamiento humano están relacionados con los modelos en los que la computadora toma roles de individuos o de grupos de personas provenientes de sistemas tales como los militares o de interacción. 3.6.3 Aspectos de la Implementación El aspecto crítico relacionado con la implementación según Amico et al. (1997) es todo lo relacionado con el sistema computacional que usamos para poder llevar a cabo la simulación: el hardware y el software. El hardware debe ser lo suficientemente rápido y con la suficiente memoria para realizar la simulación de los modelos ya sea en tiempo real o tiempo no real. Con respecto al software, éste debe estar bien elaborado de tal forma que podamos implementar el modelo adecuadamente. Los aspectos particulares relacionados con el hardware podemos clasificarlos en: • Sistemas en tiempo no real • Sistemas en tiempo real Sabemos que los sistemas de tiempo real son aquellos cuyas salidas las obtenemos prácticamente al instante de que se ejecuta una parte o tarea particular del sistema, mientras que en los sistemas de tiempo no real debemos esperar a que se completen todas para obtener las salidas (INT, 2002). Los sistemas en tiempo no real los tenemos básicamente en las computadoras digitales de propósito general (e.g. computadoras personales). Las salidas pueden presentarse a través interfaces gráficas o impresas, tal vez ambas. Algo que debemos tener en cuenta es que si el tiempo de corrida de las simulaciones en este tipo de equipos es muy excesivo, éste puede fallar antes de que la corrida sea completada. Con respecto a los modelos que requieren resolverse en tiempo real es importante que consideremos computadoras con una velocidad y capacidad de memoria adecuadas para este tipo de trabajos. Esto lo hacemos con base a la implementación del modelo en software que hemos de resolver y los índices de iteración que son necesarios para poder hacerlo. Estos índices están determinados por la dinámica del sistema. En adición a lo presentado anteriormente, tenemos los aspectos relacionados con el software. El software nos provee las herramientas para convertir los modelos desarrollados en una forma que la computadora pueda ejecutar. Por esto, los programas de computadora que usemos debemos considerarlos respecto a las características del sistema para asegurar que los cálculos que realice la computadora sean estables y provean la precisión requerida. A su vez, Amico et al. (1997) comentan que los aspectos críticos que se presentan con respecto al software son: 32
  • • Errores de software • Dinámica de vehículo • Algoritmos de integración • Bases de datos ambientales Primero es claro que el desarrollo de modelos de simulación de gran escala está involucrado con el uso de muchísimas instrucciones con lo cual es inherente encontrar errores. Así, debemos establecer rangos aceptables de errores en el software según la forma en la que evaluemos nuestro software y de tal forma que no se nos presenten casos extremos como la caída del equipo. La dinámica de vehículo se refiere a los índices de iteración requeridos para una computación estable. Sin duda esta estabilidad es uno de los factores de mayor influencia en los requerimientos de software, por lo que prácticamente es un elemento clave en diseño de éste así como en la selección del hardware. Otro aspecto importante es la selección de los algoritmos de integración eficientes. Estos algoritmos son los métodos que conllevan a la solución del modelo por lo que es importante una buena selección con conocimiento previo de la precisión que ofrece cada uno. Las bases de datos ambientales están relacionadas directamente con los modelos involucrados con el modelado del ambiente (explicados anteriormente). Obviamente, el tamaño y resolución (i.e. la cantidad de campos) de este tipo de datos dependen del detalle de modelo desarrollado. Además de los aspectos ya mencionados, Amico et al (1997) proponen como quinto aspecto crucial en el software las Simulaciones de Interacción Distribuidas (DIS) y la Arquitectura de Alto Nivel (HLA). Ambas, son estándares para el desarrollo de simulación distribuida y en el web (DMSO, 2002). 3.6.4 Aspectos de Validación La validación es el proceso de probar una simulación para determinar si se ajusta a los objetivos establecidos. Así, la validación nos indica si se ha conservado la integridad de los requerimientos iniciales se ha mantenido de tal forma que después de pasar por todas las fases obtenemos un producto útil. La validación puede tomarse en cuenta desde la fase conceptual, no únicamente al final de todo el proceso. El usuario de la simulación (como producto final) tiene que estar involucrado en el proceso de validación por obvias razones. Confiar en los resultados es crucial para las personas que toman decisiones sobre la base de los resultados de la simulación o bien, para el usuario final; en tal caso, personas especializadas en técnicas de análisis estadístico pueden ser muy útiles. Para Amico et al. (1997), los aspectos críticos de la validación son: • Validación del modelo y datos 33
  • • Validación de la implementación • Prueba de la simulación • Validación de la simulación El modelo es desarrollado en la fase de diseño con los datos presentes. Por tanto, la validación del modelo y datos se refiere a revisarlos en comparación con los requerimientos establecidos. Conforme la simulación avanza hacia la prueba nos encontramos con dos fases distintas. La primera tiene por objetivo determinar si la ejecución de la simulación se lleva a cabo como fue diseñada y básicamente confiere internamente al desarrollador de la simulación. La siguiente fase está involucrada con la persona o el grupo de personas por los que la simulación es desarrollada y sirven para determinar si los requerimientos primarios fueron satisfechos. Al final, la validación de la simulación es verificar si ésta cumple en su totalidad con la versión final de requerimientos (después de pasar por todas las fases). Aquí es donde el usuario cumple con los requerimientos y si cumplió con su propósito. Es importante que notemos que algunas veces no son necesariamente lo mismos. Aunque el proceso de simulación podemos determinarlo en las fases mencionadas anteriormente, es claro que el factor humano es muy influyente en cada uno de éstas. El éxito del proyecto puede radicar en las personas encargadas en realizarlo, los simulacionistas. Rogers (1997) clasifica los elementos del simulacionista ideal en 1. Atributos 2. Don de gentes 3. Habilidades básicas 4. Modelado 5. Enfoque de sistemas 6. Factores humanos 7. Conocimiento del dominio 8. Métodos de simulación La categoría de atributos se refiere según Rogers (1997), a aspectos que el simulacionista debería tener. El simulacionista debe ser una persona creativa en la solución de problemas. Como el simulacionista convive con personas de disciplinas ajenas, debe tener habilidades de liderazgo que facilite un esfuerzo colaborativo multidisciplinario. La tecnología involucrada con el proyecto podría cambiar, entonces el simulacionista debe reconocer tales cambios y adaptarse a ellos. Entre los atributos del simulacionista se encuentra la experiencia. Sin embargo, podemos decir que el factor de experiencia real de un simulacionista es su experiencia adquirida durante su vida. Diferentes situaciones han remanecido en el simulacionista en una serie de conocimientos basados en lo vivido, tal habilidad puede ser muy significativa como desarrollador de un proyecto de simulación para facilitar todo el proceso. Básicamente tenemos en el simulacionista dos tipos de experiencia: 34
  • • La experiencia pragmática sobre cómo alcanzar la meta de un proyecto, ya sea de simulación o no. • La experiencia multidisciplinaria que le permite trabajar en los distintos cánones de varias disciplinas. Como persona un simulacionista debe poseer en su personalidad los atributos de ser creativo, resolvedor de problemas, líder, adaptable, visionario, abierto de mente y, tolerante. El don de gentes de un simulacionista según Rogers (1997) sirve para poder interactuar adecuadamente con los otros miembros involucrados en el desarrollo; de ahí que para empezar, un simulacionista deba tener muy buena escritura y facilidad de expresión. Debe ser capaz de aceptar y tolerar las ideas de otras personas y establecerse un compromiso de aprender todo el tiempo de su vida. Sin embargo como habilidades básicas, Rogers (1997) propone que un simulacionista debe poseer una buena capacidad para el análisis, conocimientos y habilidad en probabilidad y estadística (recordemos lo relacionado con la validación de datos mencionado anteriormente), así como de diseños experimentales y métodos estocásticos ya que muchas veces el modelado puede requerir este tipo de conocimientos un poco más profundos para su elaboración. Por la relación computación-simulación, el simulacionista también debe saber de computación e incluso es preferente que pueda competir en ésta rama; interpretamos el verbo anterior como un desempeño óptimo por parte del simulacionista ante la computadora como su herramienta. Además de lo relacionado a probabilidad o estadística, algunos modelos pueden involucrar otras ramas de matemáticas o investigación de operaciones (e.g. simulación para colas de un banco); entonces es importante que el simulacionista tenga conocimientos para tener al menos una idea de la rama de matemáticas que podría ser más útil para modelar. Además como los proyectos de simulación pueden tardar mucho y ser costosos, el simulacionista entonces debe tener entre sus habilidades básicas la administración de proyectos, para ver como se va desarrollando, y el modelado del costo que se refiere a planificar bien la forma en la que se darán los costos involucrados. El siguiente elemento que posee un simulacionista ideal es el modelado (Rogers, 1997). Como imaginamos, el modelado es el más importante. Muchos aspectos están involucrados con este elemento tales como la habilidad de la persona para la construcción de modelos, ser empíricos, apreciar las capacidades y limitaciones de los métodos experimentales, mirar el sistema desde diferentes perspectivas y ajustar la abstracción obtenida para alcanzar un buen grado de fidelidad (i.e. representativo del sistema), saber hacer trueques entre los costos y el nivel de detalle querido, usar varios paradigmas para la construcción de los modelos, tener en cuenta el costo-beneficio del modelado y hacer su análisis de riesgo y por último, tener conocimientos de ingeniería (i.e. desarrollo metódico de un producto útil). En adición a lo anterior, Rogers (1997) menciona que un enfoque de sistemas es un elemento útil como persona dedicada a realizar proyectos de simulación. Las ventajas de tener este enfoque es la forma en la que se va desarrollando todo el proceso. Obviamente el primero paso es la definición del problema para luego identificar los elementos claves del sistema que es lo 35
  • incluido en el modelo. También desde este enfoque podemos establecer un método para encontrar el nivel adecuado de abstracción, realizar un análisis bien planeado. También gracias a este enfoque, está la familiaridad de trabajar con heurísticas o bien, implementar evaluaciones. Los factores humanos del simulacionista están divididos según Rogers (1997) en dos consideraciones. La primera es cuando el simulacionista está modelando comportamientos de individuos o grupos, en estos debe entender las dificultades que se presentan al realizar este tipo de tarea; o sea, conocer más el problema que estar pensando únicamente en cómo resolverlo. La segunda consideración tiene más que ver con la interacción humano- computadora; es decir, con la manera en que la simulación es presentada (e.g. un simulador de vuelo) y si ésta se adapta al usuario de manera confortable (i.e. ergonomía). El simulacionista debe tener conocimiento del dominio en el cual está trabajando. Sin embargo, el simulacionista es parte de un equipo, así que el experto en el dominio debe hacer uso de su juicio sobre cualquier supuesto asumido del dominio, similar a como mencionamos en el aspecto de validación anteriormente. Los métodos de simulación son técnicas para diseñar, desarrollar, producir e implementar, operar y evaluar las simulaciones (Rogers, 1997). Debido a que proyectos de simulación participan muchas personas, la metodología a seguir puede ser difícil de establecer. El simulacionista debe entonces tener la capacidad de conocer los métodos de simulación y proponer cual o cuales serán usados dentro de la metodología que se llegara a establecer. En general, podemos decir en primera instancia que ¡un simulacionista es una persona que lo sabe y hace todo! Sin que lleguemos a la exageración, debemos estar concientes que el hecho de trabajar en un grupo multidisciplinario donde todos hablan un lenguaje (técnico) diferente, el plasmar una representación de la realidad a través de un modelo matemático, saber cuales son las herramientas que nos permitan construir tal modelo, confiar en los resultados a través de una buena validación y que al final la simulación se vea como un producto útil en el que el usuario se sienta cómodo o satisfecho, sin duda ¡es una tarea muy laboriosa! Los simulacionistas entonces, deben ser personas preparadas tanto en conocimientos de la técnica como del trato con las personas y estar siempre dispuestos a acumular experiencias a través de la vivencia de cada uno de los proyectos en los que participan. 36
  • 37
  • 4.1 Qué es la Ingeniería de Hipermedia Como usuarios, es probable que por curiosidad nos preguntemos cómo los creadores lograron los sitios web, ya sean de tipo dinámico o estático. Como desarrolladores nuestras dudas radican en saber si existe una forma apropiada de poder desarrollarlas. Las personas que desarrollan aplicaciones informáticas siguen un proceso de ingeniería que se conoce como ingeniería de software. Existen diferentes metodologías para hacer ingeniería de software y la hipermedia no puede ser la excepción. Claramente, las aplicaciones web, y en general las aplicaciones de hipermedia, deben desarrollarse a través de un proceso de ingeniería de software. También, es importante que sepamos que la ingeniería de software es una de las ramas de las ciencias de la computación que toma base del principio de preocupaciones de Dijkstra. El proceso de ingeniería de software tal como el proceso de ingeniería civil (e.g. la construcción de una casa) se debe ir dando por etapas, con cierto número de pasos en cada etapa. A todas estas etapas y la forma en la que se relacionan (en su precedencia y resultados) le llamamos ciclo de vida de desarrollo del sistema o CVDS. Según Fraternali (1999) en el caso de una aplicación web los elementos que componen su CVDS son: 1. Análisis de Requerimientos 2. Conceptualización 3. Prototipos y verificación 4. Diseño 5. Implementación 6. Mantenimiento y Evolución. El Análisis de Requerimientos proporciona básicamente el perfil de nuestro usuario prospecto y explica la interacción de éste con la aplicación. Por otra parte, la Conceptualización es representar la aplicación mediante modelos abstractos que explican nuestra visión de la aplicación lo más general posible. Después podemos dar paso a crear Prototipos y hacer Verificaciones debido a que suele ser más fácil de identificar los detalles que se pasaron por alto previamente. Independientemente si realizamos prototipos o no, tomamos los esquemas conceptuales para derivarlos en otros de un nivel más bajo (más cercanos a la aplicación y su funcionamiento), entonces decimos que estamos en la etapa de Diseño. Posteriormente en la Implementación transformamos el diseño en interfaces usables para el usuario escogiendo el lenguaje en el que la aplicación será entregada, definiendo la arquitectura, entre otras cosas. Una vez liberada la aplicación, nos encontramos en la Evolución y Mantenimiento porque obviamente debemos ser capaces de reparar cualquier error o detalle encontrado por los usuarios, etc. El CVDS para el desarrollo de una aplicación de hipermedia, y por ende de web, es similar al de cualquier aplicación de software. Aunque podríamos decir que el parecido es prácticamente en el nombre de las etapas de la ingeniería. No en todos los casos se nombran de igual manera. 38
  • En vez de que hablemos en metodologías de ingeniería, usamos el término modelo o método. Un modelo en este caso nos referirá a ese conjunto de productos, formalismos y mecanismos que iremos usando durante todo el CVDS. Los nombres de las etapas entre los diferentes modelos pueden cambiar, pero prácticamente son una variante del esquema básico del CVDS y que se arraigan a un tipo de conceptualización en particular (o metodología previa) dando su propia versión de éste (en nuestro caso, para el desarrollo de aplicaciones de hipermedia). Independientemente del Modelo que escojamos para ir desarrollando nuestra aplicación web existe algo en lo que se enfocan las más usadas y principales: La navegación de la aplicación diseñada para el usuario prospecto de tal forma que le sea usable. Esto quiere decir que si trabajamos en aplicaciones web o de hipermedia, siempre debemos estar concientes que el éxito de la aplicación radica en un buen diseño de navegación. Básicamente porque un buen diseño navegacional facilita el uso y aprendizaje de la aplicación. Esto es lo que interpreta Nanard (1995) como el factor humano en el desarrollo de una aplicación de hipermedia. 4.2 OOHDM El nombre de nuestra aplicación será SymWeb por Simulación y Modelado vía Web. Empezaremos nuestra metodología haciendo el desarrollo de la aplicación mediante la ingeniería de hipermedia. También encontraremos detalles relativos a la forma en la que adaptamos a esta aplicación los 6 pasos de CVDS. Para el desarrollo de SymWeb escogimos el Modelo de Diseño de Hipermedia Orientado a Objetos (OOHDM) desarrollado por Daniel Schwabe y Gustavo Rossi (Schwabe et al., 2002). Los motivos de su selección son que cubre las dimensiones que caracterizan toda aplicación web según Fraternali (1999) las cuales son: 1. Estructura 2. Navegación 3. Presentación Además de que su enfoque nos extiende las posibilidades a poder hacer las aplicaciones reusables y personalizadas (Schwabe et al. 2001a, 2001b). El OOHDM, como presenta Schwabe (2002), está constituido de las siguientes fases: 1. Análisis de Requerimientos 2. Modelo Conceptual 3. Esquema de Navegación 4. Modelo de Navegación 5. Diseño Abstracto de Navegación 6. Implementación 39
  • Como podemos notar, el OOHDM se “adapta” a las diferentes etapas de CVDS mencionado anteriormente aunque a simple vista todo parece radicar en tener la conceptualización de la aplicación basada en el enfoque Orientado a Objetos, que en realidad es la Object Modeling Technology propuesta por Rumbaugh (1991), pero que presenta la noción de los objetos de navegación como vistas de los objetos conceptuales en el sentido de base de datos, organiza el espacio de navegación con la introducción de contextos de navegación, determina la separación de los aspectos relacionados con la interfaz de usuario con aquellos de la navegación y nos da explícitamente una identificación de que existen decisiones de diseño que necesitan ser hechas solo al momento de la implementación. 4.3 Análisis de Requerimientos El Análisis de Requerimientos del OOHDM está conformado por tres elementos básicos: 1. Escenarios de Usuarios 2. Casos de Uso 3. Diagramas de Interacción de Usuarios Los últimos son particulares de este modelo, que en síntesis nos presentan el papel de los “actores” de la aplicación (Schwabe et al. 2000a). Para completar la fase de Análisis debemos proceder con los siguientes pasos como se indica a continuación: 4.3.1 Identificación de Roles y Tareas Un rol o actor es el término que usamos en OOHDM para describir a las entidades que intervienen en el uso de la aplicación. Como entidad, un actor, puede ejecutar múltiples roles también. Como SymWeb está enfocado a la simulación de modelos matemáticos veterinarios por parte de personas interesadas en el tema, entonces definiremos los roles dependiendo de las características particulares que puede poseer un usuario. El listado de los roles nos queda como sigue: Rol Descripción Tareas del Rol Usuario No Usuario común; es decir, a Conseguir información acerca de lo aquel que entra a navegar la que es SymWeb. Registrado aplicación con meros Registrarse para poder acceder a las propósitos informativos, por posibilidades de la aplicación. curiosidad o por accidente (navegación). Usuario Registrado Usuario que ha pasado por el Acceder a los diferentes modelos 40
  • proceso de registro en SymWeb publicados. Simular modelos publicados y exportar resultados para otros usuarios. Graficar los resultados de la simulación del modelo en uso. Candidato a ser Usuario Publicador Usuario Publicador Usuario registrado que tiene la Acceder a los diferentes modelos capacidad de publicar modelos publicados. matemáticos para otros Simular modelos publicados y usuarios registrados exportar resultados para otros usuarios. Graficar los resultados de la simulación del modelo en uso. Publicar Modelos Matemáticos para la simulación por parte de otros usuarios. Administrador Usuario registrado único que Acceder a los diferentes modelos tiene la capacidad de publicar publicados. modelos matemáticos en Simular modelos publicados y SymWeb pero también tiene la exportar resultados para otros capacidad de administrar a los usuarios. usuarios registrados. Graficar los resultados de la simulación del modelo en uso. Publicar Modelos Matemáticos para la simulación por parte de otros usuarios. Dar permiso a los usuarios registrados para publicar. Dar de baja a los usuarios registrados y modelos publicados según criterios del Administrador. 4.3.2 Especificaciones de Escenario Los Escenarios son descripciones narrativas de cómo la aplicación puede ser usada. (Carroll citado por Schwabe, 2000). Por lo tanto, una vez que hayamos definido a los diferentes actores de la aplicación, procederemos a definir si alguno de los actores posee más de un rol; posterior a esto, pasaremos a hacer las Especificaciones de Escenario tomando las descripciones narrativas o textuales mencionadas anteriormente. Las especificaciones las podemos hacer nosotros si somos diseñadores de la aplicación o dejar que los usuarios nos la proporcionen. Siempre es recomendable la segunda opción. Pero de no ser posible lo anterior, debemos redactar las especificaciones tal y como procedimos en SymWeb: 41
  • UNR1. Navegar SymWeb El usuario no registrado o regular accede a la página principal de SymWeb y ve las opciones de búsqueda, selección de modelos, simulación y graficación de resultados pero no puede acceder a ellos por lo que tendrá que registrarse. La opción de búsqueda está deshabilitada. El usuario hace clic al enlace que corresponde a la selección de modelos pero en el contenido de la nueva página solo encuentra una descripción de la información acerca de la disposición de modelos para usuarios registrados y se enlistan para que el usuario tenga una idea de los modelos que podrá usar. En el caso de la sección del simulador y del graficador se encuentra con una pequeña explicación de su funcionamiento únicamente. El usuario también nota en su acceso ligas a las entidades participantes como la UADY, Fmat, Facultad de Veterinaria, CONACYT, entre otras. UR1. Comenzar la navegación en SymWeb El usuario registrado accede a SymWeb por medio de su URL entonces accede a la página que un usuario no registrado encuentra. El usuario procede a introducir su login y su password para poder tener acceso a las utilidades de la aplicación. UR2. El usuario simula un modelo matemático y grafica resultados de simulación El usuario selecciona un modelo de la sección donde se encuentra la lista de modelos. Se actualiza la aplicación mostrando la información del modelo junto con las variables de estado o parámetros y sus respectivos valores por defecto, entonces puede cambiar los valores si desea. Procede a ejecutar la simulación. La aplicación se actualiza proporcionando de forma tabulada los resultados de las variables de estado o parámetros graficables. Entonces el usuario puede ir a la sección del graficador y seleccionar de las variables de estado o parámetros graficables una o más para que el graficador presente su curva correspondiente. Si el usuario va a la sección del graficador sin haber efectuado simulación alguna, ninguna gráfica podrá estar disponible. UR3. Cambiar o actualizar el perfil de usuario Después de pasar por UR1, el usuario accede a la sección del perfil de usuarios. La aplicación se actualiza y entonces despliega los datos de los usuarios que fueron proporcionados previamente en su registro. El usuario puede cambiar los valores y entonces proceder a actualizarlos. También en esta sección se encuentra la opción de darse de baja como usuario registrado con lo que el rol cambia a un escenario UNR1. UR4. Enterarse de que eres publicador Según criterios del Administrador, el usuario registrado es ahora un publicador de modelos. El usuario no necesariamente está navegando SymWeb pero si está verificando su correo vía web o tiene su cliente de correo electrónico activo, entonces ve que tiene un nuevo correo por parte del administrador de SymWeb donde le indica que se ha vuelto publicador y cómo ha de proceder para la publicación de modelos. UP1. Publicación de un modelo matemático en SymWeb El usuario es un usuario registrado que ha accedido a la aplicación como todos los demás, además ha recibido una notificación vía correo electrónico en la que se le indica que es 42
  • publicador. Ahora bien, al estar adentro de SymWeb el usuario nota que entre sus opciones una más se encuentra disponible y que está etiquetada con la palabra “Publicar”. El usuario se va a esta sección y entonces se le pide que suba al servidor un archivo de texto generado por el software HPS Stella VI (opción disponible dentro de la aplicación). El administrador de la aplicación tiene conocimiento entonces de que el usuario posee este software de modelado en su equipo local. El usuario selecciona entonces el archivo que desea subir y procede a seleccionar la opción que alojará este archivo en el servidor de la aplicación web, entonces se le pide que llene una forma con información referente al modelo (como el perfil del modelo) y también se le indica si desea subir un archivo relacionado al modelo que contenga información descriptiva sobre éste (puede ser texto o una imagen). También llena una forma para formar un perfil del archivo relacionado, aunque es más corta y menos importante que la que se refería al modelo. Cuando el usuario está listo para proceder a la publicación, en el servidor entonces se genera una “traducción” del archivo de texto a un formato ejecutable por el servidor de la aplicación (probablemente con código de script del lado del servidor). Al terminar el proceso (dejando al usuario esperando), se le indica al usuario el éxito o fracaso de la publicación y es devuelto entonces (se actualiza la aplicación) a la sección de modelos donde puede o no estar en lista su modelo recién publicado. Cuando sucedan casos de que el archivo de texto sea muy grande o el archivo relacionado sea así, se le darán indicaciones al usuario de que no proceden tales archivos y que su publicación no podrá hacerse. Ugnal1. Búsqueda dentro de la aplicación Los usuarios registrados, ya sean publicadores o no, obviamente tendrán acceso a la sección de búsqueda. Ésta puede hacerse sencillamente tecleando una palabra o frase y el buscador devuelve al usuario una lista de modelos o archivos relacionados que tienen palabras claves que coinciden con el criterio de búsqueda. También el usuario puede usar la búsqueda extendida, que consiste en siempre teclear palabras para formar el criterio pero que además brinda al usuario la ventaja de especificar si la búsqueda a de realizarse solo en los archivos de modelos o solo en los archivos relacionados, si lo que se ha puesto como criterio es el nombre de un autor, si se busca por el tamaño en kilobytes, etc. Ugnal2. Salirse de SymWeb El usuario registrado al acceder a través de la sección de login es considerado como una sesión por parte de la aplicación. Por tanto, cuando el usuario ya no quiera hacer uso de SymWeb es recomendable que se salga del sistema. El usuario ha concluido su trabajo, simplemente selecciona la opción de salirse y listo, su sesión ha sido cerrada. Si el usuario ha dejado por más de 20 minutos inactiva la aplicación (que no navegue dentro de ella), automáticamente se expulsará al usuario de SymWeb. Admin1. Administrar a los usuarios El administrador tiene la capacidad de dar de alta a los usuarios que así considere y también permitirle a algunos de ellos publicar. El administrador accede a la aplicación con su login y password. Entonces accede a una sección especial de administración de usuarios. Ahí se lista el nombre completo de los usuarios y sus correos electrónicos. El administrador selecciona mediante casillas de verificación a los usuarios que desea eliminar o cuyos permisos desea 43
  • cambiar en la base de datos. Selecciona la opción de lo que vaya a hacer. Y se regresa otra vez a la sección principal de SymWeb. Cuando se cambia el permiso de publicación en los usuarios (i.e. se les permitirá publicar), la aplicación se encargará de enviar un mensaje avisándole sobre la nueva función que pueden utilizar. Admin2. Administrar los modelos El administrador tiene la capacidad de dar de baja a los modelos publicados que así considere. El administrador accede a la aplicación con su login y password. Entonces accede a una sección especial de administración de modelos. Ahí se lista el nombre del modelo. El administrador selecciona mediante casillas de verificación a los modelos que desea eliminar. Y se regresa otra vez a la sección principal de SymWeb. 4.3.3 Casos de Uso Hasta el momento hemos realizado el análisis identificando a los actores (usuarios de la aplicación) que algunas veces interpretan un solo rol (en este caso son indistintos los términos rol y usuarios) o muchos roles a la vez (en distintos momentos o de manera simultanea). Posterior a esto hemos descrito explícitamente los escenarios que se pueden presentar en la aplicación, que podemos interpretar como diferentes situaciones o eventos (no en el sentido de programación orientada a eventos). Dentro de SymWeb tenemos que el usuario puede interpretarse por varios actores presentando diferentes roles. En nuestro caso, el rol básico que un actor puede interpretar es el de Usuario No Registrado. Este tipo de actor puede cambiar de rol dependiendo del evento que denominamos Registro de Usuarios en donde este actor pasa a ser ahora parte del grupo de actores que interpretan este rol dentro de la aplicación. Por otra parte, algunos de estos Usuarios Registrados tiene la capacidad de poder ejecutar otro rol de manera simultanea: Usuario Publicador. Existe el actor de la aplicación que le indica a un Usuario Registrado cuando puede desempeñar el rol alterno, éste es el Administrador, quien al fin y al cabo es un “actor multifacético” ya que puede desempeñar todos los roles posibles dentro de la aplicación. Estos actores deben desenvolverse en un escenario para que puedan desempeñar el rol o sus roles. De ahí que procedamos a hacer especificaciones sobre tales escenarios (como lo vimos en la sección anterior). Con respecto a nuestra aplicación tenemos que existen diferentes escenarios. Estas especificaciones las hicimos en tiempo de diseño pero fueron extraídas en seminarios de tesis donde hubo discusiones de lo que se espera que la aplicación haga o la forma en la que los usuarios (y el administrador designado) habrían de usarla. En el caso particular de SymWeb redactamos los escenarios de manera muy específica debido a que la concepción del sistema está basada en una aplicación piloto que simula el comportamiento de las variables de estado con respecto al tiempo del modelo de Dijkstra (1992). Pero si tenemos las especificaciones de los escenarios muy generalizadas, que es cuando no nos queda clara la idea de la forma en la que se usa la aplicación (con respecto a 44
  • sus tareas), entonces aclaramos el cómo elaborando los Casos de Uso. Una manera completa en la que podemos describir los Casos es la siguiente: “Los escenarios que describen la misma tarea deben ser agrupados en Casos de Uso. La descripción de un Caso de Uso ha de incluir toda la información presentada en todos los escenarios. El diseñador debe identificar cuáles de los elementos de datos mostrados son relevantes... ” (Schwabe, 2000) Así lo que hacemos a continuación es agrupar los diferentes escenarios en los que se desempeñe la misma tarea, junto con los roles que la realizan: Caso de Uso: Registro de Usuario Escenarios: UNR1 Roles: Usuario No Registrado Descripción: 1. El usuario accede a la sección de registro de usuario desde la página principal 2. Llena casilla de texto etiquetada con login 3. Llena la casilla de texto etiquetada con password 4. Llena la casilla de texto etiquetada con password (para verificación ) 5. Llena la casilla de nombre 6. Llena la casilla de apellido 7. Llena la casilla de correo electrónico 8. Llena la casilla de dirección 9. Llena la casilla de URL 10. Procede enviar su forma de registro 45
  • 11. Se le redireccciona a la página principal pero ya con la sesión iniciada Caso de Uso: Inicio de Sesión Escenarios: UR1 / Admin1 Roles: Usuario Registrado, Administrador, Usuario Publicador Descripción: 1. Provee su login y su password el usuario cuando accede a la aplicación 2. Se corrobora que este usuario este usuario está dado de alta en la base de datos 3. Se actualiza la aplicación devolviendo la página principal con la sesión iniciada Caso de Uso: Actualización de Datos del Usuario Escenarios: UR3 Roles: Usuario Registrado, Administrador, Usuario Publicador Descripción: 1. Se le presenta al usuario su información de registro (login, password, nombre, etc.) 2. El usuario modifica ninguno, uno o más del contenido de las casillas de texto correspondientes a sus atributos 3. Dispara el evento de actualizar sus datos 4. Se le pregunta inmediatamente si está seguro de la información recién modificada 5. Para una respuesta negativa, se repite del paso 1 al paso 4 6. Para una respuesta afirmativa, se actualizan los datos del usuario en la base de datos 7. Se actualiza la aplicación y se envía al usuario a la página principal 46
  • Caso de Uso: Simulación de Modelos Matemáticos Escenarios: UR2 Roles: Usuario Registrado, Usuario Publicador y Administrador Descripción: 1. Se selecciona un modelo de la lista disponible 2. Se actualiza la aplicación, devolviendo la misma página pero con la información relevante al modelo recién seleccionado y el listado de las variables de estado o parámetros que pueden ser modificados (en casillas de texto o casillas de combinación) 3. El usuario modifica ninguno, uno o más de los valores de las variables de estado o parámetros 4. Procede a disparar el evento de simulación del modelo 5. La aplicación se actualiza devolviendo las salidas de la simulación en forma tabulada 6. El usuario puede repetir los pasos 1 a 5 o bien, del 3 al 5 Caso de Uso: Graficación de Resultados Escenarios: UR2 Roles: Usuarios Registrado, Usuario Publicador y Administrador Descripción: 1. Se enlista las variables de estado o parámetros graficables del modelo matemático simulado 2. El Usuario selecciona ninguna, una o más variables de estado o parámetros del modelo 3. Dispara el evento de graficación 4. Se actualiza la aplicación, se devuelve la gráfica de las variables de estado o parámetros del modelo en rango de valores determinados previamente en la simulación 47
  • 5. El usuario puede repetir del paso 1 al paso 4 6. Caso de Uso: Publicación de Modelos Matemáticos 7. Escenarios: UR4 / UP1 8. Roles: Usuario Publicador, Administrador 9. Descripción: 10. El usuario examina su computadora para seleccionar el archivo de texto que corresponde al modelo matemático diseñado en Stella 11. Dispara el evento para subir el archivo al servidor 12. Si existe algún problema, se notifica y se regresa al paso 1 13. El usuario llena la casilla de texto correspondiente al Titulo del Modelo 14. El usuario llena la casilla de texto correspondiente a la descripción del Modelo 15. El usuario llena la casilla correspondiente al autor 16. El usuario captura referencias (datos de artículos o libros) del modelo en un área de texto 17. El usuario proporciona en una casilla de texto un URL (página web, sitio ftp, gopher, etc.) externo en caso de ser posible 18. El usuario lista las palabras claves que pueden asociarse al modelo en publicación 19. En caso de existir un archivo relacionado al modelo se procede, en caso contrario se continúa a partir del paso 18 20. El usuario examina su computadora para seleccionar el archivo relacionado a este modelo 21. Dispara el evento para subir el archivo al servidor 22. Si existe algún problema, se notifica y se regresa al paso 10 48
  • 23. El usuario llena la casilla de texto correspondiente al título del archivo relacionado 24. El usuario captura una pequeña descripción del archivo relacionado 25. El usuario captura una lista de palabras clave asociadas al archivo relacionado 26. Se empieza la publicación del modelo y su archivo relacionado 27. Se traduce el archivo de texto a un formato adecuado para la ejecución del modelo en el web 28. Si existe algún error, se notifica y se regresa al paso 17 29. La aplicación se actualiza y se devuelve al usuario a la página principal Caso de Uso: Búsqueda Interna General Escenarios: Ugnal1 Roles: Usuario Registrado, Usuario Publicador y Administrador Descripción: 1. El usuario captura el texto a buscar o parte de éste 2. Dispara el evento de búsqueda 3. La aplicación se actualiza y devuelve un listado con los modelos matemáticos o archivos Caso de Uso: Búsqueda Interna Avanzada Escenarios: Ugnal1 49
  • Roles: Usuario Registrado, Usuario Publicador y Administrador Descripción: 1. El usuario captura el texto a buscar o parte de éste 2. Selecciona una clasificación para su búsqueda. Es decir: si es para buscar entre los modelos matemáticos o para buscar entre los archivos relacionados. 3. Especifica si el criterio de búsqueda es AND con respecto a todo el texto capturado 4. Dispara el evento de búsqueda 5. La aplicación se actualiza y devuelve un listado según el criterio de búsqueda Caso de Uso: Dar de baja a un usuario Escenarios: Admin1 Roles: Administrador Descripción: 1. Seleccionar al usuario que ha de darse de baja de la lista disponible para la administración de usuarios por parte del administrador 2. Seleccionar la opción “Eliminar usuario” 3. Se le envía automáticamente la notificación al correo del usuario 4. Se dispara el evento de eliminación de usuario y se actualiza la base de datos 5. Se actualiza la aplicación y se regresa a la página principal Caso de Uso: Dar de baja a un modelo Escenarios: Admin1 50
  • Roles: Administrador Descripción: 1. Seleccionar al modelo que ha de darse de baja de la lista disponible. 2. Seleccionar la opción “Eliminar modelo” 3. Se actualiza la aplicación y se regresa a la página principal Caso de Uso: Darse de baja como usuario Escenarios: UR3 Roles: Usuario Registrado, Usuario Publicador Descripción: 1. Se encuentra el usuario en el caso de uso de Actualización de Datos 2. El usuario selecciona la opción “Darme de baja” 3. Dispara el evento de eliminación de usuario, la base de datos se actualiza 4. El usuario es expulsado de la aplicación automáticamente Caso de Uso: Salirse de SymWeb Escenarios: Ugnal2 Roles: Usuario Registrado, Usuario Publicador y Administrador Descripción: 51
  • 1. Selecciona la opción de “Salir” 2. Dispara el evento de Salida de Usuario 3. El usuario es expulsado en la aplicación Para SymWeb los casos de uso los hicimos de una forma muy generalizada en el sentido de que se pueden extraer muchas variantes de ciertas tareas y convertir cada una en un caso de uso, aunque se encontrarían muchas similitudes entre los pasos o referencias a otros (e.g. el caso de uso “Darse de baja como usuario”); pero en algunos casos nos toparemos que estas diferencias aunque parecen poco significativas, delimitan bien dos tareas que pueden producir resultados diferentes (e.g. los dos casos de uso para las “búsquedas”). Como diseñadores, debemos tener la capacidad para poder interpretar las narraciones verbales o textuales del usuario o los usuarios, como ir “tamizando” sus palabras. 4.3.4 Diagramas de Interacción de Usuario Con los casos de uso delimitamos las tareas que se pueden dar dentro de la aplicación por escrito. Como las representaciones gráficas pueden ser más fáciles de “seguir” entonces hacemos uso de los Diagramas de Interacción de Usuario (UID por sus siglas en inglés). En estos diagramas son simplemente dibujos que explican de manera gráfica nuestros casos de uso. Un UID está formado por elipses y flechas (Schwabe et al, 2000a) donde las primeras representan la información intercambiada con otras elipses y las flechas son el procesamiento de la información que ocurre después de haber pasado de una elipse y que nos lleva a la siguiente. En nuestro caso, añadiremos a la elipse un segundo significado. Usaremos a la elipse para indicar también el lugar (físico o abstracto) que se ve afectado por el procesamiento de información. Tomemos el ejemplo de la siguiente figura: Diagrama 1. UID correspondiente a la modificación de los datos del Usuario. 52
  • El UID presentado está conformado por tres elipses y varias flechas. En la forma tradicional de hacer un UID el contenido de una elipse es igual a la presentada en la primera de éstas (a la izquierda). La información procesada viene siendo en este caso la del usuario y que puede modificar: login, password, nombre, etc. La flecha que se encuentra en ésta elipse y que no tiene elipse precedente, indica que es el punto de inicio del UID. Debajo del lado izquierdo se encuentra una línea con una bolita negra en su extremo, esto representa una operación producto del procesamiento de la información dada en esa elipse. Hablando de la primera elipse, la operación es “modificar cada uno de los datos presentados”. El número cero seguido del signo más nos indica que esta operación de modificación se puede hacer ninguna (nada se modifica), una (se modifica solo un dato del usuario) o muchas veces (modificaciones arbitrarias). Entonces, siempre ubicados en la misma elipse, encontramos una flecha que se apunta al mismo elipse (adecuación que presentamos para SymWeb). Esta flecha nos quiere decir que el procesamiento de los datos nos lleva de nuevo al punto de inicio, esto significa que modificar los datos puede hacerse cuantas veces deseemos hasta que decidamos pasar a la “siguiente elipse”. La siguiente elipse representa la adecuación para SymWeb que mencionamos anteriormente. Esto es porque si hubiéramos seguido la forma tradicional de “llenar” o “etiquetar” las elipses, tendríamos entonces que presentar en esta la información que se produce de la modificación de datos (señalar todos los atributos que se modifican pero en la base de datos), por lo que simplemente optamos por señalar el “lugar” en donde ocurre el proceso que es consecuencia del procesamiento de la información proveniente de la elipse anterior. La flecha que apunta de nuevo hacia la elipse de donde sale nos indica que ese cambio en la base de datos no es único (recordemos que podemos modificar más de nuestros datos como usuarios registrados). La flecha siguiente nos representa entonces que los datos han sido modificados y que la actualización está siendo realizada para la aplicación. La última elipse tiene el mismo significado que introducimos en este trabajo y que en este caso representa el lugar donde “aterrizamos” después de realizarse esta tarea. En Schwabe (2000) encontramos como hacer el análisis de requerimientos como lo mostramos acá (definición de roles, casos de uso y UID’s). Pero lo interesante es la manera en la que ejemplifica el UID, añadiendo comentarios para las elipses (e.g. si es la elipse una condición necesaria en el UID) y en las flechas (sobre el procesamiento de información). Así, adaptamos los UID’s para SymWeb presentándolos con tales agregados, aunque es importante la mención de que podemos leer los diagramas sin ellos. La forma en la que debemos presentar los UID’s es en el orden en el que hicimos los casos de estudio. Entonces en el caso de SymWeb tenemos: 53
  • Diagrama 2. UID para Registro de Usuario Este es el UID para el registro de un Usuario No Registrado para cambiar de rol y que presenta además agregados que hemos dispuesto para el diseño de estos diagramas (mencionados para el diagrama anterior). De nuevo, la flecha nos indica que lo primero que ha de suceder en esta tarea y que es el llenado de las casillas con la información de los usuarios (login, password, nombre, etc.). Notamos que el cuadro gris nos indica que es información requerida en el sentido que sin estos datos no habrá procesamiento de información y que la tarea simplemente no podremos realizarla. Posterior a esto se hace el envío de datos a la base de datos que se actualiza, da de alta al usuario y que nos lleva a una sesión iniciada dentro de la aplicación. Diagrama 3. UID para Inicio de Sesión Diagrama 4. UID para Actualización de Datos de Usuario 54
  • El UID anterior es el que hemos mostrado anteriormente pero con los agregados dispuestos para SymWeb. Observemos que tales agregados aunque aparentemente nos hacen más pesado el diagrama visualmente hablando, sí nos hacen más fácil la lectura de éste y el seguimiento de la tarea. Diagrama 5. UID para Simulación de Modelo Matemático Diagrama 6. UID para Graficación de Resultados de Simulación 55
  • Diagrama 7. UID para Publicación de Modelos Matemáticos Diagrama 8. UID para Búsqueda General 56
  • Diagrama 9. UID para Búsqueda Avanzada Diagrama 10. UID para Eliminación de Usuarios Registrados por el Administrador 57
  • Diagrama 11. UID para Dar de baja un Modelo publicado por parte del Administrador Diagrama 12. UID para Darse de baja como Usuario Registrado Diagrama 13. UID para Salir de la Aplicación 58
  • 4.4 Diseño Conceptual Durante el análisis de requerimientos obtuvimos información desde la perspectiva del usuario según sus necesidades. Posterior a esto concebiremos la aplicación. La manera en la que procedemos es tomando la esencia de la “Tecnología de Modelado de Objetos” propuesta por Rumbaugh (1991). Debemos definir toda la aplicación como una concepción de clases y objetos. Recordemos que una clase es la representación abstracta de lo que estamos modelando y que los objetos son las instancias de dichas clases. Dentro de una clase podemos encontrar los atributos que son simplemente propiedades que los caracterizan. También tenemos presentes en las clases las operaciones que son funciones o transformaciones que sus objetos pueden realizar. Cuando queremos representar una clase de manera gráfica lo hacemos como sigue: Clase 1. Clase llamada Usuario El rectángulo y su contenido es la clase en sí. Vemos que dicho rectángulo está compuesto básicamente de un titulo en la parte superior que nos indica como se llama la clase (en este caso: Usuario), posterior está el conjunto de atributos que puede tomar y sus tipos, y en la parte inferior tenemos el conjunto de operaciones cuyos objetos de esta clase pueden realizar. 59
  • Cuando se instancian las clases, se generan los objetos. Es decir, tenemos versiones “particulares” de la clase. Los diferentes objetos no se identifican mediante un atributo de identificación (e.g. ID: cadena) ya que en su concepción, éstos están determinados por los diferentes valores que asumen sus atributos de tal forma que les proporcionan su unicidad. Cada objeto será capaz también de hacer uso de las operaciones que le fueron brindadas al concebirse su clase. Así, podemos considerar que la siguiente figura representa una instancia de la clase Usuario: Objeto 1. Ejemplo del objeto Usuario Comenzaremos entonces definiendo las clases que están involucradas con SymWeb. Debemos tener en cuenta que la aplicación consiste en simular modelos matemáticos que generen resultados gráficos por usuarios que probablemente tendrán la capacidad de publicar tales modelos bajo el control de un administrador de aplicación quién por defecto publica los modelos. El enunciado anterior, aunque largo y agotador, prácticamente encierra los puntos señalados en los escenarios realizados previamente. Entonces podemos identificar las palabras que conforman el enunciado anterior como términos clave. Estos términos clave son los que en esencia constituyen el conjunto de clases involucradas con la aplicación. Podemos entonces considerar las siguientes clases preliminares: • Modelos Matemáticos • Gráficas • Usuarios • Administrador Analicemos ahora la consideración previa. Los Modelos Matemáticos son las “cosas” que serán simuladas por lo que de alguna forma deberán tener características propias que nos permitan distinguir entre un modelo y otro. También notamos que los modelos están conformados por un conjunto ecuaciones (por el simple hecho de ser un modelo) y que éstas tienen sus propias características. Otro punto interesante es la procedencia de los modelos. No se generan de la nada y deben ser creados por alguien. Algo muy importante en SymWeb es el hecho que los modelos son “pre-creados” en un software especializado para modelado 60
  • biomatemático. ¿Acaso los archivos de los modelos “originales” no tiene características propias? ¿Qué tenemos respecto a los archivos que son asociados a los modelos donde podemos encontrar información textual o gráfica de ellos? Por otra parte es fácil notar que la gráfica no es tan solo la curva generada. Es decir, no tenemos a la curva “volando” en la aplicación sino que la tenemos aterrizada en un plano, con sus respectivos ejes. En realidad podemos identificar características propias de cada elemento que compone la gráfica. De hecho, si los requerimientos de la aplicación nos obligan a optar por desplegar la gráfica como un mapa de bits, notamos que un mapa de bits es en realidad la instancia de algo que posee tamaño, formato, entre otros. En conclusión, ¡la gráfica puede ser modelada efectivamente como una clase! Ahora bien, si nos referimos como “usuario” a cualquier persona que sea capaz de usar la aplicación entonces es claro que el administrador es un usuario también y es único. Notemos también que no es lo mismo decir que todo usuario es publicador, el administrador y el grupo de usuarios cuyo permiso para publicar sea otorgado podrán hacerlo. Pero al fin al cabo, ¿no son todos usuarios? Tal vez por ahí debemos empezar el modelado de las “personas” que interactúan con la aplicación. Hay que tener en cuenta, tal y como se mencionó en el análisis, solo los usuarios registrados podrán hacer uso completo de la aplicación. En general, el modelar las clases en OOHDM es equivalente a concebir la aplicación. Aunque en una clase no podemos representar tal concepción, si podemos establecer relaciones entre las diferentes clases que nos lleven a tal fin. Usualmente (Schwabe et al, 1998) relacionamos las clases (gráficamente hablando) uniéndolas mediante flechas o líneas (cuando la relación es clara de leer) que son etiquetadas con el verbo o acción que expresa la relación y con indicadores en sus extremos (e.g. 1..*) sobre el tipo de la relación (i.e. uno a uno, muchos a uno o muchos a muchos). En nuestro caso, sustituiremos la notación propuesta en la literatura y retomaremos de Rumbaugh (1991) ya que requiere de menos escritura y representa lo mismo, solo que en un contexto gráfico (de los extremos de las flechas). Cuando tenemos el esquema de los diagramas de clases relacionados, entonces decimos que hemos llegado a la concepción de la aplicación; es decir, tenemos el esquema conceptual. El esquema conceptual, ya sea de SymWeb o de cualquier aplicación de hipermedia, nos explica la manera en la que está conformada la aplicación: las entidades que contienen la información y como se relacionan dichas entidades. Claramente la abstracción de las entidades dará pie a la creación de las clases. Para poder realizar un esquema conceptual es importante que tomemos en cuenta todas las entidades involucradas. No estamos en el punto de saber qué información verá el usuario o cómo accede a la información el usuario, mucho menos la forma en la que implementaremos la aplicación (e.g. HTML). Como resultado de hacer el análisis, segmentar la aplicación en entidades y establecer relaciones, obtendremos un solo esquema 61
  • conceptual. Esto significa que éste es la “abstracción completa” de la aplicación, por lo que podemos hacer una “lectura” de la aplicación con tan solo ver el esquema. Siempre que queramos hacer un esquema conceptual deberemos tomar en cuenta lo mencionado anteriormente. Si nos topamos con el caso de encontramos más de un esquema conceptual, debemos verificar que: 1. Estamos considerando todas las entidades (futuras clases) posibles que conforman la aplicación. 2. No estamos redundando una entidad en dos o más clases. 3. Las relaciones entre las entidades (clases) son las correctas. Importante es que nos apoyemos en el análisis, tanto en los escenarios como en los UID, para determinar y delimitar las entidades, convertirlas a clases y asentar los atributos que poseen. Así, comenzaremos entonces a desarrollar nuestro esquema conceptual a partir de las ideas mencionadas anteriormente. Por comodidad, comenzaremos con las personas que interactúan con la aplicación. La clase usuario es tal y como vimos en el diagrama 13, también vimos un objeto proveniente de tal clase. Ahora nos queda pendiente el asunto del administrador. Claramente vemos que el administrador es un usuario y que por ende debe heredar las características comunes de los demás usuarios (los atributos de la clase usuario). En particular encontramos que la clase administrador puede ser descrita como: Clase 2. Representación del administrador La relación de herencia de los atributos de la clase Usuario hacia la clase Admin la representamos entonces de la siguiente forma: 62
  • Diagrama 14. Diagrama de clases para los usuarios de SymWeb Como vemos, la clase Usuario heredará los atributos: registrado, permiso, login, etc. a la clase Admin quien a su vez posee un atributo único de tipo booleano que lo caracteriza como Administrador de la aplicación y de los usuarios. También es importante que notemos que la clase Admin prácticamente tendrá una sola instancia que es el administrador en sí, y que tendrá la operación Admin_usr() con la que controlará a los usuarios registrados tal y como se especificó en los escenarios del análisis. Tal situación la representamos con la relación administra (la segunda línea). La relación va obviamente de la clase Admin a la clase Usuario en donde se encuentra una pequeña bolita negra que representa la relación ninguno o muchos. Dentro del contexto, nos queda claro que la relación debemos de leerla como “Administrador administra muchos Usuarios” (aunque presente redundancia). Antes de hablar de modelos, recordemos su proveniencia. Todo modelo proviene de un archivo de texto traducido. También tenemos los archivos relacionados con los modelos y que pueden ser opcionales. Trivialmente notamos que la superclase en este caso es lo que representa al Archivo que heredará atributos a las clases específicas Texto que corresponde al archivo proveniente de Stella y a la clase Relacionado para los archivos asociados a los modelos. Diagrama 15. Diagrama de clases para los archivos a usarse en SymWeb 63
  • En el diagrama de clases correspondiente a los modelos vemos que lo que en esencia nos representa el modelo es el conjunto de ecuaciones que lo componen. La clase modelo posee sus propios atributos, estos sabemos que caracterizan al modelo pero no nos indican como está compuesto. La adición (representada por el rombo) es la relación entonces entre Modelo y Ecuación; es decir, “un modelo está compuesto de muchas ecuaciones”. En adición a lo anterior, vemos que la clase Modelo tiene una operación denominada Simula(). Aunque esta representa toda la simulación del modelo, es importante que tomemos en cuenta la operación Resuelve_ecuación(); es decir, la operación de simulación se auxilia en aquella que le da el valor de cada ecuación resolviéndola de antemano. Esa ecuación que la aplicación resuelve es tan solo el contenido de cada ecuación, de ahí que les modelemos una clase propia. Las clases parámetro y función las definimos para poder identificar dos tipos diferentes de ecuación. Además, debido a que el administrador puede dar de baja a un usuario bajo su criterio, entonces existe la relación de administración hacia los modelos por parte de la entidad primeramente mencionada. Diagrama 16. Diagrama de clases para la representación de los modelos matemáticos 64
  • Diagrama 17. Diagrama de clases para la representación de la administración de modelos Por último tenemos el diagrama de clases para la gráfica. Respondiéndonos las preguntas planteadas anteriormente notamos que la gráfica en realidad es la composición de un plano, sus ejes, una curva que represente la ecuación en función del tiempo y los puntos que lo componen. Por tanto, obtenemos el diagrama de clase tal y como se presenta a continuación. Importante es que observemos que cada clase posee una operación de dibujo, indicándonos que no existe una relación directa entre la forma que se generan los elementos de un objeto Gráfica. Diagrama 18. Diagrama de clases correspondiente a la superclase Gráfica 65
  • 66
  • Una vez que hemos establecido todo los diagramas de clases, es momento de establecer la concepción total de la aplicación y obtener el producto final del diseño conceptual: el Esquema Conceptual. En nuestro caso hemos omitido los atributos y operaciones de cada clase por cuestiones de espacio: Esquema 1. Esquema Conceptual de SymWeb 67
  • Así, podemos interpretar nuestra aplicación en los siguientes enunciados con base a lo que observamos del esquema conceptual: • SymWeb es una aplicación para la simulación de modelos matemáticos y generación de gráficas de funciones • Los usuarios registrados simulan los modelos y existe un usuario especial llamado administrador que administra (valiéndose la redundancia) a los usuarios y los modelos publicados • Un usuario (con permiso autorizado) publica archivos en SymWeb. Éstos pueden ser de tipo texto (correspondientes a los modelos generados por Stella) y los relacionados (i.e.. explicativos del modelo) • De la publicación de un archivo de texto se genera un modelo • Un archivo relacionado está asociado a un modelo • Un modelo está compuesto de muchas ecuaciones que pueden ser de tipo parámetro o función • Los parámetros a su vez pueden estar compuestos de ecuaciones • Una función es graficable en SymWeb • La gráfica está compuesta de un plano, de dos ejes y de una o más curvas • Las curvas están compuestas de muchos puntos • Los usuarios registrados pueden revisar la gráfica de la simulación de sus modelos 68
  • 4.5 Diseño Navegacional Una vez que tenemos el diseño conceptual (cuyo producto en sí es el esquema conceptual) procedemos a hacer el diseño navegacional. La navegación es una piedra fundamental en la estructura del OOHDM. Recordemos que el OOHDM es propuesto para aplicaciones de hipermedia; claramente la navegación de la aplicación es crucial en el éxito de ésta. El siguiente paso en nuestra metodología es ahora modelar la navegación de la aplicación (i.e. SymWeb). La acción de diseñar la navegación dará como resultado en forma completa lo que denominaremos como el Modelo Navegacional. Según Schwabe et al. (1998), podemos definir un modelo navegacional como “una vista sobre un modelo conceptual, por lo que permitimos la construcción de diferentes modelos de acuerdo a los perfiles de usuarios”. Podemos tomar el modelo conceptual simplemente como el esquema conceptual. Figura 18. Relación entre el modelo conceptual y el modelo navegacional La figura anterior representa la relación entre el modelo conceptual y el navegacional. En nuestro modelo conceptual, en particular el esquema conceptual, tenemos definidas las clases, sus atributos y relaciones. Luego tomamos este modelo y sacamos “vistas” dependiendo de quién vaya a navegar la aplicación. Un ejemplo claro es cuando somos administradores de la aplicación esperamos que encontrar “funciones adicionales” además de las presentadas para cualquier usuario. También podemos hablar acá de personalización, debido a que las clases son abstracciones, si tenemos una aplicación que maneja usuarios registrados pueden darse situaciones de personalización de la información presentada o incluso de enlaces. 69
  • Mientras estamos diseñando la estructura navegacional de una aplicación web, Schwabe et al. (1998 )nos recomiendan también que tomemos en cuenta los siguientes aspectos: • Cuáles objetos serán navegados, cuales son los atributos que poseen y cual es la relación entre estos atributos y los que ya están definidos en el esquema conceptual. • Qué tipo de estructuras de composición existe entre los objetos navegacionales y cómo están relacionadas. • Cuál es la estructura de navegación básica. En cuáles contextos el usuario puede navegar. • Decidir cuándo los objetos lucirán diferente de acuerdo al contexto en el cual serán visitados y especificar claramente las diferencias. • Cuáles son las conexiones y las estructuras de acceso existentes entre los objetos que serán navegados. Según estos puntos, primeramente tenemos que decir cuales son los objetos que serán navegados con todo y sus atributos. La relación entre estos objetos y los del esquema conceptual significa que podemos realizar las “vistas” para dar origen a los objetos que estarán en la navegación La estructuras de composición es la manera en la que llamamos a los diferentes elementos que estarán en el modelo navegacional. Los contextos son “variaciones” de los objetos de navegación dependiendo de quién o como accedemos a ellos. Cuando nos referimos a las conexiones y estructuras de acceso entre los objetos que serán navegados, estamos hablando de debemos definir los enlaces, caminos de navegación, los índices, visitas guiadas, etc. (Isakowitz et al., 1995). El diseño de navegación es expresado en dos esquemas: 1. El esquema de clases navegacionales 2. El esquema de contexto navegacional 4.5.1 Esquema de Clases Navegacionales Para realizar el esquema de clases navegacionales, comenzamos por la definición de los nodos. Los nodos son proyecciones de una clase en particular. Dentro de una aplicación de hipermedia, los nodos representan los elementos que tienen la información. La manera básica en la que una aplicación web puede presentarse es través de páginas (desplegado de pantalla en browser). Los nodos poseen atributos, enlaces y pueden clasificarse en simples o atómicos y compuestos (Schwabe et al., 1998). Usualmente un nodo será implementado como una página, pero no necesariamente una página corresponde a un nodo. En tal caso, la página está conformada por las instancias de cada uno de los nodos definidos para ella. Para definir un nodo comenzamos escribiendo: 1. 1) su nombre, 2. 2) después indicamos de cual clase proviene, 3. 3) utilizamos entonces un nombre de variable para la representar la proyección de la clase, 70
  • 4. 4) si el nodo proviene de varias clases (i.e. nodo compuesto), indicaremos todas las clases y asignaremos también un número de variable para cada una. Ahora bien, un nodo puede tener información heredada de otra clase bajo ciertas condiciones. Si el nodo que definiremos se encuentra en tal caso, añadimos a la definición del nodo aquella clase o aquellas clases de donde estará heredando datos (e.g. atributos). Una vez definido el nodo, hacemos el listado de todos los atributos que posee. Además de los atributos que posee la clase per se, añadimos los atributos (caracterizando cada uno por el tipo a los que pertenece) que se heredan de otras clases. Al final del listado de atributos, se definen los enlaces de nodo. Un enlace de nodo es simplemente un formalismo para indicar que dos nodos conectados es equivalente a decir que dos clases están relacionadas. La denominación de un enlace es comúnmente el nombre de la relación (e.g. usuario publica archivo). La manera en la que relacionamos los nodos, es el esquema de clases navegacionales. 4.5.2 Definición de nodos Por simplicidad en la escritura y estandarización, escribiremos las palabras reservadas en inglés. Comenzamos entonces con los nodos creados a partir de la clase de usuario. ¿Cómo accede el usuario a la información? ¿Es la información a la que accede el usuario un nodo per se o simplemente es parte se hereda para otras clases? ¿Existen herencias entre las clases definidas para la representación de personas? Para saber entonces cómo definir los nodos, partimos de las diversas situaciones que pueden presentarse. • Que el usuario no esté registrado • Que el usuario esté registrado pero no publique • Que el usuario esté registrado y publique • Que el usuario sea administrador Así, tomamos en cuenta las especificaciones representadas por los diagramas de interacción de usuario. Al revisarlos, vemos que para un usuario no registrado la interacción no está definida en diagrama. Esto es porque no existirá más que el desplegado de la información de los nodos generados por las clases Modelo y Gráfica. O sea, este tipo de usuario solo tendrá acceso a información descriptiva del SymWeb. En los tres casos siguientes, cuyas interacciones están consideradas para todos los UID’s, el acceso de la información se hace con base en la validación del usuario como miembro registrado de la aplicación. Tal validación está modelada como método en la clase Usuario y se llama Inicia_sesion(). 71
  • Es importante que notemos de los UID’s que podemos partir del modelado para las clases Modelo y Gráfica. Sin embargo, el motivo por el que comenzamos con el modelado de la clase Usuario en nodos es porque la ejecución de la aplicación con respecto al tiempo lo marca así ¿Qué es lo primero que sucede en SymWeb? Ciertamente, esto sigue el orden marcado por la conceptualización de los usuarios de esta y cualquier aplicación de hipermedia. La definición de los nodos posee coherencia con los casos de uso. Las diferentes vistas de una clase pueden generar nodos de contenido particular, pero en aspectos relacionados con la personalización de la aplicación tenemos que existe un conjunto de atributos comunes entre los diferentes nodos involucrados. En estos casos, denominaremos el nodo con la forma Clase.NombrePersonalización. Ahora bien, el nodo de inicio de sesión por los usuarios de SymWeb tan solo tiene el método para realizarlo. En este caso, denominaremos con el nombre de login a la clase (no confundir con el atributo de la clase Usuario). NODE login FROM Usuario: usr Inicia_sesión() Nodo 1. Nodo para el inicio de Usuario Ya accedimos a la clase Usuario. ¿En qué otro caso es necesario acceder a la clase Usuario para proyectarse como un nodo per se? La respuesta es: en tres casos. Un usuario registrado, un usuario que publica y un administrador son todos usuarios registrados. Un usuario puede publicar o no puede. Pero un usuario que publica puede ser administrador. Obtuvimos lo anterior de la información proveniente de los estudios de caso. En general, toda la definición de los nodos será afín al análisis de requerimientos: el esquema de clases navegacionales es una proyección del esquema conceptual y éste a su vez es causado por el modelado de las entidades abstraídas del análisis de requerimientos. Retomando, el acceso a la información en cualquiera de los tres usuarios es en los eventos de registro, cambio en los datos de usuario y administración de usuarios. Para esta situación, tenemos dos opciones. Escribir los tres nodos provenientes de la clase Usuario o extender la especificación del nodo (Schwabe et al., 2001b). Lo último equivale a tomar la base del nodo (i.e. los atributos que se repiten) y añadirles las diferentes variantes (i.e. atributos y métodos particulares) de cada proyección de la clase en particular. Por practicidad, definiremos el nodo bajo el esquema de extensiones: NODE usuario FROM Usuario: usr Registrado: booleano 72
  • Permiso: booleano Login: cadena Password: cadena Email: cadena Dirección: cadena URL: Cadena NODE Usuario.Registro EXTENDS Usuario NODE Usuario.Actualizar EXTENDS Usuario Actualiza_datos() Actualiza_datos() Darse_de_baja() Nodo 2. Nodo correspondiente al Usuario Registrado. Como el administrador es una subclase de Usuario, la modelamos aparte: NODE admin FROM Admin:admin INHERITS FROM Usuario EsAdmin: booleano ToUsuario: Anchor(administra) ToModelo: Anchor(administra) Admin_usr() Admin_mod() Actualiza_datos() Darse_de_baja() Nodo 3. Nodo de Administrador El nodo usuario se extiende en Registro para tomar el método de actualización de datos para darnos de alta como nuevos usuarios de SymWeb. En el caso de Actualizar, la extensión incluye además el método de darse de baja. El nodo admin en cambio proviene Admin pero hereda todos los atributos de Usuario. El atributo EsAdmin esta considerado para pasarse como parámetro a los métodos de administración. Después encontramos ToUsuario que es un ancla (i.e. un enlace a nodo). El ancla está en función de la relación entre nodos; esta es la manera en la que proyectamos una relación entre clases al esquema de clases navegacionales. En el caso de ToUsuario, está determinada por administra y nos indica que del nodo admin podemos ir a “ver” a los usuarios en un contexto de administración. Por otra parte, sabemos que el ancla nos manda hacia el nodo básico de usuarios (al menos), ya que la relación administra así lo indica. Similarmente ocurre con los modelos. De lo anterior, puede establecerse un criterio base para la creación de nodos: • Conocer cuales son los atributos que brindarán la información a la cual se accederá • Clasificar el tronco común de atributos y las variaciones entre nodos provenientes de una misma clase. • Saber bajo que condiciones, atributos provenientes de otras clases serán añadidos. • Determinar si la relación del esquema conceptual puede modelarse a través de anclas. 73
  • Así, tenemos a continuación el resto de los nodos que aparecen en SymWeb: NODE archTexto FROM Texto:texto INHERITS FROM Archivo Contenido: texto archNombre: booleano SELECT nombre FROM Archivo:arch WHERE texto es un arch archTamano: cadena SELECT tamano FROM arch WHERE texto es un arch Publicar_mod() Nodo 4. Nodo correspondiente al archivo de modelos De aquí tenemos que el acceso a un archivo de texto tiene además de su contenido, el nombre y tamaño. Es importante que se consideren dentro del nodo los dos últimos atributos mencionados ya que pueden dar origen a un contexto del nodo (hacer agrupaciones del nodo). Notemos que tanto el nombre, como el tamaño, son herencias directas de la superclase archivo. NODE relacionado FROM relacionado:rel INHERITS FROM Archivo Titulo: cadena Descripcion: cadena Palabras_cve: cadena Contenido: texto archNombre: booleano SELECT nombre FROM Archivo:arch WHERE rel es un arch archTamano: cadena SELECT tamano FROM arch WHERE rel es un arch Publicar_rel() Nodo 5. Nodo correspondiente al archivo relacionado de un modelo Un caso similar tenemos con el nodo para los archivos relacionados. NODE modelo FROM Modelo:mod Titulo: cadena Descripcion: cadena Autor: cadena Referencias: cadena Urls: cadena Palabras_cve: cadena Fecha_publicacion: cadena NODE modelo.usr EXTENDS modelo Numero_ecuaciones: entero Fcns_graficables: entero T_inicial: entero T_final: entero Dt: real 74
  • UsrNombre: cadena SELECT nombre FROM Usuario: usr WHERE usr simula modelo AND usr.registrado = true UsrApellido: cadena SELECT apellido FROM Usuario: usr WHERE usr simula modelo AND usr.registrado = true ToArchivoRelacionado: Anchor(esta relacionado) Simula(): puntos[x,y]: real Nodo 6. Nodo correspondiente a información de un Modelo y su extensión para usuarios registrados Con respecto al nodo de modelo tenemos dos casos: 1. Cuando el usuario no está registrado 2. Cuando si lo está La definición del nodo para el primer caso presenta los atributos base a los que podemos acceder. La extensión de este nodo contiene información relacionada con el proceso de simulación del modelo que es útil para el usuario y dos atributos heredados de la clase Usuario donde claramente vemos la condición de registro igual a verdadera. Por último, en la sección de atributos, está la liga al archivo relacionado definida por el ancla en función de esta relacionado. El método de simulación Simula() está definido para esta extensión. NODE param FROM Parametro:param INHERITS FROM Ecuacion contenido: cadena Resuelve_ecuación() Nodo 7. Nodo para acceder a los parámetros de un modelo El nodo denominado param está definido para presentar los diferentes parámetros a ajustar dentro de la simulación a través del método resuelve_ecuación(). NODE grafica FROM grafica:graf Título: cadena Alto: cadena Ancho: cadena Dibuja_grafica() Nodo 8. Nodo correspondiente a la Gráfica El nodo grafica presenta las características básicas de título, alto y ancho. No importa que un usuario no registrado acceda al nodo ya que su componente curva determina la gráfica de la función en sí. Obviamente, para un usuario que no está registrado, el nodo curva no estará disponible. NODE curva FROM Curva: curva, Usuario:usr, Funcion:fcn, Modelo:mod 75
  • color: cadena ecuacion: cadena SELECT contenido FROM fcn WHERE usr simula mod AND fcn es parte de mod AND fcn genera curva Dibuja_curva() Nodo 9. Nodo de la Curva de una Ecuación Así, vemos que la curva toma la ecuación bajo la condición de que un usuario simule un modelo, donde la ecuación es una función en términos del tiempo que es parte de un modelo y que claramente, genera una curva al ejecutarse la simulación. De esta forma, una vez que hemos definido los nodos, procedemos a establecer los diagramas de clases navegacionales. En nuestro caso, es claro que los diagramas son cuatro debido a las situaciones particulares que consideramos previamente. Además, hemos modelado los nodos de tal forma que se ajusten a estas situaciones mediante extensiones. Esto define la personalización de una aplicación de hipermedia. Por cuestiones de espacio, no colocamos este y el resto de los nodos con todo y sus atributos, tal y como los definimos. Sin embargo, claramente asumimos que la definición de cada nodo varía según el esquema considerado. Por ejemplo, en el caso del usuario no registrado, tenemos el nodo modelo per se; pero en el caso del esquema correspondiente al usuario registrado, accedemos a modelo.usr. La lectura de los esquemas navegacionales se hace en términos de la información accedida a través del nodo. En el primer caso, para usuarios no registrados, podemos decir que “un usuario no registrado accede al título, descripción, etc. de un modelo únicamente y de ahí encontrar una gráfica vacía en la sección del graficador”. 76
  • Esquema 2. Esquema de clases navegacionales para los usuarios no registrados Un usuario que no está registrado solo accede a la información básica de los modelos (i.e. su descripción). Lo mismo sucede en la gráfica. 77
  • Esquema 3. Esquema de clases navegacionales para un Usuario Registrado en SymWeb Como vemos, un usuario registrado accede a más información y hace uso de los métodos de simulación y graficación definido en las clases y proyectados en los nodos. Lo que ha sido delineado de color gris es una convención tomada únicamente para este documento y representan los nodos “repetidos” entre un usuario registrado y un que publica (porque también es un usuario registrado). 78
  • Esquema 4. Esquema de clases navegacionales para un usuario que tiene permiso para publicar en SymWeb En el caso de un usuario que publica, parece que accede al mismo nodo (i.e. relacionado) de manera diferente. Es importante interpretemos este esquema de la siguiente forma: El usuario accede al archivo de texto y dispara su publicación en línea, posterior a esto accede al archivo relacionado al modelo recién generado por el archivo de texto anteriormente publicado. Por otra parte, un usuario registrado tiene que acceder al nodo de identificación y acceso a la aplicación (i.e. login), posteriormente puede acceder a seleccionar un modelo para disparar el evento de simulación o bien, acceder a la gráfica o al archivo relacionado de este modelo. 79
  • Por último, tenemos el caso del administrador quien accede a un nodo especial de administración de usuarios. Esquema 5. Esquema de Clases Navegacionales para el Administrador de SymWeb 80
  • 4.5.3 Esquema de contexto navegacional En la sección anterior hemos presentado el esquema de clases navegacionales cuya función es modelar la forma en la que se accede a las clases a través de la definición de nodos. Notamos también que al ser tales esquemas proyecciones del esquema conceptual, encontramos variantes entre las formas de acceso a la información. El esquema de contexto navegacional nos presenta en cambio las diferentes maneras en la que un nodo puede ser accedido según el esquema de clases navegacionales. Estas maneras son los contextos. Según Schwabe y Barbosa, los contextos son la primitiva principal de navegación en el OOHDM (Schwabe et al., 1998). Un contexto navegacional es un conjunto de nodos, enlaces y las denominadas clases contextuales. Puede ser definido en intención cuando presentan una propiedad particular presente en todos los nodos o enlaces; o bien, ser definidos en extensión, que es cuando se enumeran sus miembros (Schwabe et al., 1998). Según Schwabe et al. (1998), existen cinco maneras en la que los contextos pueden ser definidos: 1. Basados en clase simple 2. Grupo basado en clase 3. Basado en enlace 4. Grupo basado en enlace 5. Enumerado Un contexto basado en clase simple es aquel cuyos objetos pertenecen a la misma clase (e.g. Modelo), y que son seleccionados por una propiedad dada que debe satisfacerse en todos lo elementos (e.g. todos los modelos). Un contexto de tipo grupo basado en clase es un conjunto de contextos, donde cada uno son contextos basados en clases simples. Está especificado por un parámetro dado, y dejando que dicho parámetro asuma todos los valores posibles de forma finita (e.g todos los modelos por fecha de publicación). En cambio, un contexto basado en enlace es aquel en el que sus objetos son de la misma clase y que son seleccionados cuando pertenecen a una relación uno a muchos (e.g. todos los modelos que cumplan la relación Usuario = "Juan Pérez" simula Modelo). Claramente, un contexto de tipo grupo basado en enlace es aquel que es un conjunto de contextos donde cada uno es un contexto basado en enlaces. En este caso se especifica dando una relación uno a muchos y formando el contexto basado en enlace para cada valor posible de 81
  • la fuente de la relación (e.g. todos los modelos que cumplan la relación Usuario simula Modelo). Por último, el contexto enumerado tiene por elementos a aquellos que están explícitamente enumerados, y pueden pertenecer a diferentes clases (e.g. ir navegando por todos los modelos). Los contextos tienen como función el ayudar al usuario a realizar su tarea dentro la navegación de la aplicación. Ahora bien, existen casos en los que un diseño navegacional puede utilizarse para más de una aplicación. Por ejemplo, consideremos el caso de las tiendas en línea: estas nos llevan a un esquema conceptual único o similar porque es la abstracción de la aplicación per se y un solo esquema navegacional tanto en la navegación de clases como en contextos. Entonces, es posible que trabajemos con una “plantilla de navegación contextual” la cual puede mapearse según nuestra aplicación. Estas plantillas reciben el nombre de esquemas de contexto navegacional genéricos, los cuales están compuestos por representaciones genéricas de los contextos. Existen diferentes notaciones gráficas para los contextos genéricos (Schwabe et al., 1998, 1999 y 2000b), pero básicamente son cinco: 1. Contexto genérico 2. Creación de instancia / modificación 3. Estructura de acceso genérica o índice genérico 4. Estructura de acceso jerárquica genérica 5. Búsqueda (Query) genérica Cada una de las notaciones para los contextos pueden estar acompañados de una tarjeta de especificación donde se definen características como la relación definida por el enlace que los une (e.g. uno a muchos), tipos posibles de información que contienen (estáticos, dinámicos, jerárquicos), restricciones, etc. 82
  • Figura 19. Contextos genéricos: a) Contexto genérico de n elementos. b) Creación de instancia o modificación. c) Estructura de acceso genérica o índice genérico. d) Estructura de acceso jerárquica genérica. e) Query genérico. Así, siguiendo el método para ingeniería de hipermedia que hemos estado usando, el siguiente paso es definir el esquema de contexto navegacional. Aparentemente tenemos que realizar la misma cantidad de diagramas que en el esquema de clases de navegación. Sin embargo, los contextos nos orillan a realizar solo uno. ¿Por qué? Ciertamente modelamos la aplicación SymWeb de manera particular, no llegamos a un esquema conceptual aplicable a todas las aplicaciones de hipermedia que hagan simulación. Pues bien, no necesitamos entonces definir un esquema de contexto navegacional generalizado. Para poder hacer el esquema de contexto, tenemos que instanciar los contextos genéricos en contextos particulares dentro de los nodos. Por ejemplo: Figura 20. Instancia del contexto genérico de modelo dentro del nodo modelo a un contexto tipificado por autor En la figura anterior, tenemos el contexto genérico de modelo donde el indicador n nos marca que existe una relación a muchos (si estuviera conectado con el contexto genérico usuario, por ejemplo). De lado derecho se encuentra la instancia de este contexto, el recuadro gris es el nodo modelo definido previamente y adentro posee un grupo contextual clasificado por autor (i.e. grupo basado en clase). El recuadro negro indica que el grupo que estamos navegando 83
  • (i.e. modelo por autor) tiene un índice de navegación de sus componentes; es decir, accedimos en la navegación a los modelos mediante un enlace que indica el despliegue de éstos por autor. Así, a continuación está presentado el esquema de contexto de navegación de nuestra aplicación: SymWeb. Observemos ciertos detalles sobre dicho esquema. Primeramente, tenemos un índice general denominado “Opciones de SymWeb” que procede según el tipo de usuario navegue (i.e. registrado o no registrado). Los usuarios no registrados solo acceden a los nodos generales de modelo y de gráfica. Si un usuario es registrado, entonces accede al nodo de login donde dispara el método de inicio_de_sesión() para después acceder al menú general que está representado por un índice (i.e. una lista de enlaces a las opciones). Adjunto a este índice están el de menú publicación y menú administración, los cuales están etiquetados con un ovalo negro a su izquierda; este ovalo indica que son índices de acceso restringido y que en nuestro caso solo están disponibles para un usuario con permiso de publicar y para un usuario que tenga además permiso de administrador, respectivamente. Observamos también que todos los usuarios pueden acceder a un índice de búsqueda, la cual devuelve información tanto de modelos encontrados, así como de archivos almacenados en el servidor relacionados a éstos. 84
  • Esquema 6. Esquema de Contexto Navegacional para SymWeb En el esquema de contexto, vemos como se desenvuelve la aplicación en sí. Primeramente, los nodos presentados que salen del índice Opciones SymWeb (i.e. modelo y gráfica), no son los mismos que aquellos a los que accedemos una vez pasado por el nodo de login y seleccionando un enlace del índice Menú General. De ahí que hayamos modelado los nodos a partir de extensiones de una configuración básica de los atributos. En segundo lugar tenemos que existen a su vez diferentes contextos dentro de la navegación de cada uno de los nodos modelo, relacionado y usuario. 85
  • El usuario a través del índice Menú General puede acceder a la modificación de sus datos o darse de baja mediante el nodo usuario. En este caso, ningún contexto es considerado, ya que el usuario ve tan solo sus datos. En el caso de la simulación de modelos, estos pueden ser accedidos por autor, por fecha o por publicista. Las líneas que seccionan al nodo, indican que no es posible cambiar directamente entre contextos. Por ejemplo, el contexto por fecha puede restringirse a desplegar el último modelo publicado, mientras que por autor muestra todos los posibles modelos. La convención anterior puede ser tomada en la fase de desarrollo, pero es modelada desde aquí. Además de estar seccionado el nodo modelo, vemos que los contextos que posee son grupos basados en la clase modelo (obviamente), donde cada grupo se encuentra listado como índice. Por último, observamos un contexto de clase simple correspondiente a la clase Usuario. Este representa la información del usuario que es presentada en el nodo modelo, y que se presenta solo cuando el usuario está registrado. Esta información servirá para determinar quién hace uso actual de la aplicación, en particular quién es el usuario que está simulando el modelo. De aquí nos vamos a ver la gráfica de la simulación que es un nodo per se, donde podemos graficar las ecuaciones disponibles para este modelo en particular. De ahí el contexto simple basado en la clase modelo, el cual proporciona la información resultante (los puntos en el plano) de la simulación. El contexto simple basado en la clase Usuario tiene la misma función que en el nodo modelo. Observemos que no es posible cambiar la gráfica entre los contextos de modelo o usuario, lo cual es ilógico si estamos hablando de la gráfica. De ahí que quede un espacio vació del nodo grafica que es el nodo per se; de hecho, si ningún modelo fuera simulado, observamos que no afecta el acceso al nodo grafica por parte del usuario debido a la característica antes mencionada. El usuario que es administrador, debe acceder al nodo admin y de ahí es posible acceder a la información de os usuarios en diferentes contextos (por nombre, login, email, permiso o búsqueda). De nuevo, tenemos la misma función para el contexto simple basado en la clase Usuario. En el caso de la publicación, accedemos al nodo de texto y relacionado para seleccionar los archivos a publicar y disparar el método que la realiza. El contexto de basado en la clase Usuario determina a la persona que está realizando el proceso de publicación. En caso de existir un error en algún punto de la publicación, retornamos al índice Menú publicación. Si el proceso de elaboración de modelo y adjunción de archivo descriptivo resulta exitoso, entonces se crean instancias del nodo modelo y relacionado, lo cual representa la creación de un nuevo modelo y el almacenamiento de su archivo relacionado dentro de SymWeb. 4.5.4 Diseño de Interfaz Abstracta Ahora que ya tenemos la estructura navegacional lista, procedemos a especificar los aspectos de interfaz a través del Diseño de Interfaz Abstracta (AID, por sus siglas en inglés). Un AID 86
  • se enfoca en saber cuales de los diferentes objetos navegacionales aparecerán, cuales activarán la navegación y cuales transformaciones de la interfaz se presentarán (Schwabe et al., 2000a). La conformación de un AID está dado por elementos llamados Vistas Abstractas de Datos (ADV, por sus siglas en inglés). Estas ADV’s son propiamente las vistas de interfaz representando los diferentes elementos con los que interactuará el usuario. Las ADV’s contienen los elementos claves de interacción de la interfaz; es decir, los elementos claves que visualizará el usuario al acceder el nodo. Tales elementos pueden ser cadenas de texto particulares, imágenes o información generada por contexto. En el ADV se define primeramente los eventos relacionados con el acceso. Como consideramos el teclado como una entrada estándar, tomamos por obviedad cualquier evento proveniente del teclado. En este caso, consideramos también el mouse como entrada. Consideramos entonces los eventos básicos de clic y OnMouseOver (pasar encima el apuntador del mouse sobre un elemento de la pantalla) en nuestras ADV’s. Cuando hacemos clic sobre algún elemento, se dispara entonces un evento que realiza la proyección (i.e. vista) particular del nodo . Los elementos son la ADV per se, son proyecciones de los nodos definidos en el diagrama de contexto navegacional. Éstos son generados por métodos o funciones aplicados al nodo, los cuales tienen por consecuencia la generación de la información constituyente del elemento dentro de la ADV. Como pueden ser diferentes métodos o funciones aplicadas, es posible que encontremos casos de información generada en tiempo de ejecución o personalizada. La activación de tales funciones o métodos es provocada comúnmente con la selección de los enlaces (i.e. hacer clic en ellos). Esta activación busca el nodo relacionado con el elemento seleccionado (o enlace en él), aplica la función o el método, y despliega el resultado en la ADV. Los demás elementos en la ADV que no están relacionados directamente con el nodo (i.e. elementos no proyectados del nodo), nos auxilian en la navegación o poseen simplemente características decorativas. Estos se define como los decoradores de nodo. A continuación tenemos los ADV’s principales de SymWeb: 87
  • ADV 1. Sección principal para usuario no registrado ADV 2. Sección de Modelos para usuario no registrado 88
  • ADV 3. Sección descriptiva del graficador para usuarios no registrados La ADV primera nos muestra la interfaz de acceso a la aplicación de todo usuario. Observamos el elemento Login del lado izquierdo de la ADV. A éste están conectados los nodos Login y Usuario.Registrado. El acceso a estos nodos está determinado por el enlace seleccionado de los dos contenidos en éste elemento. Aunque son ligas a dichos nodos, el ancla o Anchor no está en función de alguna relación entre nodos, por el simple hecho de que el registro del usuario o acceso del usuario no están relacionados como nodo a otro en particular. El resto de la ADV son elementos decorativos que funcionan como enlaces a la página de la UADY y el CONACYT, e información descriptiva sobre la aplicación, su última fecha de actualización y puntos de contacto con los desarrolladores. Principal y Graficador son enlaces a las otras secciones, las cuales obviamente tienen ADV diseñadas. Con respecto a la ADV de los modelos, tenemos además información descriptiva de los modelos en existencia para simulación dentro de SymWeb. Aquí vemos que esta información es una proyección del nodo Modelo. La ADV correspondiente a la sección de graficación de los resultados de la simulación, son meramente descriptivos. En cambio, en el caso de los usuarios registrados, tenemos que la ADV presenta un perfil de usuario tomado de la proyección de los atributos del nodo Usuario. Esta ADV representa la interfaz presentada después del acceso a través del elemento Login el cual dispara el método de 89
  • inicio de sesión. De manera exclusiva dos nuevos elementos son presentados: Búsqueda y Cerrar Sesión. El primero nos dirige a una nueva ADV que representaría la interfaz donde el usuario realiza las búsquedas consideradas previamente en el esquema de contexto navegacional. El segundo, como su nombre lo indica, realiza el cierre de sesión y por ende el fin de uso de la aplicación por parte del usuario. ADV 4. Sección Principal para un usuario registrado La ADV de los modelos, en el caso de los usuarios registrados, presenta una variación no vista anteriormente. Contexto de Modelos es la representación de los diferentes contextos considerados en el esquema de contexto navegacional (e.g. modelos por autor). Esto significa que el usuario puede acceder a la información dependiendo del contexto que haya seleccionado. En esta ADV vemos la congruencia de la funcionalidad de la aplicación concebida desde los UID’s. 90
  • ADV 5. Simulación de Modelos por usuarios registrados Por último tenemos la ADV correspondiente a la graficación de los resultados de la simulación. Observemos que la información numérica que genera las curvas de las ecuaciones (i.e. sus puntos) son provenientes del nodo Modelo.Usr, pero que la generación de la gráfica es resultado de los métodos intrínsecos del nodo Grafica. 91
  • ADV 6. Graficación de resultados para un usuario registrado 4.6 Implementación La implementación de la aplicación obviamente la llevamos a cabo transfiriendo las vistas abstractas de diseño siguiendo la guía de las especificaciones de diseño navegacional de clases y de contexto. Además, la interfaz de usuario está diseñada ajustándose al máximo a las reglas de usabilidad propuestas por Jakob Nielsen (2000) las cuales indican que la satisfacción en la navegación dentro de una aplicación web por parte del usuario es uno de los cimientos más importantes del éxito de ésta. Y que tal proceso debe estar justificado bajo un proceso de ingeniería en el diseño de interfaz, más que por el mero arte de diseñar páginas, sitios o aplicaciones web. Según Nielsen (1993), la usabilidad se encuentra definida por cinco atributos: 1. Aprendizaje 2. Eficiencia 3. Memorización 4. Errores 5. Satisfacción El primer atributo nos indica que la aplicación web debe ser fácil de aprender. Este atributo es considerado como fundamental dentro de los atributos de la usabilidad. 92
  • Diagrama 19. Gráfica de aprendizaje de una aplicación web para un usuario novato y un usuario experto La gráfica anterior presenta la diferencia de aprendizaje por parte de los usuarios de una aplicación. Un usuario que es novato en primera instancia puede dificultarse en la navegación y por lo tanto su capacidad de uso puede ser pobre y la eficiencia de la aplicación puede no notarse; sin embargo, conforme el tiempo pasa el usuario novato adquiere experiencia y aunque su aprendizaje de uso es gradual, alcanza un nivel de desempeño estable con buenos índices en la capacidad de uso y eficiencia. En cambio un usuario experto, tal como los natural born webbers poseen un rápido desempeño reflejado en su conocimiento previo de cómo usar aplicaciones web, por lo que reflejan gran eficiencia de la aplicación. Conforme el tiempo pasa, lo anterior cae también en un estado de “estancamiento”, aunque presentan una mayor capacidad de uso que un usuario novato. Así, SymWeb implementa un diseño de interfaz enfocado en usuarios novatos basándose en el modelo de menú presentado mediante un símil de carpetas o folders. La justificación de esta interfaz radica en que actualmente está siendo empleada por la aplicación de correo web que es probablemente la más usada en la actualidad (i.e. Hotmail de Microsoft). El atributo de eficiencia entonces está directamente relacionado con un diseño de interfaz que facilite el aprendizaje y que reditúe en una alta productividad al momento de que el usuario navegue la aplicación. La memorización por su parte nos indica que la interfaz debe ser fácil de recordar, de tal forma que un usuario ocasional no tenga problemas de aprendizaje al regresar a la aplicación. Los errores deben ser mínimos, nos dice el penúltimo atributo, y si estos sucediesen deben presentarse al usuario de manera clara y que sean fáciles de identificar. 93
  • Figura 21. Ejemplo de manejo de errores y satisfacción. Los errores deben presentarse adecuadamente y la interfaz debe ser acorde al concepto perteneciente a la aplicación El atributo de satisfacción nos indica que la aplicación debe ser placentera al momento de usarse, de esta forma los usuarios estarán subjetivamente satisfechos; es decir, gustan de ella. En particular, SymWeb como está enfocada a gente de ciencias veterinarias principalmente, el diseño de su interfaz lo realizamos en tonalidades verdosas evocando el campo y se maneja tipografía de fácil legibilidad en pantalla, la familia de letras san serif (e.g. Verdana). También la interfaz es adaptable a la resolución del monitor del cliente, aunque no está diseñada para todo navegador debido al manejo de hojas de estilo en cascada, las cuales no son soportadas por algunos (e.g. Netscape Navigator). A esto añadimos, el esquema uniforme basado en carpetas y una adecuada coloración de texto, sobre todo en los enlaces para su fácil ubicación y distinción de sus atributos (e.g. enlace visitado). Por último, tenemos que el diseño de interfaz utiliza los principios de la psicología Gelstat (Dondis, 1973) para cumplir con el requisito de satisfacción subjetiva a través del manejo de la similitud, agrupación, cerradura y buena continuidad. 94
  • Ahora bien, en primera instancia el usuario debe acceder a la aplicación en la modalidad de usuario no registrado, por lo que la siguiente interfaz es presentada: Figura 22. Página principal de SymWeb Si el usuario no está registrado en el sistema, aún tiene la posibilidad de navegar las opciones principales con propósitos informativos meramente. Figura 23. Página de listado de modelos para usuarios no registrados 95
  • Si el usuario desea registrarse, entonces accede a un enlace donde se le informa por qué habría de hacerlo. De querer el usuario, entonces selecciona un enlace que lo redireccciona al módulo de registro. Figura 24. Módulo de registro de usuarios Cuando el usuario se ha registrado, automáticamente es ingresado a la aplicación y la página principal se personaliza. Figura 25. Página principal para un usuario registrado Como está especificado en el diseño de navegación de clases, la personalización es realizada dependiendo del tipo de usuario que accede a la aplicación. Recordemos que un usuario puede ser registrado o publicista, y que además existe un tercer tipo de usuario que es el administrador. La interfaz indica al usuario su permiso y despliega un menú en la página 96
  • principal que está directamente relacionado con su permiso. La categorización del tipo de usuario dentro de la interfaz se ha hecho bajo el esquema tipo-color; es decir, el perfil del usuario es presentado en un color particular dependiendo de su tipo. Figura 26. Página principal para un usuario registrado Figura 27. Página principal para un usuario publicista 97
  • Figura 28. Página principal para el administrador Obviamente las opciones de usuario para aquellos de tipo registrado y publicista están contenidas en las opciones de usuario del administrador. Cualquier usuario es capaz de cambiar los datos que constituyen su perfil, en este caso seleccionan la opción de cambiar perfil de usuario. Todo usuario puede dejar de pertenecer al grupo de usuarios registrados si gusta, por lo que siempre se presenta la opción darse de baja en SymWeb. La opción de administración de usuarios permite cambiar la categoría de los usuarios de registrado a publicista y viceversa. Por tanto, el registro de un usuario queda conformado como sigue: Login* Password Permiso Nombre Apellido Email Domicilio URL Tabla 2. Tabla de Usuario Donde la clave primaria es el Login, por lo cual éste ha de ser único y sensitivo a la escritura con letras mayúsculas. Así, cuando un usuario desea cambiar su perfil, accedemos a su registro en la base de datos y al enviar la forma tan solo sobrescribimos el contenido de los campos. 98
  • Figura 29. Módulo para el cambio en los datos de usuario Darse de baja por consiguiente, toma el registro del usuario en sesión y lo elimina de la base de datos. Figura 30. Módulo para darse de baja en SymWeb Cuando el administración accede a la administración de usuarios, todos son desplegados y sus permisos son cambiados en forma booleana. El administrador no puede dar de baja a los usuarios libremente, si gusta hacerlo, puede enviarles un mensaje de aviso accediendo a los correos electrónicos en esta sección y de ser necesario, entonces el usuario debe ser eliminado en forma manual de la base de datos. 99
  • Figura 31. Módulo de administración de usuarios Ahora bien, para la publicación de un modelo matemático es necesario cumplir con cuatro pasos: 1. Disponer del archivo de texto con el modelo matemático generado por Stella dentro de su entorno. Seguro esto, se procede a subir el archivo al servidor de la aplicación. 2. Completar la información que conforma el perfil del modelo matemático e indicar los valores inicial y final de tiempo, y el incremento que se da en cada paso de la simulación. 3. Subir el archivo relacionado en el servidor. 4. Llenar el perfil del archivo relacionado 100
  • Figura 32. Módulo de publicación de modelos matemáticos Es importante que tengamos en cuenta que la aplicación no nos permitirá proceder en la publicación hasta que no hayamos completado todos los pasos adecuadamente. Una vez que el modelo ha sido publicado, la aplicación nos redireccciona automáticamente a la página principal. 101
  • Figura 33. Activación de la aplicación para publicar En la figura anterior vemos todos los pasos de la publicación completados. Toda la información completada es para registro en los campos de la base de datos, de tal forma que cada modelo tiene asociado un archivo relacionado. Ambos deben ser únicos. De esta forma las tablas de modelo y archivo relacionado tienen las siguientes formas respectivamente: Idmod* Archivo Titulo Descripción Autor Referencia URL PalCve FechaPub NumEcs FcnsG t0 tn DT Tabla 3. Tabla de Modelo Idrel* NomArch TituloArch DescripArch PalCve Tamano Idmod Tabla 4. Tabla de Archivo Relacionado Donde la relación está establecida como sigue: 102
  • Figura 34. Relación entre tabla modelo y relacionado Cuando accedemos al módulo de modelos publicados, en primera instancia encontramos la leyenda de “Ningún modelo ha sido seleccionado”. Del lado izquierdo observamos un listado de los modelos publicados. Al momento de seleccionar un modelo, la aplicación se actualiza y muestra el perfil proporcionado en la publicación y de aquí podemos hacer uso ya del modelo. Figura 35. Página de Modelos al iniciar la sesión 103
  • Figura 36. Página de modelos después de seleccionar alguno Es posible que cambiemos algunos valores de los modelos. Dichos valores corresponden a las variables de estado y los parámetros del modelo. Cuando hemos modificado los valores (aunque no es necesario), enviamos la forma con éstos, en adición a las variables que indican que modelo se está simulando y si alguna variable de estado ha sido graficada. Luego, tenemos una página de servidor activo en la que sea realizan los cálculos de la simulación. Inmediatamente escribe un archivo con los resultados en lenguaje de etiquetas extendido, mejor conocido como XML. Este archivo es pasado como parámetro al componente fXgraph 4 (InfoSoft, 2002), un graficador realizado en flash y que es incrustado en el módulo de graficación. 104
  • Figura 37. Módulo de Graficación de variables de Estado La aplicación cuenta a su vez con un módulo de búsqueda que toma la palabra a buscar y la pasa a una sentencia SQL de tipo LIKE para las tablas modelo y relacionado. Los resultados son devueltos en un módulo especial de búsqueda, en los que se puede ejercer ésta de nuevo. Figura 38. Módulo de búsqueda de modelos o archivos relacionados. Con la búsqueda, podemos acceder rápidamente a los modelos si desconocemos su título o bien, visualizar en algunos casos el contenido de los archivos relacionados sin importar a cual modelo corresponden. Al terminar de usar la aplicación, utilizamos el botón de cerrar sesión con lo que se nulifican los objetos creados en la sesión, para luego ser redireccionados al URL definido por el usuario en su registro. 105
  • 4.6.1 Estructura de la aplicación El sitio está compuesto por una raíz denominada SymWeb y que será el elemento final en la cadena correspondiente al URL. (e.g. http://localhost/../symweb). En esta carpeta se encuentran colocadas las páginas a las que accede el usuario. En adición encontramos otras carpetas de propósito específicos (e.g. carpeta de imagenes). Cuando se va a realizar la gráfica de una variable de estado después de una simulación, su archivo correspondiente es tomado de la carpeta graficas y copiada en la raíz. Los modelos originales son guardados en una carpeta de modelos y sus archivos relacionados en relacionados. Cuando llevamos a cabo la publicación de un archivo, el archivo de texto con las ecuaciones es depositado en la carpeta uploads. La subida de los archivos al servidor es posible gracias al componente aspSmartUpload. Las tablas pertenecen a una base de datos denominada db_symweb1.mdb, la cual está localizada en la carpeta db_symweb. La apariencia de la aplicación está basada en hojas de estilo cascada, las cuales podemos encontrar en su carpeta denominada css. Para acceder a la información de las diferentes carpetas o escribir en ellas, utilizamos el método Server.MapPath. De esta forma la estructura lógica en el servidor de la aplicación es como sigue: Figura 39. Estructura lógica de la aplicación en el servidor 106
  • Todas las carpetas virtuales están atribuidas con permisos de acceso de lectura y escritura, así como habilitada la secuencia de comandos dentro de los permisos de aplicación. Figura 40. Estructura física de SymWeb dentro del directorio del servidor web 4.6.2 Estructura de Navegación 107
  • La topología de la aplicación es de tipo telaraña, pero que a su vez se encuentra seccionada en topología lineal y de red para cada una de las acciones a realizar dentro de la aplicación. Por ejemplo, cuando deseamos publicar un modelo matemático accedemos a partir del menú principal, por lo que navegamos hasta este punto en forma lineal; estar efectuando cada uno de los pasos de publicación es un redireccionamiento a la misma página por lo que la navegación puede considerarse lineal iterativa; posteriormente al completar todos los pasos de publicación, la información es enviada a la página de traducción, y esta navegación es lineal, para luego redireccionar a la página de modelos, navegación que también podemos considerar lineal. Comúnmente así procederemos al navegar la aplicación. En los casos en los que las secciones no presentan una navegación lineal, el esquema de red se lleva a cabo. 108
  • 109
  • Enfocándonos un poco más en la cuestión de la implementación del método, veamos los resultados del proceso de traducción. Con fines de ejemplificación tomamos entonces un archivo de texto generado por Stella con las ecuaciones de un modelo matemático inventado acerca del flujo de agua de una presa. El contenido de dicho archivo es el siguiente: lluvia = 100 salida = 1 entrada = lluvia*.05 INIT energia = 500 INIT presa = 0 energia(t) = energia(t - dt) + (salida - entrada) * dt presa(t) = presa(t - dt) + (entrada - salida) * dt entrada = lluvia*.05 La creación de los archivos para llevar a cabo la simulación se reailzan en tiempo de ejecución, incluyendo su nombramiento. El archivo anterior deriva entonces en dos archivos, uno de inicialización de variables y otro ASP para llevar a cabo las iteraciones son el proceso de simulación en sí y que además incluyen en tiempo de ejecución la generación de un archivo XML para el despliegue de resultados a través del componente de graficación antes mencionado. Pues bien, el contenido del archivo de texto de inicialización de variables es el siguiente: t0 = 0 tn = 10 dt = 1 @ energia = 500 presa = 0 * lluvia = 100 salida = 1 entrada = lluvia*.05 Y tenemos como resultado el otro archivo en ASP codificado en VBScript como sigue: <% dim t0, tn, dt, t dim strLabelEjeX(500) dim intCiclos, intFcnsGraficables 'Declaración de variables de archivos y su contenido Dim objFSO, objTextStream Dim strFileName ' Constantes de manejo de archivos const fsoForReading = 1 const fsoForWriting = 2 dim lluvia dim salida dim entrada dim energia(500) 110
  • dim presa(500) 'Calculo de los ciclos t0 = Request("recT0") tn = Request("recTn") dt = cDbl(Request("recDt")) intCiclos = Int((tn-t0)/dt) 'Inicialización de Variables de Estado energia(0) = Request("graficable0") presa(0) = Request("graficable2") strLabelEjeX(0) = t0 'Inicialización de Parametros lluvia = Request("variable0") salida = Request("variable2") entrada = lluvia*.05 'Ciclos de Euler for t = 1 to intCiclos energia(t) = energia(t-1) + (salida - entrada) * dt presa(t) = presa(t-1) + (entrada - salida) * dt entrada = lluvia*.05 strLabelEjeX(t) = strLabelEjeX(t-1) + dt Next intFcnGraficables = 2 ' Sección de archivos XML para gráficación Set objFSO = Server.CreateObject("Scripting.FileSystemObject") strFileName = "/symweb/graficas/prueba_energia_graf.xml" Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName), fsoForWriting, True) objTextStream.WriteLine("<graph type=""4"" bgColor=""999966"" xaxisname=""Tiempo"" yaxisname=""energia""" & " yaxisminvalue=""0"" yaxismaxvalue=""" & energia(intCiclos)*2 & """ captionbgcolor=""FFFFFF"" canvasbgcolor=""CCCC99"" canvasbrdrcolor=""CCCC99"" shownames=""0"" showvalues=""0"" showovercap=""1"">") for t= 0 to intCiclos objTextStream.WriteLine(" <set name=""" & strLabelEjeX(t) & """ value=""" & energia(t) & """ color=""FF0000"" />") Next objTextStream.WriteLine("</graph>") objTextStream.Close Set objFSO = Server.CreateObject("Scripting.FileSystemObject") strFileName = "/symweb/graficas/prueba_presa_graf.xml" Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName), fsoForWriting, True) objTextStream.WriteLine("<graph type=""4"" bgColor=""999966"" xaxisname=""Tiempo"" yaxisname=""presa""" & " yaxisminvalue=""0"" yaxismaxvalue=""" & presa(intCiclos)*2 & """ captionbgcolor=""FFFFFF"" canvasbgcolor=""CCCC99"" canvasbrdrcolor=""CCCC99"" shownames=""0"" showvalues=""0"" showovercap=""1"">") for t= 0 to intCiclos objTextStream.WriteLine(" <set name=""" & strLabelEjeX(t) & """ value=""" & presa(t) & """ color=""FF0000"" />") Next objTextStream.WriteLine("</graph>") objTextStream.Close Set objTextStream = Nothing strTemp = "../modelo.asp?strVariable=0&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & " " 111
  • Response.Redirect(strTemp) %> Podemos catalogar de esta forma la última parte del código del archivo ASP como middleware, ya que dada una entrada particlar (en este caso el archivo de texto), proporciona una salida en formato XML para uso específico de una aplicación distinta de la que proviene. Al ser ejecutado el contenido de ésta página ASP se obtienen los valores de la variable de estado en cuestión dados los parámetros de tiempo inicial, tiempo final e incremento, establecidos en la sección de modelos por el usuario dentro de la aplicación. Así, para este archivo de entrada observamos los resultados que se presentan a continuación junto con los resultados arrojados de la simulación del mismo modelo pero en Stella: symweb stella tiempo energia presa energia presa 0 500 0 500 0 0.5 498 2 497.5 2.5 1 496 4 495.5 4.5 1.5 494 6 493.5 6.5 2 492 8 491.5 8.5 2.5 490 10 489.5 10.5 3 488 12 487.5 12.5 3.5 486 14 485.5 14.5 4 484 16 483.5 16.5 4.5 482 18 481.5 18.5 5 480 20 479.5 20.5 5.5 478 22 477.5 22.5 6 476 24 475.5 24.5 6.5 474 26 473.5 26.5 7 472 28 471.5 28.5 7.5 470 30 469.5 30.5 8 468 32 467.5 32.5 8.5 466 34 465.5 34.5 9 464 36 463.5 36.5 9.5 462 38 461.5 38.5 10 460 40 459.5 40.5 Tabla 5. Tabla comparativa de resultados de simulación entre SymWeb y Stella Claramente notamos diferencia entre los valores arrojados por ambas simulaciones. Esto es consecuencia directa del tipo de variables que usan. En el caso de SymWeb, utiliza variables de 112
  • tipo variant lo cual implica un manejo limitado de precisión. En cambio Stella al ser un software especializado en simulación, toma mucha consideración en la precisión de sus variables por lo que arroja resultados más detallados. 113
  • 114
  • Pues bien, es importante que consideremos como primer punto lo que la simulación web es. Claramente, todo este advenimiento de hacer todo para el web es consecuencia directa del avance tecnológico de los últimos tiempos, pero sobre todo de su bajo costo de implementación. Es muy fácil afirmar entonces que la simulación web es parte de todo este movimiento. El punto tocado por Kuljis et al (2000), es la esencia de lo que la simulación web es: la emigración de la simulación por computadora a las tecnologías web con el propósito de mantenerse viva. ¿Por qué habría de llegar la simulación a este punto? Si es cierto la justificación tecnológica, y que estamos en la consolidación de la “era web”, pero las ventajas o nuevas oportunidades que ofrece este ambiente a cualquier campo de la ciencia o investigación es sin duda el sustento que mantendrá con vida a la simulación web. Las diversas características de la web que mencionan Kakakota y Whinston (Kuljis et al., 2000) son chispa para imaginar aplicaciones de simulación que sean independientes de localidades, plataformas de trabajo e incluso de usuarios. Tenemos entonces que la simulación web no es una moda, aunque es importante que consideremos que si bien no podemos catalogarla como efímera, sí posiblemente como de lento desarrollo. La lentitud se debe a la aplicación de la simulación en múltiples ramas de la ciencia, independientemente si es en el web o no. Pocas personas trabajan actualmente en simulación web y sus aplicaciones son muy especializadas. Lo que la simulación web es, con su vaga definición propuesta por Fishwick (1996), hace que nos imaginemos todo y nada de ella. ¿Qué representa la conexión entre la web y el campo de la simulación? Si no podemos definir bien tal conexión, ¿cómo habremos de saber lo que la simulación web es per se? En conclusión, no podemos determinar la simulación web como el proceso de simulación de modelos matemáticos determinísticos o numéricos en la web, sino a todo el proceso de simulación que pueda efectuarse con tecnologías y arquitecturas pensadas para la web y el desarrollo de hipermedia. Pero importante es que no olvidemos, que la web per se y sus implicaciones, pueden contribuir en un futuro cercano en una redefinición de la simulación web donde es muy probable que sea más generalizada a la de la simulación por computadora “clásica”. Lo que la simulación web significa es un estado evolutivo de la simulación, más allá de que la veamos meramente como un proceso de cambio en la última. No podemos decir que la simulación web es el cambio, porque no regresa a la simulación clásica. Los impactos señalados por Fishwick (1996), son consecuencia de la simulación web, no de la simulación que “emigró” a la web. La simulación web y sus efectos en la educación y entrenamiento, publicaciones y programas de simulación, pueden ser vistas desde un punto de vista original y natural. Original, porque las nuevas generaciones pueden partir de la simulación web como una rama computacional en sí e independiente de conocer previamente lo que es simulación por computadora para equipos no conectados en red. Natural, porque aunque parezca trivial y sin irnos muy lejos, la generación actual de usuarios potenciales de simulación está acostumbrada no solo al manejo de computadoras, sino a pensar en ellas como estaciones de trabajo con las que pueden acceder recursos compartidos a través de la red, en particular la Internet; por lo que este tipo de personas vería los procesos de simulación web como algo usual y natural. 115
  • Con respecto al punto de las publicaciones dentro de los impactos mencionados por Fishwick (1996), podemos decir que es un proceso que repite el enfoque original-natural. Si somos personas en reciente formación como investigadores o que comenzamos a hacer divulgación de la ciencia, los medios actuales de publicación de resultados son algo que tenemos que aprender y establecerlos como la manera de hacer las cosas. El correo electrónico, el manejo de archivos digitales y los medios de comunicación asíncrona (e.g. chat) permitirán que los resultados en los diferentes proyectos que puedan caracterizarse como simulación web se distribuyan de manera rápida, y de esta forma proliferen en la diversidad de nuevos proyectos e ideas, con lo que se evitaría la probable lentitud que mencionamos anteriormente. El último impacto mencionado por Fishwick (1996) se refiere a los programas de simulación. Los programas vistos desde un punto de vista reusable, de libre distribución y fácil acceso. ¿Trivial? Si estamos involucrados con el desarrollo de software en la actualidad, tales características de este punto de vista nos parecerán sin duda como algo trivial. Así, no podemos estar más de acuerdo con Fishwick (1996) sobre la forma en la que debemos concebir y desarrollar el software. La reusabilidad es un hecho en la programación actual, sobre todo con el auge de la programación orientada a objetos (mejor conocida como POO). Los objetos pueden ser reusables, las variables pueden ser reusables, en general podemos poseer código fuente reusable y no solo aquel modulado en funciones. La web, con su vasto contenido en software, es algo que damos por sentado y sabemos que en su mayoría es de distribución es gratuita, sobre todo si de divulgación de ciencia hablamos. La simulación web tiene entonces la posibilidad de expandirse rápidamente con la libre distribución, y obviamente la múltiple participación en el desarrollo de una aplicación (de simulación) es algo que la web ha inducido en la comunidad informática. La web es sin duda una de las formas más fáciles de acceder a información, sobre todo inédita. Usualmente cuando desconocemos de un tema, es muy probable que alguien haya enfrentado previamente tal situación y haya dispuesto la solución en la web. Obviamente todo software de simulación web, por la naturaleza de ésta, debería de ser de fácil acceso prácticamente por definición. La comodidad de disponer de la aplicación mediante un navegador web o browser es más que una realidad para muchos, es parte de su día. Así, realizar procesos distribuidos, en particular aquellos involucrados con simulación, con una interfaz web de acceso, es algo factible y viable. Tomando este ultimo comentario, pensamos entonces en el comentario de Fishwick (1996) que dice que las simulación web está basada más en la tecnología. Posiblemente. Sin embargo, los esfuerzos de los investigadores en simulación web van enfocados a estructurarla y cimentarla como una rama de las ciencias de la computación per se. El principio de “separación de preocupaciones”, como lo comentaban Page et al. (2000b), ha sido la piedra angular de la programación y aunque Page (1998) desde un principio haya cuestionado la aplicación de este principio en la simulación web, es más que claro que conforme una rama de las ciencias de la computación se va consolidando, la tecnología para su desarrollo será tan solo la herramienta y a esto corresponde la implementación, y la teoría o paradigmas conformarán la especificación. ¿Por qué en la simulación web no puede establecerse tal separación de forma marcada? Algunos comentarios vimos en la revisión de la literatura, pero sin duda el último, proporcionado por Page et al. (2000a) puede ser el más significativo. Nos comentan que la web representa cambios en el modelado por lo que los viejos principios deberán ser abolidos o nuevos principios habrán de ser introducidos. Entonces, es claro que al 116
  • final de este proceso habremos de ver la simulación web como algo tan concreto y bien definido que incluso es probable que el principio de separación de Dijkstra (1976) tenga que ser redefinido para la simulación web o para cualquier rama de las ciencias de la computación que esté involucrada con la web, o generalmente hablando, con la Internet. Hemos discutido que es la simulación web como rama de las ciencias de la computación y que significa para éstas, pero tenemos además el hecho de para quién va dirigida. Todo usuario de la simulación web debe cumplir un perfil básico en cierta medida. Características que mencionadas anteriormente como el acceso a información a través de un explorador de páginas web o mejor aún, el uso natural de una computadora como herramienta de trabajo, son dos de ellas. Paul (Page et al. 2000a) nos hace mención de los natural born webbers. ¿Quiénes son? Claramente, dentro de poco no podremos discernir entre el grupo de usuarios que eran antes de la era web y los que nacieron en ella. La web con su rapidísimo desarrollo en tan poco tiempo, hace que las futuras comunidades de usuarios tengan necesidad de hacer uso útil de ella. Pero el punto más interesante que menciona, es la naturaleza de las personas que pertenecen a esta era. Ciertamente, las personas que pertenecen a la era web, la era digital o cualquier otro nombre inventado para denominar a este período donde las computadoras y la Internet ha tomado gran auge, estarán formadas con un pensamiento nuevo sobre como realizar sus actividades y de ahí vendrán nuevas necesidades en el desarrollo de éstas y por ende, en el desarrollo de nuevos paradigmas. La simulación web no se anticipó a nada, tan solo se presentó como parte de algo que acompañará a las nuevas generaciones interesadas en el modelado y la simulación. Como los individuos de la era digital serán quienes produzcan software de simulación para sus iguales, la forma en la que esto se hará ya llevará consigo todos los paradigmas de especificación e implementación que hoy son discutidos, pero que el día de mañana serán un hecho. Más importante que el hecho de que la simulación cambiaría debido al impacto de las redes como dice Buss (en Page et al., 2000a), el fin propio de la simulación web y en general de toda producción de software, es el enfoque centrado en el usuario. Las palabras de Kuljis et al. (2000), que dicen que cuando una aplicación no fue dirigida a los usuarios rara vez progresa o tienen impacto social, son más que cierta. Pero aunque la simulación web puede cuestionarse actualmente bajo este criterio, debemos tomar en cuenta que en pocos años, con la consolidación de la simulación web, el desarrollo de aplicaciones para esta “nueva” área que aquí discutimos, ciertamente tendrá en cuenta sus estimaciones de progreso y el impacto social, mejor dicho su utilidad social, porque la ideología de desarrollo centrado en el usuario será el punto de partida, más allá de una simple fascinación por la tecnología actual y ver de que manera se puede “emigrar” a ella. Seis son los principios, que según Page y Opper (en Page et al., 2000b), en los que la simulación web está sustentada. Estos principios, intentan determinar para donde va el crecimiento de la simulación web. El primero principio, el de la proliferación de los objetos digitales, mencionado por primera vez por Fishwick (1996) puede parecernos sin duda el más interesante. La visión de este investigador sobre la concepción de los elementos de hipermedia son el punto a donde converge la realidad actual de la web. Nos comenta que de alguna forma la web al estar constituida por documentos de hipermedia, todo lo que se vaya añadiendo a este conglomerado deberá ser denominado como documento también, por lo que las aplicaciones de simulación web deberán ser vistas meramente como documentos de 117
  • hipermedia correspondientes a simulaciones o modelado. En realidad podemos tomar esto desde un punto de vista algo trivial y natural. Esto es porque la gente que actualmente hace uso de la web, ve los cambios progresivos de ésta con gran naturalidad sin pensar en el trasfondo que implicó realizar tales cambios. Así, para la gente nacida en la era web, acceder a documentos de simulación será algo muy natural. Para la conformación de este “nuevo” concepto de documento, Fishwick (1996) introduce el término de objeto digital. El objeto digital es simplemente la representación símil de los objetos del mundo real, por lo cual es fácil observar que para la gente interesada en el modelado de objetos del mundo real, el desarrollo del objeto digital es la meta a donde habrán de llegar. Sin embargo, en el principio de este trabajo tenemos que dentro de la simulación es posible encontrar diversos tipos de modelos matemáticos para trabajar (Heylighen, 2000 y Chi, 2000), en particular los modelos relacionados con la nutrición bovina mencionados por Ku (2000), no requieren del uso de objetos digitales en primera instancia, ya que no se trata de símiles (e.g. vacas virtuales). Justamente lo anterior, hace que nos cuestionemos acerca de las definiciones “globales” involucradas con la simulación web. En la literatura en inglés (e.g. Fishwick, 2000), el término modelado es utilizado para hablar del modelado del mundo real en su mayoría. Aquí sí entran en juego los símiles de los objetos del mundo real. Pero el término simulación es más extenso e incluso puede manejarse en algunos casos de manera ambigua. Nuestros modelos de crecimiento animal son dinámicos y mecanísticos (Ku, 2000), pero no requieren de estar modelando físicamente una vaca; esto es, ver una representación gráfica digital de un bovino y como va creciendo. Lo útil en este caso, es ver los resultados numéricos arrojados por la simulación de las ecuaciones diferencias mediante un método numérico. Entonces, ¿hacemos o no hacemos simulación web? Precisamente esa es consecuencia de la definición no bien establecida de la simulación web. Como hemos tomado un proceso de simulación y lo hemos “migrado” a la web, entonces simulación web hacemos. Aquí entra en juego la siguiente cuestión: ¿Cómo saber si la simulación web que hacemos va dirigida según los principios de la simulación web? Algo es cierto, y es prácticamente por definición de la web, al hacer simulación web, es necesario el uso de documentos de hipermedia. Así, de alguna u otra forma estaremos cumpliendo al menos la parte básica del primer principio de la simulación web. Es verdad que la simulación web posee independencia de plataforma como nos dicen Kuljis et al. (2000). Sin embargo el desarrollo implica otra cosa. El segundo principio de la simulación web habla de un manejo adecuado de estándares de desarrollo. Pero la realidad muestra que las necesidades (i.e. requerimientos de sistema) determinan la manera en la que la aplicación para simulación web será desarrollada. La web, como hemos mencionado anteriormente, está regida más por estándares de facto. Esto provoca que quién empieza a realizar investigación en un área emergente de la web (e.g. simulación web), determina la plataforma de trabajo o el software de desarrollo empleado. Muchos de los trabajos presentados en la literatura que se han realizado de simulación web hasta el momento utilizan Java y por ende, todo el paquete de utilerías que proporciona la compañía que la creó (Sun Microsystems). Tenemos por ejemplo el trabajo de Young et al. (1998), en donde proponen ya un esquema usando RMI. También, debido a que los principales lugares de trabajo de investigación en simulación web se encuentran en Estados Unidos de Norteamérica, es usual que los trabajos se adapten o contribuyan a los estándares propuestos por el mismo Departamento de Defensa de este país (DoD, 1998), quién también se encuentra muy interesado en ésta área emergente y en general 118
  • en los procesos de simulación. ¿Cómo podemos determinar entonces el camino que la simulación web debe seguir en su crecimiento con respecto al desarrollo de sus aplicaciones? La propuesta de Perakath (2000) de clasificar el desarrollo como basado en componentes y en agentes de software, es sin duda la manera en la que “caemos” dentro del segundo principio de la simulación web, independientemente de los estándares o plataformas seleccionadas en el desarrollo. De esta forma, si tomamos el desarrollo del software basado en componentes, no importa cual estándar tomemos, sabemos que debemos seguir los principios de reusabilidad del software. Si hacemos uso de agentes, entonces consideramos la autonomía de estos de tal forma que orientemos su desarrollo hacia un independencia de plataforma de cliente. El tercer principio de la simulación web, es consecuencia directa de lo anterior, ya que actualmente existe una búsqueda por el reciclaje de software, con el propósito de enfocarnos más en la especificación que conlleva a la implementación, y no verlo meramente como cosas disjuntas y secuenciales. De lo anterior, podemos pensar que llegar a un estándar en el desarrollo es algo muy complicado, sin embargo la realidad sobre quién comienza a abrir paso es quien dice como recorrer el camino, es una realidad también. Es muy probable que en un futuro, casi todos los trabajos de simulación web en su totalidad continúen igual: usando Java y sus utilerías y siguiendo estándares propuestos por el país vecino del norte. Al ser un campo emergente, tenemos derecho a la experimentación de otras plataformas de trabajo, otras herramientas de desarrollo; tal y como sucedió con este trabajo. Aunque debemos estar conscientes del tipo de usuario al que la aplicación va enfocada y tratar de cubrir sus necesidades, ya que solo de esta forma remanecerá como algo de impacto social. Al final, todo radica en la creación de algo que pueda servir para los interesados y que sea modificable por algunos capacitados. Sin duda la Internet es quién hace que el principio de arquitecturas de múltiple atadura y sistemas multilenguajes sea algo por hacer en vez de algo que podría hacerse. Ahora bien, ya tomando en cuenta la manera en la que la simulación web es implementada en la actualidad, independiente de los requerimientos, vemos que los conceptos de distribuido y paralelo son usados. La simulación distribuida, que es el nombre con el que Young et al. (1998) denominan a cualquier proceso de simulación que no sea llevado a cabo de manera local (i.e. en una sola máquina y sin estar en red), se ve afectada por el paralelismo. ¿Todos debemos seguir entonces el esquema distribuido-paralelo? No necesariamente. Tenemos que considerar que algunos casos, el modelado y simulación por efectuar pueden ser muy caros y complejos computacionalmente hablando. Los trabajos de Young et al. (1998), se refieren a este tipo de proyectos, pero presentan los esquemas de implementación desde un punto de vista “estándar” para trabajar con ellos. Hay que considerar también que Young et al. (1998) adaptan dichos esquemas en uno nuevo para uso del RMI. Recordemos también que la simulación web está en proceso de consolidación, y que nuevos esquemas de implementación, plataformas y herramientas de desarrollo intentan establecerse como el estándar de facto dentro de la simulación web. La forma en la que desarrollemos entonces aplicaciones para simulación web, no debe ser mala o buena, simplemente verificar que los requerimientos sean cubiertos. Hacemos mucho hincapié en lo anterior, pero sí es un hecho de que podemos 119
  • sumergirnos en un mar de confusión al momento de determinar la implementación por muchas razones: pensando en su crecimiento, disposición de futura infraestructura, etc. De hecho, esta aplicación (SymWeb) nace de la necesidad de disponer de modelos de nutrición animal en la Internet para el fácil acceso para personas interesadas, pero proviene de un prototipo realizado anteriormente y entonces, ahí entraron en juego la selección de plataforma de trabajo y la herramienta de desarrollo, que en este caso fue a través de páginas activas de servidor (i.e. ASP). El desarrollo fue en ASP porque hasta cierto punto, es más conocido el lenguaje de Visual Basic en la localidad que Java de Sun. En muchas ocasiones se cuestionó si el desarrollo va bien dirigido, ya que dicha herramienta no es la usada por la comunidad de simulación web. Sin embargo, los requerimientos eran bastante claros: desarrollar una aplicación web en un lenguaje de guiones basado en uno de programación muy popular (Visual Basic) con miras a futuras modificaciones o extensiones por terceros. En este caso, y aplicable a la primera versión, no fue necesario pensar en esquemas de 2-atadura o más, simplemente el enfoque está en transcribir los archivos del paquete de software de simulación a un formato que puede utilizarse en la web. Y aunque tengamos como resultado la ejecución de la simulación totalmente del lado del servidor como algo trivial, decisiones fueron tomadas pensando en el futuro de la aplicación ya sea como algo en lo que es posible trabajar más o bien, como referencia para futuros puntos de partida dentro de la simulación web de modelos matemáticos de nutrición animal. ¿En que habremos de centrarnos entonces? Amico et al. (1997), mucho antes de que se hablara de la simulación web, presentó los aspectos críticos del proceso de simulación, los cuales afectan también a la simulación web. Estos aspectos críticos, son la realidad en el desarrollo de un proyecto de simulación, independientemente si es web o no. Muchas de las indicaciones propuestas por Amico et al. (1997) habremos de considerarlas si estamos involucrados en un proyecto de simulación. La forma en los clasificados los aspectos críticos nos ponen a pensar que los proyectos de simulación tienen que ser grandes y conformados por muchas personas. Aunque esto no es del todo cierto, si es verdad que los proyectos de simulación deben ser multidisciplinarios y que requieren de una asignación de tareas bien definida para grupos particulares del total de los integrantes del proyecto. Estos grupos pueden ser disjuntos o no; es decir, que es posible que existan algunas personas relacionadas más de uno de los cuatro aspectos críticos generales de la simulación. Pero de nuevo recalcamos que un simulacionista no es una persona que lo sabe y hace todo. Pero la naturaleza rica de un proyecto de simulación web debido a la gente de diversas disciplinas provenientes de distintas formaciones, hace que cuidemos mucho los aspectos de comunicación e interpretación, de representación matemática de la realidad y de distinción cuando estamos en la validación de los datos. En particular, el proyecto al cual pertenece este trabajo es de carácter multidisciplinario, en los que se cruzaban lenguajes técnicos de biología, veterinaria, matemáticas y computación. En situaciones como esta, lo importante es el entendimiento de los diversos lenguajes técnicos usados por los participantes y posteriormente definir los requerimientos. Aunque parezca sencillo, muchas veces la concepción computacional de un proyecto de simulación web, particularmente éste, puede diferir mucho de las necesidades expresadas por la gente de especialidad ajena a la computación. 120
  • Como gente de desarrollo de la aplicación web, puede que seamos ajenos a las cuestiones de modelado matemático simplemente por desconocer como llevarlo a cabo dentro del área de interés. Bajo esta premisa, el desarrollo de la aplicación puede tornarse tedioso o peor aún, no estar bien definido. Así, es responsabilidad de nosotros como gente de desarrollo el abstraer lo más posible la manera en la que la aplicación para la simulación web tendrá que ser presentada al final. Aunque claramente, es mucho muy importante nuestra participación en las actividades del proyecto, aunque sea de manera pasiva, para empaparnos en el ambiente en el que gira el proyecto y así entender mejor las necesidades que nos tratan de transmitir los demás integrantes. Por otra parte, una ventaja que tenemos como gente de desarrollo dentro de un proyecto de simulación web, es la capacidad de intervenir para realizar modificaciones no consideradas por los demás integrantes, que en esta ocasión se deben ahora a su falta de experiencia en cuestiones de cómputo. Por ejemplo, en el desarrollo de esta aplicación, fueron considerados aspectos como la usabilidad y diseño de base de datos. De esta forma, es nuestra responsabilidad transmitir nuestras acciones de manera clara y demostrarlas de manera justificada. Ya aterrizando más a los aspectos computacionales, es muy probable que si tomamos una herramienta de desarrollo web estándar, tal como lo es ASP, enfrentemos situaciones de adaptabilidad al proyecto. Es decir, que el desarrollo sea un poco más complicado que usando una herramienta especializada existente para simulaciones en equipos locales (e.g. Stella). Ante esta situación debemos escoger entre desarrollar de manera personalizada, como en este trabajo o bien, después de un análisis posterior a la liberación de la primera versión de la aplicación, seleccionar un entorno de desarrollo web comercial y que sea específico de simulación web. Como comentario, tenemos que dichas entornos comerciales son en su mayoría basados obviamente en Java. Por último: ¿cómo enfrentar el desarrollo de una aplicación para simulación web? Lo más recomendable es sin duda seguir un proceso de ingeniería de hipermedia, sobre todo si no se trabaja con un entorno comercial, y aunque no pueda ser parte de la ingeniería, debemos presentar al menos un prototipo con lo cual facilitaremos la comunicación ante los demás integrantes del proyecto o usuarios finales. Muy recomendable es que el desarrollo del prototipo vaya después de comenzada la ingeniería de hipermedia y que considerar desde ese momento un buen desarrollo de interfaz, sobre todo si los usuarios finales pueden ser gente no familiarizada con la web del todo. De esta forma, la probabilidad de éxito de la aplicación aumenta y también se presentan nuevas especificaciones o se detectan limitantes en la aplicación por desarrollar, las cuales pueden ser consideradas para una redefinición de los requerimientos o para futuras versiones de la misma aplicación de simulación web. 121
  • 122
  • Como vimos en la sección de preliminares, el trabajo se centra en el desarrollo de una aplicación que sea capaz de ejecutar la simulación de modelos matemáticos, en particular de nutrición animal, a través de la ejecución de un método numérico. Las implicaciones de realizar una aplicación web nos llevan a crear un proceso de ingeniería de hipermedia. En nuestro caso, hemos seleccionado la metodología denominada OOHDM. La razón por la que tal metodología fue seleccionada, es debido a su enfoque orientado a objetos y principios de reuso muy importante en el desarrollo de aplicaciones en la actualidad. OOHDM al estar basado en OMT y el desarrollo unificado (UML), nos brinda lineamientos que encajan con el estándar actual en el análisis y diseño de sistemas de información. Así, mediante esta tecnología establecimos las especificaciones bases para el desarrollo actual de la aplicación así como de sus futuras modificaciones o extensiones. Sin embargo, durante el desarrollo encontramos que “aterrizar” las especificaciones durante la implementación pueden ser no congruentes o variar puesto que la metodología aun no es lo suficientemente robusta como para detallar lo suficiente el desarrollo de aplicaciones basadas en tipos particulares de desarrollo para web, como lo es ASP. A pesar de esto, la abstracción de la aplicación queda bien determinada gracias a la OOHDM por lo que esperamos proyectarla a cualquier entorno de desarrollo, independientemente de la plataforma o herramienta de desarrollo con la que estemos trabajando. Observamos también que el modelado de la aplicación no radicaba únicamente en la implementación del método de simulación sino que incluye aspectos de administración de registros de usuario y creación de middleware para los archivos de texto con las ecuaciones y de esta forma obtener aquellos que serán propios de la aplicación y con los que se llevarán a cabo las simulaciones. Diversas situaciones se presentaron además de la sección de modelado, sobre todo durante el proceso de desarrollo, de tal forma que es muy importante que tomemos consideración de éstas: • ASP es un buen medio para el desarrollo de aplicaciones de hipermedia y nuestro caso resulto suficiente. Sin embargo el realizar aplicaciones bajo este enfoque implica un delicado manejo de variables de sesión. Dentro de la literatura de desarrollo, mucha de ella disponible en tutoriales en la web, indican que hay que tener precaución sobre como manejar variables de sesión y como ir transmitiendo sus valores de un módulo particular de la aplicación al resto de ellos. En este caso, tomamos tan solo como variables de sesión aquellas cuyo contenido debe estar presente en la mayoría de los módulos o que debían ser transparentes al usuario (i.e. no deben ser vistas en la barra de direcciones URL). Sin embargo, para un mejor control dispusimos de manejar las variables como parámetros que eran pasados entre las páginas de tal forma que un módulo en particular podría determinar si requería de éstas o no mediante el método de petición en formas (i.e. Request.QueryString). Tenemos el hecho también de que las variables de sesión generadas por la aplicación, creadas a través del objeto Session corresponden a las variables que fueron modeladas durante el diseño y que las pasadas como parámetros durante el redireccionamiento de páginas pertenecen a la implementación. De esta forma, es muy recomendable que para cualquier aplicación siempre concibamos lo más que se pueda cual será la información que andará fluyendo libre dentro de la aplicación. 123
  • • El manejo de archivos en ASP es otro punto que no debemos olvidar. A pesar de que las sentencias para la creación y manejo de archivos parecen ser simples, los problemas se presentan en tiempo de ejecución cuando se accede al disco del servidor. Es posible que el servidor caiga en un ciclo de lectura debido a que no tiene bien definido el objeto de archivo que busca en su disco o duro o que no esté disponible el permiso de lectura y escritura en la carpeta correspondiente. Incluso, es importante considerar que aunque ASP es de plataforma Windows, las variantes entre los sistemas operativos afectan bastante. Para esta aplicación, se hizo uso del Internet Information Server bajo el sistema operativo Windows 2000 Professional, y a pesar de estar funcionando el servidor de manera adecuada, el acceso a los archivos no podía realizarse. En estos casos, tomemos en cuenta la posibilidad de que el componente de ejecución de scripts no esté funcionando correctamente. La desventaja de esto, tal y como lo hicimos para esta aplicación, es que debemos registrar el componente scrrun.dll cada vez que el servidor web es levantado. Esta situación no se presenta si se utiliza Windows 98 con el Personal Web Server. • Ya que hablamos de archivos, debemos tener cuidado con el manejo de éstos. Esta aplicación requería de la escritura y lectura de archivos en diversas carpetas. Esta estructura física de archivos fue realizada para definir un buen orden entre los distintos archivos que conforman la aplicación web, lo cual es altamente recomendable. Sin embargo, por la naturaleza misma de SymWeb de estar generando información en tiempo de ejecución, fue necesario habilitar los permisos de escritura y secuencia de comandos de las carpetas dadas de alta en la estructura lógica del servidor. Esto es muy perjudicial, puesto que no es una práctica sana de desarrollo web. De esta forma, es importante que tener en cuenta aspectos de seguridad para futuras versiones de la aplicación. • Otro punto relacionado con los archivos es el control de los archivos que contienen la información con los resultados de graficación. Aquí la metodología que usamos fue buena en cuanto a disponer de ellos en una carpeta especial. A pesar de esto, como la graficación requiere de un componente, este no acepta direcciones en las que estos archivos fuente estén localizados más abajo (i.e. subcarpetas) de donde se encuentra el graficador. Para resolver esta situación, estos archivo fuente para graficación deben ser copiados en el lugar donde está el componente. A su vez, el componente se encuentra en la carpeta principal de la aplicación (i.e. raíz), ya que tampoco es posible acceder a él de manera relativa (i.e. direcciones con subcarpetas). Esto implica que existe la posibilidad de que dos usuarios accedan al mismo archivo con los resultados de una sola simulación aunque la hayan realizado con distintos valores en los parámetros. • Algo muy peculiar al trabajar con aplicaciones web es el manejo de las cadenas de texto. Como sabemos, el lenguaje de guiones que utilizan las ASP es VBScript. Las variables de este lenguaje de guiones se definen como Variant. Esto es una ventaja desde cierto punto, ya que no es necesario fijar el tipo de datos y es posible a veces cambiarnos de tipo según nuestra conveniencia (e.g. pasar de algo leído como cadena a entero con QueryString). Tal ventaja se puede tornar en contra nuestra en algunas situaciones. 124
  • Durante la implementación de la aplicación se observó que en ciertas ocasiones el valor de la variable se pierde si se trata de enviar dentro de la cadena de URL cuando dicho valor está en forma de cadena. Para estos casos entonces concluimos en la siguiente contingencia: Intentar anular las comillas en el valor de la variable aunque sea texto o bien asignarle un número entero el cual podrá ser leído como cadena con el método QueryString. • Por la costumbre del manejo de una computadora es posible que pasemos por alto la parte correspondiente a las especificaciones de lenguaje del sistema operativo durante el desarrollo. Debido a que trabajamos con páginas ASP, que son en sí páginas HTML generadas en tiempo de ejecución, es muy importante tomar precauciones del manejo de decimales, sobre todo en aplicaciones que requieran cálculos, como en nuestro caso. En particular, durante la implementación del SymWeb se detectaron anomalías con el uso del símbolo de separación de decimales. El navegador en el que se ejecutan las pruebas, a pesar de tener el sistema operativo una configuración de español mexicano, toma como separador de decimales la coma y no el punto. Esto es causado por la codificación del contenido desplegado en el navegador, cosa que muchos navegadores se encuentran codificados de esta forma. Lo más recomendable es crear funciones de validación para elementos de formas como las casillas de texto, aunque claramente esto consumiría tiempo y esfuerzo. Podemos auxiliarnos de funciones como cDbl de VBScript para forzar la conversión de una cadena que representa un número a una variable de doble precisión. Sin embargo, esta misma función toma la codificación actual y mal interpretar la entrada del usuario; por ejemplo interpretar 0.5 como 5 según la codificación española. Este tipo de detalles puede pasar de desapercibidos y no ser considerados, pero la ventaja está que si conocemos la codificación de nuestro navegador, al usar funciones como cDbl validamos las entradas y podemos efectuar correctamente cálculos en tiempo de ejecución. Obviamente las salidas estarán codificadas según el navegador. De hecho, la aplicación no puede soportar la graficación de resultados decimales si los resultados numéricos contienen comas porque el componente de graficación maneja como separador de decimal el punto. • Las páginas de servidor activas creadas bajo VBScript tienen mucha ventaja en la libertad de realización. Un buen dominio en el pase de parámetros entre páginas permitirá crear una aplicación eficiente. Las funciones limitadas pueden exasperarnos un poco y requerirán tal vez de la construcción de muchas funciones propias. Aunque es importante que recordemos que estamos trabajando con un lenguaje de guiones y no con un lenguaje de programación en sí. Observemos que realizar páginas ASP bajo VBScript presenta al menos las funciones necesarias en cuanto a solicitudes y respuestas, así como en el manejo de archivos. Con la combinación de las anteriores es posible desarrollar una aplicación web, tal y como sucede con SymWeb. • Cuando realizamos cálculos con variables variantes podemos perder precisión en los reultados. Esto lo objservamos en la sección de resultados. Obviamente, este falta de precisión en los calculos solo puede ser tomada de dos formas: despreciable o significativa. Si es despreciable, entonces nuestra aplicación web puede servir para 125
  • cuantificar las variables de estado. Si es significativa, entonces habremos de considerar los resultados de SymWeb como un indicador general del comportamiento de la variable de estado en un intervalo de tiempo. • La reusabilidad y el uso de componentes son factores importantes en el desarrollo de aplicaciones web. En el caso de SymWeb, la reusabilidad de objetos está presente. Dentro una misma página ASP es posible encontrar el mismo objeto, instanciado una vez y abierto y cerrado varias veces. Este enfoque de reuso nos permite establecer la implementación como consecuencia del proceso de abastracción del funcionamiento de la aplicación. Esta es la ventaja que los objetos brindan. En cuanto a los componentes de software, SymWeb toma dos: uno para la subida de archivos a servidor y otro de graficación. La razón de tomar tales componentes es que ya están realizados y probados. El desarrollo de componentes de servidor puede ser una actividad que consume mucho tiempo por sí sola. Gracias al enfoque de componentes en el desarrollo de software, y en particular en el desarrollo de apliaciones web, es posible centrarnos más en otras partes de la implementación; como es el caso de la implementación del método de traducción en SymWeb. • La usablidad web es algo que debe considerarse en el momento de desarrollar una aplicación web. Si bien la metodología de modelado nos conduce a una abstracción de la aplicación, la usabilidad es el proceso a seguir en el momento de la implementación. Sin embargo, para alcanzar un buen índice de usabilidad es necesario considerarla desde el principio; es decir, desde la la etapa del diseño de la aplicación. De aquí que la navegación sea un punto muy importante en OOHDM. Si estamos conscientes de los lineamientos de usabilidad correspondientes al diseño de sitios web, esto ayudará muchísimo al momento de realizar el diseño navegacional de la aplicación. Sin duda el desarrollo de una aplicación web para la simulación de modelos matemáticos, independientemente si son de nutrición animal o no, brinda la posiblidad de acceder y compartir información en el mundo para una comunidad en particular. A pesar de esto, tenemos que considerar que la web no es una plataforma de aplicaciones al fin y al cabo, y es posible que nos topemos con situaciones similares a las acá descritas cuando la idea sea realizar una aplicación de tipo científico estructurada bajo páginas dinámicas de la web. Pero no hay que olvidar las ventajas de este tipo de desarrollo tales como independencia de plataforma, interoperabilidad, rápido aprendizaje del entorno (basado en hipervínculos), etc. Sin embargo, podemos concluir que la web es un medio viable pero no eficiente para aplicaciones desarrolladas bajo este esquema. Lo más recomendable sin duda es la creación de componentes tales como Applets o ActiveX con los que garantizamos un mejor control en el cálculo numérico. Claramente esto posee una gran desventaja debido a que incrustar objetos 126
  • en páginas web baja la eficiencia en el desempeño de lo que es una aplicación web. De esta forma, podemos recurrir a una tercera alternativa, especialmente en cuestiones académicas como el origen de SymWeb, que es el desarrollo de software libre. El aspecto de manejo de licencias de software, afecta considerablemente el intercambio de información. Si bien el desarrollo de aplicaciones web puede ser una opción con mucho peso a considerar, el desarrollar software académico que sea distribuido de forma gratuita y libre de licencia, es algo que debemos tomar en cuenta. Una propuesta interesante es desarrollar nuestra propia aplicación de simulación. Los requerimientos están aquí establecidos y tenemos también el modelado de la aplicación. Para el desarrollo de ésta misma aplicación bajo un lenguaje de programación de cuarta generación, es posible seguir este diseño, ya que el enfoque de OOHDM, como su nombre lo indica, es orientado a objetos. Tal vez algunas pequeñas modificaciones necesitemos, pero la compatiblidad de OOHDM con UML y OMT derivarán en un número mínimo. Si optamos por la simulación web, y en particular la relacionada con modelado matemático para las ciencias veterinarias, es importante no olvidar que en la actualidad muchos estándares de desarrollo distribuido están consolidándose o incursionando en el ambiente; así, es nuestra responsabilidad en categorizar y seleccionar adecuadamente uno de ellos. RMI, CORBA y la tecnología .Net, son algunos que habremos de considerar. Quizá uno de ellos sea más adecuado para futuras la creación de una nueva vesión de SymWeb. 127
  • 128
  • Tenemos a continuación el listado de las principales páginas ASP que conforman la aplicación. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página: index_gnal.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Pagina a la que accede todo usuario de la ' apicacion mientras no introduzca su login y ' password, no esté registrado o bien, haya ' vencido el tiempo de espera para uso de la ' la aplicación '******************************************************************* dim strTemp dim oBrowser dim isIE4 Set obrowser = Server.CreateObject("MSWC.BrowserType") If obrowser.version < 5 or obrowser.browser <> "IE" Then Response.Redirect("navegador_restringido.asp") End If %> <html> <head> <title>Symweb ::Principal::</title> <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> <script language="JavaScript" type="text/javascript"> <!-- // last modified script by Bernhard Friedrich; should work in all browsers function ultimaModificacion () { var a; a=new Date(document.lastModified); lm_year=a.getYear(); if (lm_year<1000){ //just in case date is delivered with 4 digits if (lm_year<70){ lm_year=2000+lm_year; } else lm_year=1900+lm_year; } //end workaround lm_month=a.getMonth()+1; if (lm_month<10){ lm_month='0'+lm_month; } lm_day=a.getDate(); if (lm_day<10){ lm_day='0'+lm_day; } document.write("Última fecha de actualización: " + lm_day+'/'+lm_month+'/'+lm_year); document.write("<BR>") 129
  • } // --> </script> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0 style="font-family: Verdana, Arial, Helvetica;"> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="333300" class="barra_superior"> <td> <img src="imagenes/logo_chico.gif" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="9"> <br> <font color="#ffffcc">Simulaci&oacute;n y Modelado en Web. ver. 1.0<br> <font color="White">Universidad Aut&oacute;noma de Yucat&aacute;n</font><br> <br> <font color="White">Facultad de Matem&aacute;ticas</font><br> <font color="White">Facultad de Medicina Veterinaria y Zootecnia</font><br><br> </td> <td align="center"> <div align="right"><a href="http://www.uady.mx"><img src="imagenes/logo_uady_chico.gif" width="53" height="78" alt="logo uady" border="0"></a></div> </td> <td align="center"> <a href="http://www.conacyt.mx"><img src="imagenes/imagen_conacyt.gif" width="74" height="78" alt="logo conacyt" border="0"></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> <td bgcolor="#999966" class="etiqueta1_activa_izq">&nbsp;</td> <td bgcolor="#999966" class="activa_int" >Principal</td> <td class="activa_der">&nbsp;</td> <td class="inactiva_int"><a href="modelos_gnal.asp" class="inactiva" title="Selección de modelo a simular">Modelos</a></td> <td class="inactiva_der">&nbsp;</td> <td class="inactiva_int"><a href="graficar_gnal.asp" class="inactiva" title="Gráficar los resultados del modelo">Gráficador</a></td> <td class="etiquetan_inactiva_der">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" colspan="3">&nbsp;</td> </tr> </table> <!-- Tabla de Contenido --> <br> <table border="0" width="100%" cellspacing="0" cellpadding="0"> 130
  • <tr> <td rowspan="3" width="9">&nbsp;</td> <td bgcolor="#CCCC99"></td> <td width="80" bgcolor="#CCCC99"><font size=1><strong><div class="panellogin1">LOGIN</div></strong></font></td> <td width="4" background="imagenes/panel_login01.gif">&nbsp;</td> <td width="90" >&nbsp;</td> <td width="0" >&nbsp;</td> <td width="20" >&nbsp;</td> <td width="70%" >&nbsp;</td> <td width="10" >&nbsp;</td> </tr> <tr> <td width="9" bgcolor="#CCCC99">&nbsp;</td> <td colspan="3" bgcolor="#CCCC99"> <div class="panellogin2"><br> Para poder acceder al módulo de simulación y graficador en su completa funcionalidad, es necesario su registro.<br> <% If Request("strUsrData") = 9 Then strTemp = "<font color=#cc3300>Es necesario introducir un Login y Password válidos.</font>" Response.Write(strTemp) End If %> <div align="right"> <form action="validar_usr.asp" method="post" name="forma"> <font color=#cc6666>login</font>&nbsp;&nbsp;&nbsp;<br> <% strTemp = "<input type='text' name='recLogin' size='17' maxlength='15' value='" strTemp = strTemp & Session("sessUsrLogin") &"'><br>" Response.Write(strTemp) If Request("strUsrData") = 1 Then strTemp = "<font color=#cc3300>No existe tal Login registrado</font>" Response.Write(strTemp) End If %> <br><br> <font color="#CC6666">password</font>&nbsp;&nbsp;&nbsp;<br> <input type="password" name="recPassword" size="17" maxlength="15"><br> <% If Request("strUsrData") = 2 Then strTemp = "<font color=#cc3300>Es necesario el Passowrd</font>" Response.Write(strTemp) ElseIf Request("strUsrData") = 3 Then strTemp = "<font color=#cc3300>El Passoword es incorrecto</font>" Response.Write(strTemp) End If %> <br><br><br> <input type="submit" name="start_logon" class="submit" value="Iniciar Sesión"> </form> </div> <br> <a href="por_que_registrarse.asp" class="panellogin">¿Por qué registrarse a Symweb?</a> 131
  • </div> </td> <td bgcolor="#CCCC99">&nbsp;</td> <td>&nbsp;</td> <td width="70%" class="intro" valign="top"> "Las funciones biológicas en los seres vivos pueden cuantificarse y representarse mediante el proceso denominado 'simulación de modelos'. El modelado en la producción animal permite reproducir los diferentes procesos digestivos y metabólicos que se llevan a cabo dentro del animal para así estudiarlos con una base cuantitativa y dinámica a más bajo costo que en la investigación pecuaria convencional" (Ku, 2000).<br><br> La cita anterior resume en sí la importancia del modelado matemático y la simulación por computadora en las ciencias veterinarias. De esta idea surge el proyecto de la creación de un simulador de modelos matemáticos veterinarios disponible para todos, denominado "Simulación y Modelado vía Web: <strong>SYMWEB</strong>".<br><br> <font color="#d7d7d7" size=-2>La versión 1.0 estuvo desarrollada bajo el Modelado de Hipermedia Orientado a Objetos (OOHDM) como tesis de Omar Sosa Tzec, dentro del proyecto 33722-B de Conacyt. Facultad de Matemáticas - UADY.</font> </td> <td width="10" >&nbsp;</td> </tr> <tr> <td height="9" background="imagenes/panel_login02.gif">&nbsp;</td> <td colspan="3" width="190" bgcolor="#CCCC99">&nbsp;</td> <td bgcolor="#CCCC99">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td width="10" >&nbsp;</td> </tr> </table> <!-- Fin de tabla de contenido --> <table class="contenido" cellpadding="2" cellspacing="10"> <tr> <td width="35%" valign="top"> <font color="#FFFFFF">Facultad de Matemáticas</font><br> Calle 8 x 21 Col. Ma. Luisa.<br> CP. 97199. Mérida, Yucatán.<br> Tels.: (+52 999) 929-3244 y 929-3245.<br> <a href="http://www.uady.mx/sitios/matemati" class="panellogin">http://www.uady.mx/sitios/matemati</a> </td> <td width="35%" valign="top"> <font color="#FFFFFF">Facultad de Medicina Veterinaria y Zootecnia</font><br> Carretera Mérida-Xmatkuil Km. 15.5<br> Apartado Postal: 4-116 Itzimná<br> C.P. 97100. Mérida, Yucatán, México.<br> Teléfono y Fax: (+52 999) 9423200, 9423205.<br> <a href="http://www.uady.mx/sitios/veterina" class="panellogin">http://www.uady.mx/sitios/veterina</a> </td> <td width="1" background="imagenes/separador_vertical.gif"></td> <td width="2">&nbsp;</td> <td width="30%" valign="middle"> <script>ultimaModificacion();</script> Mérida, Yucatán, México. </td> </tr> </table> </html> 132
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página: modelo.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Se presenta al usuario la lista de modelos ' que se han publicado en SymWeb y luego procede ' a seleccionar uno para hacerle un ajuste en ' en sus parámetros y simular ' Establece: El valor de la variable idModSeleccionado ' la cual llega con 0 por defecto al inciar la ' sesión '******************************************************************* ' Variables de objeto y cadena para tablas en BD If Session("sessUsrNombre") = "" Then Response.Redirect("index_gnal.asp") End If Dim oConexion, rsTabla Dim strSQL Dim srtTemp ' Variables de objeto y cadena para archivo Dim objFSO Dim objTextStream Dim strFileName Dim strLinea Dim strSplitConIgual Dim i ' Constantes de manejo de archivos const fsoForReading = 1 const fsoForWriting = 2 'Instanciamiento de objetos de conexión y tabla Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") %> <html> <head> <title>Symweb ::Principal::</title> <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0 style="font-family: Verdana, Arial, Helvetica;"> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="333300" class="barra_superior"> <td> <img src="imagenes/logo_chico.gif" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="8"> <br> Usuario: <font color="White"><% Response.Write(Session("sessUsrNombre") & " " & Session("sessUsrApellido")) 133
  • %></font><br> Categoría de Usuario: <font color="White"><% Response.Write(Session("sessUsrPermiso"))%></font><br> <br><br> Modelo en Uso: <font color="White"> <% If Request.QueryString("idModSeleccionado")<>0 Then strSQL = "SELECT titulo FROM modelo WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion Session("sessUsrModelo") = rsTabla.Fields("titulo") Response.Write(Session("sessUsrModelo")) rsTabla.Close oConexion.Close Else Response.Write(Session("sessUsrModelo")) End If %> </font> <br><br><br> </td> <td align="center"> <div align="right"> <form name="frmBuscar" action="buscar.asp" method="post"> <font color="#cccc99">Escriba una palabra<br></font> <img src="imagenes/buscar.gif" width="20" height="17" alt="" border="0"> <input type="text" name="buscar" size="15" class="buscar_texto" value=""> <br> <input type="submit" class="buscar_submit" value="Buscar"> </form> </div> </td> <td align="center"> <a href="cerrar_sesion.asp" class="logout" title="Abandonar el sitio de SyMWeb"> <img src="imagenes/cerrar_sesion.gif" width="25" height="25" alt="Botón: Cerrar Sesión" border="0"><br> <font color="#ffffcc">Cerrar<br> Sesión</font></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> <td bgcolor="#999966" class="etiqueta1_inactiva_izq">&nbsp;</td> <td bgcolor="#999966" class="inactiva_int" > <% strTemp = "<a href=""index.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Regresar a la página principal y registrarse'" strTemp = strTemp & ">Principal</a>" Response.Write(strTemp) %> </td> <td class="activa_izq">&nbsp;</td> 134
  • <td class="activa_int">Modelos</td> <td class="activa_der">&nbsp;</td> <td class="inactiva_int"> <% strTemp = "<a href=""graficar.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Gráficar los resultados del modelo'" strTemp = strTemp & ">Graficador</a>" Response.Write(strTemp) %> </td> <td class="etiquetan_inactiva_der">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" width="16%">&nbsp;</td> <td class="borde_sup" colspan="3">&nbsp;</td> </tr> </table> <!-- Tabla de Contenido --> <table class="contenido" width=100% cellpadding=0 cellspacing=10 border=0 height="70%"> <tr> <td width="17%" valign="top"> <h5>Modelos Publicados</h5> <% strSQL = "SELECT * FROM modelo" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion While Not rsTabla.EOF strTemp = "<li><a class='link' href='modelo.asp?idModSeleccionado=" strTemp = strTemp & rsTabla.Fields("idmod") strTemp = strTemp & "&strVariable=" & Request.QueryString("strVariable") strTemp = strTemp & "'>" strTemp = strTemp & rsTabla.Fields("titulo") & "</a></li><br><br>" Response.Write(strTemp) rsTabla.MoveNext Wend rsTabla.Close oConexion.Close %> </td> <td class="separador" width="1"></td> <td valign="top" class="modelos"> <div class="identado"> <% ' Advertencia de lógica: idModSeleccionado es auto dimensionado If Request.QueryString("idModSeleccionado")=0 Then strTemp = "<div class='variable'>" & Session("sessUsrModelo") strTemp = strTemp & "</div>" Response.Write(strTemp) Else 135
  • strSQL = "SELECT * FROM modelo WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strTemp = "<form name='forma' action='modelos/" strTemp = strTemp & rsTabla.Fields("archivo") & "_sim.asp" strTemp = strTemp & "' method='get'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) strTemp = "<input type='hidden' name='idModSeleccionado' value='" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & "'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) strTemp = "<input type='hidden' name='strVariable' value='0'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) Session("sessUsrModelo") = rsTabla.Fields("titulo") strFileName = "/symweb/modelos/" & rsTabla("archivo") & "_init.txt" strTemp = "<font color=#990000>Titulo: </font>" strTemp = strTemp & rsTabla.Fields("titulo") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Descripción: </font>" strTemp = strTemp & rsTabla.Fields("descripcion") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Autor: </font>" strTemp = strTemp & rsTabla.Fields("autor") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Referencia: </font>" strTemp = strTemp & rsTabla.Fields("referencia") & vbCrLf strTemp = strTemp & "<br><font color=#990000>URL: </font>" If rsTabla.Fields("url")= "" Then strTemp = strTemp & "No existe ningun recurso en Internet asociado a este modelo" & vbCrLf Else strTemp = strTemp & "<a href='" strTemp = strTemp & rsTabla.Fields("url") & "' target='RefMod'" strTemp = strTemp & "class='link'>" strTemp = strTemp & rsTabla.Fields("url") & vbCrLf strTemp = strTemp & "</a>" End If strTemp = strTemp & "<br><font color=#990000>Fecha de Publicación: </font>" strTemp = strTemp & rsTabla.Fields("fecha_publicacion") & vbCrLf Response.Write(strTemp) rsTabla.Close oConexion.Close ' Y volvemos a abrir para la tabla de archivos relacionados strSQL = "SELECT * FROM relacionado WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strTemp = "<br><br><font color=#990000>Archivo Relacionado: </font>" strTemp = strTemp & "<a href='relacionados/" strTemp = strTemp & rsTabla.Fields("nomarch") strTemp = strTemp & "' target='usrArchRel' class='link'>" 136
  • strTemp = strTemp & rsTabla.Fields("nomarch") & "</a>" & vbCrLf strTemp = strTemp & "<br><font color=#990000>Titulo: </font>" strTemp = strTemp & rsTabla.Fields("tituloarch") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Descripción: </font>" strTemp = strTemp & rsTabla.Fields("descriparch") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Tamaño: </font>" strTemp = strTemp & rsTabla.Fields("tamano") & " Kb" & vbCrLf Response.Write(strTemp) rsTabla.Close oConexion.Close Set objFSO = Server.CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(Server.MapPath(strFileName)) Then Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName),fsoForReading) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "<div class='variable'><br>Variables de Simulación</div><br>" & vbCrLf strTemp = strTemp & "<div class='identado'>" & vbCrLf strTemp = strTemp & "Tiempo Inicial (t0) &nbsp;&nbsp;" strTemp = strTemp & "<input type='text' name='recT0' value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "Tiempo Final (tn) &nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name='recTn'value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "Incremento en el tiempo (dt) &nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name='recDt' value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "</div><br>" Response.Write(strTemp) strTemp = "<div class='variable'>Variables de Estado</div><br>" & vbCrLf Response.Write(strTemp) Response.Flush strLinea = objTextStream.ReadLine strLinea = objTextStream.ReadLine strTemp = "<div class='identado'>" & vbCrLf Response.Write(strTemp) i=0 'Para inidizar los nombres de los input textbox While strComp(strLinea, "*")<>0 strSplitConIgual = Split(strLinea, "=") strTemp = strSplitConIgual(0) &"&nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name=graficable" 137
  • strTemp = strTemp & i strTemp = strTemp & " value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) i=i+2 'Porque en la traducción se hizo módulo 2 debido ' al = strLinea = objTextStream.ReadLine Wend strTemp = "</div><br>" Response.Write(strTemp) strTemp = "<div class='variable'>Parámetros y ecuaciones relacionadas</div><br>" & vbCrLf Response.Write(strTemp) strTemp = "<div class='identado'>" & vbCrLf Response.Write(strTemp) i=0 'Para inidizar los nombres de los input textbox While Not objTextStream.AtEndOfLine strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") If IsNumeric(strSplitConIgual(1)) Then strTemp = strSplitConIgual(0) &"&nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name=variable" strTemp = strTemp & i strTemp = strTemp & " value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) i=i+2 'Porque en la traducción se hizo ' módulo 2 debido al = Else Response.Write(strLinea & "<br>" & vbCrLf) End If Wend strTemp = "</div>" & vbCrLf Response.Write(strTemp) strTemp = vbCrLf & "<p><img src='imagenes/mail_alerta.gif' width=14 height=12 border=0>" strTemp = strTemp & "&nbsp;&nbsp;" strTemp = strTemp & "<input type='submit' value='Simular' class='submit'>" strTemp = strTemp & vbCrLf & "</form>" Response.Write(strTemp) Else strTemp = "<p><p><div class='variable'>Ha ocurrido un error fatal!</div>" Response.Write(strTemp) End If End If 'Fin si ningun modelo ha sido seleccionado Set rsTabla = Nothing Set oConexion = Nothing Response.Flush %> </div> 138
  • </td> </tr> </table> <!-- Fin tabla de contenido --> </html> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: pre_altas.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: por_que_registrarse.asp ' Entrada: Nada ' Devuelve: Nada ' Redirecciona: registro_usr.asp ' Establece: Variables de sesión para registro de usuario ' Descripción: Instancia las variables de sesión correspondientes ' al perfil de usuario a vacías o su valor por defecto. '**************************************************************** Session("sessLogin") = "" Session("sessPassword") = "" Session("sessNombre") = "" Session("sessApellido") = "" Session("sessEmail") = "" Session("sessDomicilio") = "" Session("sessURL") = "http://www.uady.mx/sitios/matemati" Response.Redirect("registro_usr.asp") %> <%@ LANGUAGE="VBSCRIPT"%> <% '******************************************************************* ' Página-Función: altas.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: registro_usr.asp ' Entrada: recLogin, recPassword, recNombre, recApellido ' recEmail, recDomicilio, recURL - Info del usuario ' Devuelve: strNoData - num de error ocurrido en el registro ' Redirecciona: registro_usr.asp?strNoData - Si algun error ocurrió ' index.asp - Si el registro tuvo éxito ' Establece: Variables de sesión para registro de usuario en la BD ' y dentro de la aplicación ' Descripción: Toma cada una de las entradas de la forma de registro ' y verifica que cumplan las condiciones para llevar el ' el registro, si sucede, se escribe el perfil en la BD '**************************************************************** Dim oConexion, rsTabla Dim strSQL Dim strNoData Session("sessLogin") = Request("recLogin") 139
  • Session("sessPassword") = Request("recPassword") Session("sessNombre") = Request("recNombre") Session("sessApellido") = Request("recApellido") Session("sessEmail") = Request("recEmail") Session("sessDomicilio") = Request("recDomicilio") Session("sessURL") = Request("recURL") If Session("sessLogin") = "" Then Response.Redirect("registro_usr.asp?strNoData=1") End If If Request("recLogin")="" Then Response.Redirect("registro_usr.asp?strNoData=1") End If If Request("recPassword")="" Then Response.Redirect("registro_usr.asp?strNoData=2") End If If Request("recNombre")="" Then Response.Redirect("registro_usr.asp?strNoData=3") End If If Request("recEmail")="" or Request("recEmail")="@" Then Response.Redirect("registro_usr.asp?strNoData=4") End If If Request("recURL")="" Then Response.Redirect("registro_usr.asp?strNoData=5") End If Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") strSQL = "SELECT * FROM usuario WHERE login = '"&UCase(Request("recLogin"))&"'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion, 2, 3, 1 If rsTabla.EOF Then rsTabla.AddNew rsTabla("login") = Request("recLogin") rsTabla("password") = Request("recPassword") rsTabla("permiso") = "r" rsTabla("nombre") = Request("recNombre") rsTabla("apellido") = Request("recApellido") rsTabla("email") = Request("recEmail") rsTabla("domicilio") = Request("recDomicilio") rsTabla("url") = Request("recURL") rsTabla.Update Session("sessUsrNombre") = Request("recNombre") Session("sessUsrApellido") = Request("recApellido") Session("sessUsrPassword") = Request("recPassword") Session("sessUsrModelo") = "Ningun modelo ha sido seleccionado" Session("sessUsrPermiso") = "Registrado" Session("sessUsrEmail") = Request("recEmail") Session("sessUsrDomicilio") = Request("recDomicilio") Session("sessUsrURL") = Request("recURL") Response.Redirect("index.asp?idModSeleccionado=0") Else Response.Redirect("registro_usr.asp?strNoData=9") End If rsTabla.Close oConexion.Close 140
  • %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: validar_usr.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: index_gnal.asp ' Entrada: recLogin - cadena - identificador de usuario ' recPassword - cadena - clave de usuario ' Devuelve: strUsrData = entero - num de error ocurrido ' Redirecciona: index_gnal.asp?strUsrData - Si hubo error ' index.asp - Si el usuario es valido ' Establece: Variables de sesión de datos de usuario ' Descripción: Toma la información enviado a través de la ' la forma de Login y verifica que el usuario ' esté registrado en la tabla de usuarios, de ' no ser así devuelve el numero de error. En ' caso contrario, establece el perfil de usr. '******************************************************************* Dim oConexion, rsTabla Dim strSQL Dim strTemp Dim strUsrData Dim idModSeleccionado 'Variable para la sección de modelos Session("inicioSeleccMod") = True Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.RecordSet") Session("sessUsrLogin") = Request("recLogin") StrSQL = "SELECT * FROM usuario WHERE login = '" & Request("recLogin") & "'" If Request("recLogin") = "" Then Response.Redirect("index_gnal.asp?strUsrData=9") Else oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion If rsTabla.EOF Then Response.Redirect("index_gnal.asp?strUsrData=1") Else If Request("recPassword") = "" Then Response.Redirect("index_gnal.asp?strUsrData=2") ElseIf Request("recPassword") <> rsTabla.Fields("password") Then Response.Redirect("index_gnal.asp?strUsrData=3") Else Session("sessUsrNombre") = rsTabla.Fields("nombre") Session("sessUsrApellido") = rsTabla.Fields("apellido") Session("sessUsrPassword") = rsTabla.Fields("password") Session("sessUsrModelo") = "Ningun modelo ha sido seleccionado" If rsTabla.Fields("permiso") = "r" Then Session("sessUsrPermiso") = "Registrado" ElseIf rsTabla.Fields("permiso") = "p" Then Session("sessUsrPermiso") = "Publicista" Else Session("sessUsrPermiso") = "Administrador" End If Session("sessUsrEmail") = rsTabla.Fields("email") Session("sessUsrDomicilio") = rsTabla.Fields("domicilio") 141
  • Session("sessUsrURL") = rsTabla.Fields("url") Response.Redirect("index.asp?strVariable=0&idModSeleccionado=0") End If rsTabla.Close End If End If %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página: index.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Es la página principal de un usuario registrado ' y que tiene menú personalizado dependiendo del ' tipo de usuario que accedió a la aplicación ' Establece: Toma las variables de sesión provenientes del ' registro o del Login para personalizar el ' contenido '******************************************************************* dim strTemp dim strTemp2 %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Symweb ::Principal::</title> <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> <script language="JavaScript" type="text/javascript"> <!-- // last modified script by Bernhard Friedrich; should work in all browsers function ultimaModificacion () { var a; a=new Date(document.lastModified); lm_year=a.getYear(); if (lm_year<1000){ //just in case date is delivered with 4 digits if (lm_year<70){ lm_year=2000+lm_year; } else lm_year=1900+lm_year; } //end workaround lm_month=a.getMonth()+1; if (lm_month<10){ lm_month='0'+lm_month; } lm_day=a.getDate(); if (lm_day<10){ lm_day='0'+lm_day; } document.write("Última fecha de actualización: " + lm_day+'/'+lm_month+'/'+lm_year); document.write("<BR>") } 142
  • // --> </script> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0 style="font-family: Verdana, Arial, Helvetica;"> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="333300" class="barra_superior"> <td> <img src="imagenes/logo_chico.gif" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="8"> <br> Usuario: <font color="White"><% Response.Write(Session("sessUsrNombre") & " " & Session("sessUsrApellido")) %></font><br> Categoría de Usuario: <font color="White"><% Response.Write(Session("sessUsrPermiso"))%></font><br> <br><br> Modelo en Uso: <font color="White"><% Response.Write(Session("sessUsrModelo")) %></font> <br><br><br> </td> <td align="center"> <div align="right"> <form name="frmBuscar" action="buscar.asp" method="post"> <font color="#cccc99">Escriba una palabra<br></font> <img src="imagenes/buscar.gif" width="20" height="17" alt="" border="0"> <input type="text" name="buscar" size="15" class="buscar_texto" value=""> <br> <input type="submit" class="buscar_submit" value="Buscar"> </form> </div> </td> <td align="center"> <a href="cerrar_sesion.asp" class="logout" title="Abandonar el sitio de SyMWeb"> <img src="imagenes/cerrar_sesion.gif" width="25" height="25" alt="Botón: Cerrar Sesión" border="0"><br> <font color="#ffffcc">Cerrar<br> Sesión</font></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> <td bgcolor="#999966" class="etiqueta1_activa_izq">&nbsp;</td> <td bgcolor="#999966" class="activa_int" >Principal</td> <td class="activa_der">&nbsp;</td> <td class="inactiva_int"> <% strTemp = "<a href=""modelo.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Selección de modelo a simular'" strTemp = strTemp & ">Modelos</a>" Response.Write(strTemp) %> </td> 143
  • <td class="inactiva_der">&nbsp;</td> <td class="inactiva_int"> <% strTemp = "<a href=""graficar.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Gráficar los resultados del modelo'" strTemp = strTemp & ">Graficador</a>" Response.Write(strTemp) %> </td> <td class="etiquetan_inactiva_der">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" width="16%">&nbsp;</td> <td class="borde_sup" colspan="3">&nbsp;</td> </tr> </table> <!-- Tabla de Contenido --> <br> <% If Session("sessUsrPermiso") = "Registrado" Then strTemp = "#CC9900" ElseIf Session("sessUsrPermiso") = "Publicista" Then strTemp = "#006666" ElseIf Session("sessUsrPermiso") = "Administrador" Then strTemp = "#003366" End If %> <table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td rowspan="3" width="9">&nbsp;</td> <td bgcolor="<%Response.Write(strTemp)%>"></td> <td width="80" bgcolor="<%Response.Write(strTemp)%>"><strong><div class="panellogin1"><font color="#ffffcc">Perfil</font></div></strong></td> <td width="4" background="imagenes/panel_<% Response.Write(Session("sessUsrPermiso"))%>001.gif">&nbsp;</td> <td width="90" >&nbsp;</td> <td width="0" >&nbsp;</td> <td width="20" >&nbsp;</td> <td width="70%" >&nbsp;</td> <td width="10" >&nbsp;</td> </tr> <tr> <td width="9" bgcolor="<%Response.Write(strTemp)%>">&nbsp;</td> <td colspan="3" valign="top" bgcolor="<%Response.Write(strTemp)%>"> <div class="panel"><br> <font color=#ffffcc>Nombre: </font><% Response.Write(Session("sessUsrNombre"))%><br><br> <font color=#ffffcc>Apellido: </font><% Response.Write(Session("sessUsrApellido"))%> <br><br> 144
  • <font color=#ffffcc>Domicilio: </font><% Response.Write(Session("sessUsrDomicilio"))%> <br><br> <font color=#ffffcc>Email: </font><% Response.Write(Session("sessUsrEmail"))%> <br><br> <font color=#ffffcc>URL: </font><a href="<% Response.Write(Session("sessUsrURL"))%>" class="panellogin" target="browUsr"><% Response.Write(Session("sessUsrURL"))%></a> <br><br> </div> </td> <td bgcolor="<% Response.Write(strTemp)%>">&nbsp;</td> <td>&nbsp;</td> <td width="70%" class="intro" valign="top"> <h5>Opciones de Usuario</h5> <strong> <img src="imagenes/vineta01.gif" width="22" height="10" alt="" border="0"><a href="datos_usr.asp" class="link">Cambiar perfil de Usuario</a><img src="imagenes/vineta02.gif" width="22" height="10" alt="" border="0"> <br><br> <img src="imagenes/vineta01.gif" width="22" height="10" alt="" border="0"><a href="bajas_usr.asp" class="link">Darse de Baja en SymWeb</a><img src="imagenes/vineta02.gif" width="22" height="10" alt="" border="0"> <br><br> <% If Session("sessUsrPermiso") = "Publicista" Then strTemp2 = "<img src='imagenes/vineta01.gif' width='22' height='10' border='0'><a href='cambiosusr' class='link'>Publicar Modelo</a><img src='imagenes/vineta02.gif' width='22' height='10' border='0'>" Response.Write(strTemp2) ElseIf Session("sessUsrPermiso") = "Administrador" Then strTemp2 = "<img src='imagenes/vineta01.gif' width='22' height='10' border='0'><a href='prepublicar.asp' class='link'>Publicar Modelo</a><img src='imagenes/vineta02.gif' width='22' height='10' border='0'><br><br><img src='imagenes/vineta01.gif' width='22' height='10' border='0'><a href='admin_usr.asp' class='link'>Administración de Usuarios</a><img src='imagenes/vineta02.gif' width='22' height='10' border='0'>" Response.Write(strTemp2) End If %> </strong> <br><br> <h5>SymWeb 1.0</h5> <font size=1> Simulación y Modelado vía Web<br> Cuerpo Académico de Simulación y Modelado - Universidad Autónoma de Yucatán<br> Facultad de Matemáticas - Facultad de Medicina Veterinaria y Zootecnia<br><br> Administrador de Aplicación: Dr. Luis Vargas Villamil.<br> <img src="imagenes/mail_icono.gif" width="13" height="8" alt="" border="0"> <a href="mailto:symweb@tunku.uady.mx" class="link">symweb@tunku.uady.mx</a> </font> </td> <td width="10" >&nbsp;</td> </tr> <tr> <td height="9" background="imagenes/panel_<% Response.Write(Session("sessUsrPermiso"))%>002.gif">&nbsp;</td> <td colspan="3" width="190" bgcolor="<%Response.Write(strTemp)%>">&nbsp;</td> <td bgcolor="<%Response.Write(strTemp)%>">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td width="10" >&nbsp;</td> </tr> </table> 145
  • <!-- Fin de tabla de contenido --> </html> <%@ LANGUAGE="VBSCRIPT"%> <% '******************************************************************* ' Página: datos_usr.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Presenta el perfil del usuario para que ' realice cambios en éste ' Establece: Nada. Toma variables de sesión establecidas ' en registro o Login ' Enlaza a cambios.asp '******************************************************************* dim strTemp If Session("sessUsrPassword") = "" Then Response.Redirect("index_gnal.asp") End If %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Symweb ::Registro de Usuario::</title> <link rel="STYLESHEET" type="text/css" href="css/index.css"> <link rel="STYLESHEET" type="text/css" href="css/registro.css"> </head> <body bgcolor="#cccc99" leftmargin=0 topmargin=0 text="#000000"> <table height="100%" widht="100%" cellspacing="0" cellpadding="10" border=0> <td bgcolor="#333300" class="izquierda" valign="top"> <a href="JavaScript:history.back()"><img src="imagenes/index01.gif" width="139" height="140" border="0" alt="SymWeb Logo"></a> </td> <td class="derecha"> <h1>D a t o s &nbsp;&nbsp;&nbsp;d e&nbsp;&nbsp;&nbsp;U s u a r i o</h1> El siguiente formulario le permite realizar cambios sobre su perfil de usuario. Es importante que no realice cambios en información que no desea actualizar ya que quedarán registrados una vez realizada la actualización. <br><br> <font size=-1> <div class="comentario">&raquo; Para pasar de casilla en casilla presione la tecla <strong>TAB</strong> (ubicada arriba de la tecla de <strong>Bloq Mayús</strong> en teclados Windows)<br><br> </div> </font> <img src="imagenes/carpeta_icono.gif" width="15" height="10" border="0"> <a href="JavaScript:history.back()" class="login">Regresar a Principal</a> <br><br> <form name="forma" action="cambios.asp" method="post"> <div class=forma><br> <strong>Login:</strong> <font color =#ffffcc> <% strTemp = Session("sessUsrLogin") Response.Write(strTemp) 146
  • %> </font> <font size=-1><div class="comentario">No es posible cambiar el Login.</div></font> <br> <strong>Password:</strong> <% If Request.QueryString("strNoData") = 2 Then strTemp = "<div class='error'>El Password es necesario para acceder a la aplicación</div>" Response.Write(strTemp) End If strTemp = "<input name='recPassword' class='forma' type='password' size='17' maxlength='15' value='" strTemp = strTemp & Session("sessUsrPassword") strTemp = strTemp & "'>" Response.Write(strTemp) %> <br><br> </div> <br><br> <div class=forma><br> <strong>Nombre(s):</strong> <% If Request.QueryString("strNoData") = 3 Then strTemp = "<div class='error'>Proporcione al menos su nombre</div>" Response.Write(strTemp) End If strTemp = "<input name='recNombre' class='forma' type='text' size='37' maxlength='35' value='" strTemp = strTemp & Session("sessUsrNombre") strTemp = strTemp & "'>" Response.Write(strTemp) %> <br><br> <strong>Apellido(s):</strong> <% strTemp = "<input name='recApellido' class='forma' type='text' size='37' maxlength='35' value='" strTemp = strTemp & Session("sessUsrApellido") strTemp = strTemp & "'>" Response.Write(strTemp) %> <br><br> </div> <br><br> <div class=forma><br> <strong>E-mail</strong><br> <% If Request.QueryString("strNoData") = 4 Then strTemp = "<div class='error'>Necesita una dirección de correo electrónico válida</div>" Response.Write(strTemp) End If strTemp = "<input name='recEmail' class='forma' type='text' size='37' maxlength='35' value='" strTemp = strTemp & Session("sessUsrEmail") strTemp = strTemp & "'>" Response.Write(strTemp) %> <br><br> <strong>Domicilio</strong><br> <% strTemp = "<input name='recDomicilio' class='forma' type='text' size='50' maxlength='100' value='" strTemp = strTemp & Session("sessUsrDomicilio") strTemp = strTemp & "'>" 147
  • Response.Write(strTemp) %> <br><br> </div> <br><br> <div class="forma"><br> <strong>URL de redireccionamiento</strong> <font size=-1><div class="comentario">Sitio Web a donde será enviado cuando abandone SyMWeb al cerrar su sesión. Por favor, es importante incluir la directiva completa (i.e. incluyendo <strong>http://</strong>).</div></font> <% If Request.QueryString("strNoData") = 5 Then strTemp = "<div class='error'>Escriba un URL válido</div>" Response.Write(strTemp) End If strTemp = "<input name='recURL' class='forma' type='text' size='50' maxlength='100' value='" strTemp = strTemp & Session("sessUsrURL") strTemp = strTemp & "'>" Response.Write(strTemp) %> <br><br> </div> <br><br> <input class="submit" type="submit" value="Actualizar datos"> </form> </td> </table> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página: bajas_usr.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Da la opción al usuario de darse de baja ' definitiva como usuario de la aplicación ' Establece: Nada. Maneja variables de sesión provenientes ' de otras páginas '******************************************************************* %> <html> <head> <title>Symweb ::Registro de Usuario::</title> <link rel="STYLESHEET" type="text/css" href="css/index.css"> <link rel="STYLESHEET" type="text/css" href="css/registro.css"> </head> 148
  • <body bgcolor="#cccc99" leftmargin=0 topmargin=0 text="#000000"> <table height="100%" widht="100%" cellspacing="0" cellpadding="10" border=0> <td bgcolor="#333300" class="izquierda" valign="top"> <a href="JavaScript:history.back()"><img src="imagenes/index01.gif" width="139" height="140" border="0" alt="SymWeb Logo"></a> </td> <td class="derecha"> <h1>B a j a &nbsp;&nbsp;&nbsp;d e&nbsp;&nbsp;&nbsp;U s u a r i o</h1> <img src="imagenes/mail_alerta.gif" width="14" height="12" border="0"> <%Response.Write(Session("sessUsrNombre"))%>:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ha seleccionado la opción para <strong>darse de baja</strong> dentro de los usuarios de SymWeb. Una vez eliminado del registro no podrá acceder a la aplicación con su Login y Password usuales.<br><br> <div class="forma" align="right"> <form name="forma" action="bajas.asp" method="post"> <br> <font color="#ffffcc" size=1><strong>¿Desea proceder?</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> <input type="submit" class="submit" value="Sí. Eliminarme de registro"><br><br> </form> </div> </td> </table> </body> </html> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: prepublicar.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: index.asp - solo si eres publicista ' Entrada: Nada ' Devuelve: Nada ' Redirecciona: publicar.asp ' Establece: Variables de sesión de los perfiles de publicación ' de modelos y archivos relacionados a vacías ' Descripción: Prepara las variables de sesión para la publicación '**************************************************************** Session("sessEdoPublic1") = "" Session("sessEdoPublic2") = "" Session("sessEdoPublic3") = "" Session("sessEdoPublic4") = "" Session("sessRelTitulo") = "" Session("sessRelDescripcion") = "" Session("sessRelPalCve") = "" Session("sessModTitulo") = "" 149
  • Session("sessModDescripcion") = "" Session("sessModAutor") = "" Session("sessModReferencia") = "" Session("sessModURL") = "" Session("sessModPalCve") = "" Session("sessModT0") = "" Session("sessModTn") = "" Session("sessModDT") = "" Response.Redirect("publicar.asp") %> <%@ LANGUAGE="VBSCRIPT"%> <% '******************************************************************* ' Página: publicar.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Parte todo el proceso de publicación en ' cuatro formas diferentes. La primera para subir ' el archivo con el modelo matemático, la segunda ' establece el perfil de tal modelo. La tercera y ' cuarta son similares, pero se refieren al archivo ' relacionado. El usuario solo puede efectuar el ' proceso de publicación cuando todas las formas ' hayan sido completadas correctamente ' Establece: Los valores actuales de las variables de sesión ' que están involucradas con la publicación - ' Se enlaza a publicar1.asp, publicar2.asp, publicar3.asp ' y publicar4.asp por cada paso de publicación '******************************************************************* dim strTemp %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Symweb ::Publicar Modelo::</title> <link rel="STYLESHEET" type="text/css" href="css/index.css"> <link rel="STYLESHEET" type="text/css" href="css/registro.css"> </head> <body bgcolor="#cccc99" leftmargin=0 topmargin=0 text="#000000"> <table height="100%" widht="100%" cellspacing="0" cellpadding="10" border=0> <td bgcolor="#333300" class="izquierda" valign="top"> <a href="index.asp"><img src="imagenes/index01.gif" width="139" height="140" border="0" alt="SymWeb Logo"></a> </td> <td class="derecha"> <h1>P u b l i c a c i ó n &nbsp;&nbsp;&nbsp;d e&nbsp;&nbsp;&nbsp;M o d e l o s</h1> Por favor complete el fomulario que se presenta a continuación. La información proporcionada será mostrada a los usuarios de la aplicación que seleccionen el modelo a publicar con efectos de simulación.<br><br> Al completar correctamente todos los pasos, la publicación procederá de manera automática.<br><br> 150
  • <font size=-1> <div class="comentario">&raquo; Para publicar siga y <strong>complete correctamente</strong> los siguentes pasos:<br><br> </div> </font> <br> <form name="pub1" action="publicar1.asp" enctype="multipart/form-data" method="post"> <div class=forma><br> 1. <strong>Colocación del archivo en el servidor</strong> <font size=-1><div class="comentario"> Haga clic en &laquo;Examinar&raquo; para seleccionar el archivo del modelo que desea publicar.<br> Recuerde que debe ser formato TXT basado en el estándar de escritura de ecuaciones para un archivo STM (HPS Stella).</div><br> </font> <% If Request.QueryString("strNoData")=9 Then strTemp = "<div class='error'>Error en la colocación de archivo</div><br>" Response.Write(strTemp) End If If Session("sessEdoPublic1") = "1" Then strTemp = "Nombre de Archivo: <font color=#ffffcc>" strTemp = strTemp & Session("sessArchTextoNombre") & "</font><br><br>" strTemp = strTemp & "Tamaño: <font color=#ffffcc>" strTemp = strTemp & Session("sessArchTextoTamano") & " K</font><br><br>" Else strTemp = "<input name='recArchivo' class='forma' type='file' size='17'>" & vbCrLf strTemp = strTemp & "<br><br>" & vbCrLf strTemp = strTemp & "<font size=-1><div class=comentario>Para publicar el modelo, éste debe estar colocado en el servidor para ser traducido a un formato adecuado para el web. Haga clic en el botón de abajo para proceder.</div></font><br><input name='subUpLoadFile' class='submit' type='submit' value='Colocar archivo en Servidor'><br><br>" & vbCrLf End If Response.Write(strTemp) %> </div> </form> <a name=pubPaso2></a> <br><br> <form name="pub2" action="publicar2.asp" method="post"> <div class=forma><br> 2. <strong>Perfil del Modelo</strong> <font size=-1><div class="comentario"> Los titulos con * indican que es obligatorio en el llenado de la forma.<br> Complete la siguiente información:.<br> <br></font> <% If Session("sessEdoPublic2") = "1" Then strTemp = "<div class='error'>Complete la información requerida</div><br>" Session("sessEdoPublic2") = "" Response.Write(strTemp) End If If Session("sessEdoPublic2") <> "2" Then strTemp = "* Título<br>" strTemp = strTemp & "<input type='text' name='recModTitulo' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessModTitulo") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Descripción del Modelo<br>" 151
  • strTemp = strTemp & "<input type='text' name='recModDescripcion' size='50' maxlength='100' class='forma' value='" strTemp = strTemp & Session("sessModDescripcion") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Autor coneptual del modelo (no publicista en SymWeb)<br>" strTemp = strTemp & "<input type='text' name='recModAutor' size='37' maxlength='35' class='forma' value='" strTemp = strTemp & Session("sessModAutor") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = " * Referencia del Modelo (e.g. Paper)<br>" strTemp = strTemp & " <input type='text' name='recModReferencia' size='50' maxlength='100' class='forma' value='" strTemp = strTemp & Session("sessModReferencia") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "URL donde se encuentre información del modelo (e.g. Página Web)<br>" strTemp = strTemp & "<input type='text' name='recModURL' size='50' maxlength='100' class='forma' value='" strTemp = strTemp & Session("sessModURL") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Palabra clave del modelo (para efectos de búsqueda interna)<br>" strTemp = strTemp & "<input type='text' name='recModPalCve' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessModPalCve") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Valor inicial t0<br>" strTemp = strTemp & "<input type='text' name='recModT0' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessModT0") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Valor final tn<br>" strTemp = strTemp & "<input type='text' name='recModTn' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessModTn") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Valor de incremento en el tiempo DT<br>" strTemp = strTemp & "<input type='text' name='recModDT' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessModDT") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "<input type='submit' name='subUpLoadData' class='submit' value='Registrar Información'><br><br></div>" Response.Write(strTemp) Else strTemp = "</div>Título del Modelo: <font color=#ffffcc>" strTemp = strTemp & Session("sessModTitulo") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Descripción: <font color=#ffffcc>" strTemp = strTemp & Session("sessModDescripcion") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Autor: <font color=#ffffcc>" strTemp = strTemp & Session("sessModAutor") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Referencia: <font color=#ffffcc>" strTemp = strTemp & Session("sessModReferencia") & "</font><br><br>" & vbCrLf & vbCrLf If Session("sessModURL") <> "" Then strTemp = strTemp & "URL: <font color=#ffffcc>" strTemp = strTemp & Session("sessModURL") & "</font><br><br>" & vbCrLf & vbCrLf End If strTemp = strTemp & "Palabra Clave: <font color=#ffffcc>" strTemp = strTemp & Session("sessModPalCve") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Tiempo Inicial: <font color=#ffffcc>" strTemp = strTemp & Session("sessModT0") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Tiempo Final: <font color=#ffffcc>" strTemp = strTemp & Session("sessModTn") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Incremento en el tiempo: <font color=#ffffcc>" strTemp = strTemp & Session("sessModDT") & "</font><br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) End If %> 152
  • </div></div> </form> <a name=pubPaso3></a> <br><br> <form name="pub3" action="publicar3.asp" enctype="multipart/form-data" method="post"> <div class=forma><br> 3. <strong>Colocación de archivo relacionado al modelo en servidor</strong> <font size=-1><div class="comentario"> Un archivo relacionado es un documento de texto, imagen, archivo postscript o de formato portable (pdf) en el que los usuarios del modelo se pueden apoyar ya que contiene una descripción u ayuda relevante sobre el modelo y sus características.<br> <br></font> <% If Request.QueryString("strNoData2")=9 Then strTemp = "<div class='error'>Error en la colocación de archivo</div><br>" Response.Write(strTemp) End If If Session("sessEdoPublic3") = "1" Then strTemp = "</div>Nombre de Archivo: <font color=#ffffcc>" strTemp = strTemp & Session("sessArchRelNombre") & "</font><br><br>" strTemp = strTemp & "Tamaño: <font color=#ffffcc>" strTemp = strTemp & Session("sessArchRelTamano") & " K</font><br><br>" Response.Write(strTemp) Else strTemp = "<input name='recArchivo' class='forma' type='file' size='17'>" & vbCrLf strTemp = strTemp & "<br><br>" & vbCrLf strTemp = strTemp & "</div></font><br><input name='subUpLoadFile' class='submit' type='submit' value='Colocar archivo en Servidor'><br><br>" & vbCrLf Response.Write(strTemp) End If %> </div></div> </form> <br><br> <a name=pubPaso4></a> <form name="pub4" action="publicar4.asp" method="post"> <div class=forma><br> 4. <strong>Perfil de archivo relacionado</strong> <font size=-1><div class="comentario"> Los titulos con * indican que es obligatorio en el llenado de la forma.<br> Complete la siguiente información:.<br> <br></font> <% If Session("sessEdoPublic4") = "1" Then strTemp = "<div class='error'>Complete la información requerida</div><br>" Session("sessEdoPublic2") = "" Response.Write(strTemp) End If If Session("sessEdoPublic4") <> "2" Then strTemp = "* Título<br>" strTemp = strTemp & "<input type='text' name='recRelTitulo' size='50' maxlength='65' class='forma' value='" strTemp = strTemp & Session("sessRelTitulo") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Descripción del contenido del Archivo<br>" strTemp = strTemp & "<input type='text' name='recRelDescripcion' size='50' maxlength='100' class='forma' value='" strTemp = strTemp & Session("sessRelDescripcion") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "* Palabra clave del archivo relacinoado (para efectos de búsqueda interna)<br>" strTemp = strTemp & "<input type='text' name='recRelPalCve' size='50' maxlength='65' class='forma' value='" 153
  • strTemp = strTemp & Session("sessRelPalCve") & "'><br><br>" & vbCrLF & vbCrLF Response.Write(strTemp) strTemp = "<input type='submit' name='subUpLoadData' class='submit' value='Registrar Información'><br><br></div>" Response.Write(strTemp) Else strTemp = "</div>Título del Modelo: <font color=#ffffcc>" strTemp = strTemp & Session("sessRelTitulo") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Descripción: <font color=#ffffcc>" strTemp = strTemp & Session("sessRelDescripcion") & "</font><br><br>" & vbCrLf & vbCrLf strTemp = strTemp & "Palabra Clave: <font color=#ffffcc>" strTemp = strTemp & Session("sessRelPalCve") & "</font><br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) End If %> </div></div> </form> <br> <form name="forma" action="publicar5.asp" method="post"> <input name="recEdoPublic1" type="hidden" value="<%Response.Write(Session("sessEdoPublic1"))%>"> <input name="recEdoPublic2" type="hidden" value="<%Response.Write(Session("sessEdoPublic2"))%>"> <input name="recEdoPublic3" type="hidden" value="<%Response.Write(Session("sessEdoPublic3"))%>"> <input name="recEdoPublic4" type="hidden" value="<%Response.Write(Session("sessEdoPublic4"))%>"> <% If Session("sessEdoPublic1") = "1" And Session("sessEdoPublic2") = "2" And Session("sessEdoPublic3") = "1" And Session("sessEdoPublic4") = "2" Then strTemp = "<img src='imagenes/check_icono.gif' width='10' height='10' border='0'>&nbsp;Listo para publicar." & vbCrLf strTemp = strTemp & "<input name='subEdosPublic' type='submit' class='submit' value='Publicar Modelo'>" Response.Write(strTemp) Else strTemp = "<img src='imagenes/mail_alerta.gif' width='14' height='12' border='0'>No se puede publicar porque no han sido completada toda la información." Response.Write(strTemp) End If %> </form> </td> </table> </body> </html> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: publicar1.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar.asp ' Entrada: Nada. Toma el valor de las variables de sesión 154
  • ' de la página previa ' Devuelve: strNoData - error en la publicación de archivo ' Redirecciona: publicar.asp ' Establece: El archivo en la carpeta de servidor llamada UpLoads ' Descripción: El usuario ya ha seleccionado el archivo de texto que ' desea subir, entonces el componente SmartUpload, lo ' guarda en la carpeta UpLoads '**************************************************************** Dim mySmartUpload Dim file Dim intCount Dim strNoData, strTemp intCount=0 Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") mySmartUpload.Upload strTemp = mySmartUpload.Files.Item(1).ContentType ' If strTemp <> "text/plain" Then ' Response.Redirect("publicar.asp?strNoData=8") ' End If If Not mySmartUpload.Files.Item(1).IsMissing Then mySmartUpload.Files.Item(1).SaveAs("/symweb/uploads/" & mySmartUpload.Files.Item(1).FileName) Session("sessArchTextoNombre") = mySmartUpload.Files.Item(1).FileName Session("sessArchTextoTamano") = mySmartUpload.Files.Item(1).Size Session("sessEdoPublic1") = "1" Response.Redirect("publicar.asp") Else Response.Redirect("publicar.asp?strNoData=9") End If %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: publicar2.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar.asp ' Entrada: Nada. Toma el valor de las variables de sesión ' de la página previa ' Devuelve: sessEdoPublic - indica que parte de la forma ' no ha sido completada ' Redirecciona: publicar.asp ' Establece: El nuevo valor de las variables de sesión que correpsonden ' al perfil del modelo que se desea publicar ' Descripción: Recibe los datos que conformarán el perfil del modelo a publicar ' y verifica que no se encuentre incompleta '**************************************************************** Dim strTemp Dim strNoData2 Session("sessModTitulo") = Request("recModTitulo") Session("sessModDescripcion") = Request("recModDescripcion") 155
  • Session("sessModAutor") = Request("recModAutor") Session("sessModReferencia") = Request("recModReferencia") Session("sessModURL") = Request("recModURL") Session("sessModPalCve") = Request("recModPalCve") Session("sessModT0") = Request("recModT0") Session("sessModTn") = Request("recModTn") Session("sessModDT") = cDbl(Request("recModDT")) 'Es necesesaria la conversión If Request("recModTitulo") = "" Or Request("recModDescripcion")="" Or Request("recModAutor")= "" Or Request("recModReferencia")= "" Or Request("recModPalCve")= "" Or Session("sessModT0")= "" Or Session("sessModTn") = "" Or Session("sessModDT") = "" Then Session("sessEdoPublic2") = "1" Response.Redirect("publicar.asp#pubPaso2") Else Session("sessEdoPublic2") = "2" Response.Redirect("publicar.asp") End If %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: publicar3.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar.asp ' Entrada: Nada. Toma el valor de las variables de sesión ' de la página previa ' Devuelve: strNoData - error en la publicación de archivo ' Redirecciona: publicar.asp ' Establece: El archivo en la carpeta de servidor llamada Relacionados ' Descripción: El usuario ya ha seleccionado el archivo relacionado que ' desea subir, entonces el componente SmartUpload, lo ' guarda en la carpeta Relacionado '**************************************************************** Dim mySmartUpload Dim file Dim intCount Dim strNoData, strTemp, strNoData2 intCount=0 Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") mySmartUpload.Upload strTemp = mySmartUpload.Files.Item(1).ContentType If Not mySmartUpload.Files.Item(1).IsMissing Then mySmartUpload.Files.Item(1).SaveAs("/symweb/relacionados/" & mySmartUpload.Files.Item(1).FileName) Session("sessArchRelNombre") = mySmartUpload.Files.Item(1).FileName Session("sessArchRelTamano") = mySmartUpload.Files.Item(1).Size Session("sessEdoPublic3") = "1" Response.Redirect("publicar.asp") 156
  • Else Response.Redirect("publicar.asp?strNoData2=9") End If %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: publicar4.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar.asp ' Entrada: Nada. Toma el valor de las variables de sesión ' de la página previa ' Devuelve: sessEdoPublic4 - información incompleta en la forma ' Redirecciona: publicar.asp ' Establece: El valor de las varaibles de sesión correspondientes ' al perfil del archivo asociado a modelo matemático ' Descripción: Los datos del perfil de archivo asociado llegan de la forma ' entonces se devuelve el valor de sessEdoPublic4 ' correspondiente '**************************************************************** Dim strTemp Dim strNoData2 Session("sessRelTitulo") = Request("recRelTitulo") Session("sessRelDescripcion") = Request("recRelDescripcion") Session("sessRelPalCve") = Request("recRelPalCve") If Request("recRelTitulo") = "" Or Request("recRelDescripcion")="" Or Request("recRelPalCve")= "" Then Session("sessEdoPublic4") = "1" Response.Redirect("publicar.asp#pubPaso4") Else Session("sessEdoPublic4") = "2" Response.Redirect("publicar.asp") End If %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: publicar5.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar.asp ' Entrada: Nada. ' Devuelve: Nada. ' Redirecciona: traduce.asp ' Establece: Valores a todas las variables de sesión que están ' involucradas con cada una de las formas de publicación ' Descripción: Tan solo indica que la publicación ha procedido bien en ' la subida de archivos y descripción de perfiles, para luego 157
  • ' redireccionar al proceso de traducción '**************************************************************** Dim FSO, oArchModelo Dim strNombreArchivo Session("sessEdoPublic1") = "1" Session("sessEdoPublic2") = "2" Session("sessEdoPublic3") = "1" Session("sessEdoPublic4") = "2" Response.Redirect("traduce.asp") %> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página-Función: traduce.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Precede de: publicar5.asp ' Entrada: Nada. ' Devuelve: Nada. ' Redirecciona: index.asp?strVariable=0&idModSeleccionado=0 ' Establece: Inicializa la variable de graficaicón strVariable ' y de modelo en simulación idModSeleccionado en ' Tiempo de ejecución ' Descripción: Toma toda la información de el proceso de publicación ' y abre el archivo de texto del modelo para producir un ' archivo de texto con la inicialización de las variables y ' un archivo ASP que contiene las iteraciones para simulación ' como lo indica el método de Euler. Por otra parte, hace un ' proceso de middleware, al generar automaticamente ' las instrucciones para la creación del archivo XML para ' graficación en tiempo de ejecución '**************************************************************** 'Es necesario solo en nombre del arhcivo para crear las instancias! dim strJustFileName dim strJustRelName Dim intIdModelo 'Para relacionar el ID del modelo con su archivo relacionado Response.Write(Session("sessArchTextoNombre") & "<br>") Response.Write(Session("sessArchRelNombre") & "<br>") strJustFileName = Split(Session("sessArchTextoNombre"), ".") strJustRelName = Split(Session("sessArchRelNombre"), ".") Response.Write(strJustFileName(0) & "<br>") Response.Write(strJustFileName(1) & "<br>") Response.Write(strJustRelName(0) & "<br>") Response.Write(strJustRelName(1) & "<br>") ' Variables de ruta de archivos dim strFileName dim strModInitName dim strModEcsName 158
  • ' Constantes de manejo de archivos const fsoForReading = 1 const fsoForWriting = 2 strFileName = "/symweb/uploads/" & Session("sessArchTextoNombre") strModInitName = "/symweb/modelos/" & strJustFileName(0) & "_init.txt" strModEcsName = "/symweb/modelos/" & strJustFileName(0) & "_sim.asp" Response.Write(strModInitName & "<br>") Response.Write(strModEcsName & "<br>") ' Declaración de variables respectivas al manejo de archivos y su contenido Dim objFSO, objTextStream, objEcuaciones, objVariables, objGraficables Dim itemEcuaciones, itemVariables, itemGraficables Dim strLinea, strSplitConIgual, strSplitConINIT, strSplitConEspacio, strSplitConMas Dim strSinDiferencial, strTemp, strTemp2, strTemp3 Dim intContEcuaciones, intContVariables, intContGraficables, intBandera, i ' Declaración de variables para el manejo de las tablas de la base de datos Dim intCont Dim oConexion, rsTabla Dim strSQL ' Instanciamiento de los objetos de Servidor de archivo y colecciones Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objEcuaciones = Server.CreateObject("Scripting.Dictionary") Set objVariables = Server.CreateObject("Scripting.Dictionary") Set objGraficables = Server.CreateObject("Scripting.Dictionary") ' Inicialización de contandores intContEcuaciones = 0 intContVariables = 0 intContGraficables = 0 intBandera = False ' No hemos llegado a la linea donde hay f(t) Response.Expires ' No te guardes en Caché If objFSO.FileExists(Server.MapPath(strFileName)) then Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName), fsoForReading) While Not objTextStream.AtEndOfLine strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") If inStr(strSplitConIgual(0), "(t)") Then 'Ya llegaste a las f(t)? intBandera = True objEcuaciones.Add intContEcuaciones, strSplitConIgual(0) intContEcuaciones = intContEcuaciones + 1 ' Hay que borrar el dt en el item impart! If inStr(strSplitConIgual(1), "+") Then strSplitConMas = Split(strSplitConIgual(1), "+") strSinDiferencial = Split(strSplitConMas(0), "(t - dt)") strTemp = strSinDiferencial(0) & "(t-1) + " strTemp = strTemp & strSplitConMas(1) objEcuaciones.Add intContEcuaciones, strTemp intContEcuaciones = intContEcuaciones + 1 Else objEcuaciones.Add intContEcuaciones, strSplitConIgual(1) intContEcuaciones = intContEcuaciones + 1 End If Elseif intBandera = False Then If inStr(strSplitConIgual(0), "INIT") Then strSplitConINIT = Split(strSplitConIgual(0), "INIT ") strSplitConEspacio = Split(strSplitConINIT(1)) 159
  • objGraficables.Add intContGraficables, strSplitConEspacio(0) intContGraficables = intContGraficables + 1 objGraficables.Add intContGraficables, strSplitConIgual(1) intContGraficables = intContGraficables + 1 Else objVariables.Add intContVariables, strSplitConIgual(0) intContVariables = intContVariables + 1 objVariables.Add intContVariables, strSplitConIgual(1) intContVariables = intContVariables + 1 End If Else objEcuaciones.Add intContEcuaciones, strSplitConIgual(0) intContEcuaciones = intContEcuaciones + 1 objEcuaciones.Add intContEcuaciones, strSplitConIgual(1) intContEcuaciones = intContEcuaciones + 1 End If Wend Set objTextStream = Nothing Else Response.Write strFileName & " no existe..." End If Set objFSO = Nothing itemVariables = objVariables.Items itemEcuaciones = objEcuaciones.Items itemGraficables = objGraficables.Items intCont = 0 strSIZE = 500 'Cota superior para las simulaciones. No es posible 'sobre pasar las 500 simulaciones para evitar desbordamientos 'o sobrecarga en servidor ' Creación del archivo de inicialización de variables Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strModInitName), fsoForWriting, True) objTextStream.WriteLine("t0 = " & Session("sessModT0")) objTextStream.WriteLine("tn = " & Session("sessModTn")) objTextStream.WriteLine("dt = " & Session("sessModDT")) objTextStream.WriteLine("@") For i = 0 to intContGraficables-1 Step 2 objTextStream.WriteLine(itemGraficables(i) & " = " & itemGraficables(i+1)) Next objTextStream.WriteLine("*") For i = 0 to intContVariables-1 Step 2 objTextStream.WriteLine(itemVariables(i) & " =" & itemVariables(i+1)) Next objTextStream.Close Set objFSO = Nothing ' Creación del archivo para la simulación de Euler Set objFSO = Server.CreateObject("Scripting.FileSystemObject") Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strModEcsName), fsoForWriting, True) objTextStream.WriteLine("<%") objTextStream.WriteLine("dim t0, tn, dt, t") objTextStream.WriteLine("dim strLabelEjeX(" & strSIZE & ")") objTextStream.WriteLine("dim intCiclos, intFcnsGraficables") objTextStream.WriteLine(vbCrLf) 'Dimensiona variables para el archivo de datos de graficacion objTextStream.WriteLine("'Declaración de variables de archivos y su contenido") objTextStream.WriteLine("Dim objFSO, objTextStream") objTextStream.WriteLine("Dim strFileName") objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("' Constantes de manejo de archivos") objTextStream.WriteLine("const fsoForReading = 1") objTextStream.WriteLine("const fsoForWriting = 2") objTextStream.WriteLine(vbCrLf) For i = 0 to intContVariables-1 Step 2 objTextStream.WriteLine("dim " & itemVariables(i)) 160
  • Next For i = 0 to intContGraficables-1 Step 2 objTextStream.WriteLine("dim " & itemGraficables(i) & "("& strSIZE &")") Next objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("'Calculo de los ciclos") objTextStream.WriteLine("t0 = " & "Request(""recT0"")") objTextStream.WriteLine("tn = " & "Request(""recTn"")") objTextStream.WriteLine("dt = " & "cDbl(Request(""recDt""))") objTextStream.WriteLine("intCiclos = Int((tn-t0)/dt)") objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("'Inicialización de Variables de Estado") For i = 0 to intContGraficables-1 Step 2 objTextStream.WriteLine(itemGraficables(i) & "(0) = " & "Request(""graficable" & i & """)") Next objTextStream.WriteLine("strLabelEjeX(0) = t0") objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("'Inicialización de Parametros") For i = 0 to intContVariables-1 Step 2 If IsNumeric(itemVariables(i+1)) = True Then objTextStream.WriteLine(itemVariables(i) & " = Request(""variable" & i & """)") Else objTextStream.WriteLine(itemVariables(i) & " = " & itemVariables(i+1)) End If Next objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("'Ciclos de Euler") objTextStream.WriteLine("for t = 1 to intCiclos") For i = 0 to intContEcuaciones-1 Step 2 objTextStream.WriteLine(" " & itemEcuaciones(i) & " =" & itemEcuaciones(i+1)) Next objTextStream.WriteLine(" " & "strLabelEjeX(t) = strLabelEjeX(t-1) + dt") objTextStream.WriteLine("Next") objTextStream.WriteLine(vbCrLf) ' Sección correspondiente a la creación del archivo de datos de graficación objTextStream.WriteLine("intFcnGraficables = " & intContGraficables/2) 'Realiza los archivos XML de datos para graficación objTextStream.WriteLine("' Sección de archivos XML para gráficación ") For i = 0 to intContGraficables/2 Step 2 objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("Set objFSO = Server.CreateObject(""Scripting.FileSystemObject"")") strTemp = """" & "/symweb/graficas/" & strJustFileName(0) & "_" & itemGraficables(i) & "_graf.xml" & """" objTextStream.WriteLine("strFileName = " & strTemp) objTextStream.WriteLine("Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName), fsoForWriting, True)") strTemp = "<graph type=""""4"""" bgColor=""""999966""""" strTemp = strTemp & " xaxisname=""""Tiempo""""" strTemp = strTemp & " yaxisname=""""" & itemGraficables(i) & """"""" & """ strTemp = strTemp & " yaxisminvalue=""""0""""" strTemp2 = " & " & itemGraficables(i) & "(intCiclos)*2 & " '2o elemento strTemp = strTemp & " yaxismaxvalue=""""" & """" & strTemp2 & """" & """""" strTemp = strTemp & " captionbgcolor=""""FFFFFF""""" strTemp = strTemp & " canvasbgcolor=""""CCCC99""""" strTemp = strTemp & " canvasbrdrcolor=""""CCCC99""""" strTemp = strTemp & " shownames=""""0""""" strTemp = strTemp & " showvalues=""""0""""" strTemp = strTemp & " showovercap=""""1""""" & ">" objTextStream.WriteLine(" objTextStream.WriteLine("""& strTemp &""")") objTextStream.WriteLine("for t= 0 to intCiclos") strTemp = " <set name=""""" strTemp2 = " & strLabelEjeX(t) & " 'Etiqueta de para el tiempo t strTemp = strTemp & """" & strTemp2 & """" & """"" value=""""" strTemp3 = " & " & itemGraficables(i) & "(t) & " strTemp = strTemp & """" & strTemp3 & """" & """"" color=""""FF0000"""" />" objTextStream.WriteLine(" objTextStream.WriteLine(""" & strTemp & """)") objTextStream.WriteLine("Next") 161
  • strTemp = "</graph>" objTextStream.WriteLine(" objTextStream.WriteLine(""" & strTemp & """)") objTextStream.WriteLine(" objTextStream.Close") objTextStream.WriteLine(vbCrLf) Next objTextStream.WriteLine("Set objTextStream = Nothing") objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine("strTemp = ""../modelo.asp?strVariable=0&idModSeleccionado=""") objTextStream.WriteLine("strTemp = strTemp & Request.QueryString(""idModSeleccionado"")") objTextStream.WriteLine("strTemp = strTemp & "" """) objTextStream.WriteLine("Response.Redirect(strTemp)") '****************************************************** objTextStream.WriteLine(vbCrLf) objTextStream.WriteLine(Chr(37) & Chr(62)) objTextStream.Close Set objFSO = Nothing '***************** El registro del modelo en la BD!!!! ************************** ' Instanciamiento de los objetos ADO de Base de Datos Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") strSQL = "SELECT * FROM modelo WHERE archivo = '"& strJustFileName(0) &"'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion, 2, 3, 1 If rsTabla.EOF Then rsTabla.AddNew rsTabla("archivo") = strJustFileName(0) rsTabla("titulo") = Session("sessModTitulo") rsTabla("descripcion") = Session("sessModDescripcion") rsTabla("autor") = Session("sessModAutor") rsTabla("referencia") = Session("sessModReferencia") rsTabla("url") = Session("sessModURL") rsTabla("palabras_cve") = Session("sessModPalCve") rsTabla("fecha_publicacion") = Date rsTabla("numero_ecuaciones") = intContEcuaciones rsTabla("fcns_graficables") = intContGraficables/2 'Variables con INIT rsTabla("t_inicial") = Session("sessModT0") rsTabla("t_final") = Session("sessModTn") rsTabla("dt") = Session("sessModDT") rsTabla.Update End If rsTabla.Close oConexion.Close strSQL = "SELECT * FROM modelo WHERE archivo = '"& strJustFileName(0) &"'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion intIdModelo = rsTabla.Fields("idmod") rsTabla.Close oConexion.Close '***************** El registro del rel en la BD!!!! ************************** strSQL = "SELECT * FROM relacionado WHERE nomarch = '"& Session("sessArchRelNombre") &"'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion, 2, 3, 1 162
  • If rsTabla.EOF Then rsTabla.AddNew rsTabla("nomarch") = Session("sessArchRelNombre") rsTabla("tituloarch") = Session("sessRelTitulo") rsTabla("descriparch") = Session("sessRelDescripcion") rsTabla("palabras_cve") = Session("sessRelPalCve") rsTabla("tamano") = Session("sessArchRelTamano") rsTabla("idmod") = intIdModelo rsTabla.Update End If rsTabla.Close oConexion.Close Set rsTabla = Nothing Set oConexion = Nothing Response.Redirect("index.asp?idModSeleccionado=0&strVariable=0") %> <%@ LANGUAGE="VBSCRIPT"%> <% '******************************************************************* ' Página: ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Muestra a un usuario administrador el nombre ' y apellido de todos los usuarios, junto con ' permiso (registrado o publicista) para ' cambiarselos, así como el correo. Con esto ' se le da permiso a un usuario de publicar ' modelos en SymWeb ' Establece: Variables de sesión correspondientes a cada ' uno de los campos de los diferentes perfiles ' de usuario (no todos los campos) ' Enlaza a admin.asp '******************************************************************* Dim oConexion, rsTabla Dim strSQL Dim srtTemp Dim intCont, intContUsr Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") strSQL = "SELECT * FROM usuario WHERE usuario.permiso <> 'a'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> 163
  • <title>Symweb ::Registro de Usuario::</title> <link rel="STYLESHEET" type="text/css" href="css/index.css"> <link rel="STYLESHEET" type="text/css" href="css/registro.css"> </head> <body bgcolor="#cccc99" leftmargin=0 topmargin=0 text="#000000"> <table height="100%" widht="100%" cellspacing="0" cellpadding="10" border=0> <td bgcolor="#333300" class="izquierda" valign="top"> <a href="JavaScript:history.back()"><img src="imagenes/index01.gif" width="139" height="140" border="0" alt="SymWeb Logo"></a> </td> <td class="derecha"> <h1>R e g i s t r o &nbsp;&nbsp;&nbsp;d e&nbsp;&nbsp;&nbsp;U s u a r i o</h1> En esta sección es posible habilitar la función de publicación en los usuarios de la aplicación<br><br> <font size=-1> <div class="comentario">&raquo; Seleccione la casilla del usuario o usuarios a los que desee cambiar el permiso<br><br> &raquo; Asegúrese de haber seleccionado a los usuarios indicados </div> </font> <br> <form action="admin.asp" method="post"> <center> <table class="usrs" width="60%" cellpadding=3 cellspacing=0> <tr class="titulo"> <td>Cambiar Permiso</td> <td>Nombre de Usuario</td> <td>Tipo de Permiso</td> <td>Email</td> </tr> <% intCont = 1 While Not rsTabla.EOF strTemp = "<tr class='" If intCont mod 2 = 0 Then strTemp = strTemp & "par" Else strTemp = strTemp & "impar" End If strTemp = strTemp & "'><td><input name='" strTemp = strTemp & rsTabla.Fields("login") & "' " strTemp = strTemp & "type='checkbox' ></td>" & vbCrLf strTemp = strTemp & "<td>" strTemp = strTemp & rsTabla.Fields("nombre") strTemp = strTemp & " " & rsTabla.Fields("apellido") strTemp = strTemp & "</td>" & vbCrLf strTemp = strTemp & "<td>" If rsTabla.Fields("permiso") = "r" Then strTemp = strTemp & "registrado</td>" & vbCrLf Else strTemp = strTemp & "publicista</td>" & vbCrLf End If strTemp = strTemp & "<td><a href='mailto:" strTemp = strTemp & rsTabla.Fields("email") strTemp = strTemp & "' class='usrs'>" strTemp = strTemp & rsTabla.Fields("email") strTemp = strTemp & "</td></tr>" & vbCrLf & vbCrLf Response.Write(strTemp) rsTabla.MoveNext 164
  • intCont = intCont + 1 Wend %> </table><br> <input type="submit" class="submit" value="Cambiar permisos"> </center> </form> </td> </table> </body> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE="VBSCRIPT" %> <% '******************************************************************* ' Página: modelo.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Se presenta al usuario la lista de modelos ' que se han publicado en SymWeb y luego procede ' a seleccionar uno para hacerle un ajuste en ' en sus parámetros y simular ' Establece: El valor de la variable idModSeleccionado ' la cual llega con 0 por defecto al inciar la ' sesión '******************************************************************* ' Variables de objeto y cadena para tablas en BD If Session("sessUsrNombre") = "" Then Response.Redirect("index_gnal.asp") End If Dim oConexion, rsTabla Dim strSQL Dim srtTemp ' Variables de objeto y cadena para archivo Dim objFSO Dim objTextStream Dim strFileName Dim strLinea Dim strSplitConIgual Dim i ' Constantes de manejo de archivos const fsoForReading = 1 const fsoForWriting = 2 'Instanciamiento de objetos de conexión y tabla Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") %> <html> <head> <title>Symweb ::Principal::</title> 165
  • <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0 style="font-family: Verdana, Arial, Helvetica;"> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="333300" class="barra_superior"> <td> <img src="imagenes/logo_chico.gif" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="8"> <br> Usuario: <font color="White"><% Response.Write(Session("sessUsrNombre") & " " & Session("sessUsrApellido")) %></font><br> Categoría de Usuario: <font color="White"><% Response.Write(Session("sessUsrPermiso"))%></font><br> <br><br> Modelo en Uso: <font color="White"> <% If Request.QueryString("idModSeleccionado")<>0 Then strSQL = "SELECT titulo FROM modelo WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion Session("sessUsrModelo") = rsTabla.Fields("titulo") Response.Write(Session("sessUsrModelo")) rsTabla.Close oConexion.Close Else Response.Write(Session("sessUsrModelo")) End If %> </font> <br><br><br> </td> <td align="center"> <div align="right"> <form name="frmBuscar" action="buscar.asp" method="post"> <font color="#cccc99">Escriba una palabra<br></font> <img src="imagenes/buscar.gif" width="20" height="17" alt="" border="0"> <input type="text" name="buscar" size="15" class="buscar_texto" value=""> <br> <input type="submit" class="buscar_submit" value="Buscar"> </form> </div> </td> <td align="center"> <a href="cerrar_sesion.asp" class="logout" title="Abandonar el sitio de SyMWeb"> <img src="imagenes/cerrar_sesion.gif" width="25" height="25" alt="Botón: Cerrar Sesión" border="0"><br> <font color="#ffffcc">Cerrar<br> Sesión</font></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> 166
  • <td bgcolor="#999966" class="etiqueta1_inactiva_izq">&nbsp;</td> <td bgcolor="#999966" class="inactiva_int" > <% strTemp = "<a href=""index.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Regresar a la página principal y registrarse'" strTemp = strTemp & ">Principal</a>" Response.Write(strTemp) %> </td> <td class="activa_izq">&nbsp;</td> <td class="activa_int">Modelos</td> <td class="activa_der">&nbsp;</td> <td class="inactiva_int"> <% strTemp = "<a href=""graficar.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Gráficar los resultados del modelo'" strTemp = strTemp & ">Graficador</a>" Response.Write(strTemp) %> </td> <td class="etiquetan_inactiva_der">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" width="16%">&nbsp;</td> <td class="borde_sup" colspan="3">&nbsp;</td> </tr> </table> <!-- Tabla de Contenido --> <table class="contenido" width=100% cellpadding=0 cellspacing=10 border=0 height="70%"> <tr> <td width="17%" valign="top"> <h5>Modelos Publicados</h5> <% strSQL = "SELECT * FROM modelo" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion While Not rsTabla.EOF strTemp = "<li><a class='link' href='modelo.asp?idModSeleccionado=" strTemp = strTemp & rsTabla.Fields("idmod") strTemp = strTemp & "&strVariable=" & Request.QueryString("strVariable") strTemp = strTemp & "'>" strTemp = strTemp & rsTabla.Fields("titulo") & "</a></li><br><br>" Response.Write(strTemp) rsTabla.MoveNext Wend 167
  • rsTabla.Close oConexion.Close %> </td> <td class="separador" width="1"></td> <td valign="top" class="modelos"> <div class="identado"> <% ' Advertencia de lógica: idModSeleccionado es auto dimensionado If Request.QueryString("idModSeleccionado")=0 Then strTemp = "<div class='variable'>" & Session("sessUsrModelo") strTemp = strTemp & "</div>" Response.Write(strTemp) Else strSQL = "SELECT * FROM modelo WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strTemp = "<form name='forma' action='modelos/" strTemp = strTemp & rsTabla.Fields("archivo") & "_sim.asp" strTemp = strTemp & "' method='get'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) strTemp = "<input type='hidden' name='idModSeleccionado' value='" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & "'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) strTemp = "<input type='hidden' name='strVariable' value='0'>" strTemp = strTemp & vbCrLf Response.Write(strTemp) Session("sessUsrModelo") = rsTabla.Fields("titulo") strFileName = "/symweb/modelos/" & rsTabla("archivo") & "_init.txt" strTemp = "<font color=#990000>Titulo: </font>" strTemp = strTemp & rsTabla.Fields("titulo") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Descripción: </font>" strTemp = strTemp & rsTabla.Fields("descripcion") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Autor: </font>" strTemp = strTemp & rsTabla.Fields("autor") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Referencia: </font>" strTemp = strTemp & rsTabla.Fields("referencia") & vbCrLf strTemp = strTemp & "<br><font color=#990000>URL: </font>" If rsTabla.Fields("url")= "" Then strTemp = strTemp & "No existe ningun recurso en Internet asociado a este modelo" & vbCrLf Else strTemp = strTemp & "<a href='" strTemp = strTemp & rsTabla.Fields("url") & "' target='RefMod'" strTemp = strTemp & "class='link'>" strTemp = strTemp & rsTabla.Fields("url") & vbCrLf strTemp = strTemp & "</a>" End If strTemp = strTemp & "<br><font color=#990000>Fecha de Publicación: </font>" 168
  • strTemp = strTemp & rsTabla.Fields("fecha_publicacion") & vbCrLf Response.Write(strTemp) rsTabla.Close oConexion.Close ' Y volvemos a abrir para la tabla de archivos relacionados strSQL = "SELECT * FROM relacionado WHERE idmod = " & Request.QueryString("idModSeleccionado") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strTemp = "<br><br><font color=#990000>Archivo Relacionado: </font>" strTemp = strTemp & "<a href='relacionados/" strTemp = strTemp & rsTabla.Fields("nomarch") strTemp = strTemp & "' target='usrArchRel' class='link'>" strTemp = strTemp & rsTabla.Fields("nomarch") & "</a>" & vbCrLf strTemp = strTemp & "<br><font color=#990000>Titulo: </font>" strTemp = strTemp & rsTabla.Fields("tituloarch") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Descripción: </font>" strTemp = strTemp & rsTabla.Fields("descriparch") & vbCrLf strTemp = strTemp & "<br><font color=#990000>Tamaño: </font>" strTemp = strTemp & rsTabla.Fields("tamano") & " Kb" & vbCrLf Response.Write(strTemp) rsTabla.Close oConexion.Close Set objFSO = Server.CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(Server.MapPath(strFileName)) Then Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName),fsoForReading) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "<div class='variable'><br>Variables de Simulación</div><br>" & vbCrLf strTemp = strTemp & "<div class='identado'>" & vbCrLf strTemp = strTemp & "Tiempo Inicial (t0) &nbsp;&nbsp;" strTemp = strTemp & "<input type='text' name='recT0' value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "Tiempo Final (tn) &nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name='recTn'value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") strTemp = "Incremento en el tiempo (dt) &nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name='recDt' value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "</div><br>" Response.Write(strTemp) 169
  • strTemp = "<div class='variable'>Variables de Estado</div><br>" & vbCrLf Response.Write(strTemp) Response.Flush strLinea = objTextStream.ReadLine strLinea = objTextStream.ReadLine strTemp = "<div class='identado'>" & vbCrLf Response.Write(strTemp) i=0 'Para inidizar los nombres de los input textbox While strComp(strLinea, "*")<>0 strSplitConIgual = Split(strLinea, "=") strTemp = strSplitConIgual(0) &"&nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name=graficable" strTemp = strTemp & i strTemp = strTemp & " value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) i=i+2 'Porque en la traducción se hizo módulo 2 debido ' al = strLinea = objTextStream.ReadLine Wend strTemp = "</div><br>" Response.Write(strTemp) strTemp = "<div class='variable'>Parámetros y ecuaciones relacionadas</div><br>" & vbCrLf Response.Write(strTemp) strTemp = "<div class='identado'>" & vbCrLf Response.Write(strTemp) i=0 'Para inidizar los nombres de los input textbox While Not objTextStream.AtEndOfLine strLinea = objTextStream.ReadLine strSplitConIgual = Split(strLinea, "=") If IsNumeric(strSplitConIgual(1)) Then strTemp = strSplitConIgual(0) &"&nbsp;&nbsp;" & vbCrLf strTemp = strTemp & "<input type='text' name=variable" strTemp = strTemp & i strTemp = strTemp & " value=" strTemp = strTemp & strSplitConIgual(1) & " size='5'>" strTemp = strTemp & "<br><br>" & vbCrLf & vbCrLf Response.Write(strTemp) i=i+2 'Porque en la traducción se hizo ' módulo 2 debido al = Else Response.Write(strLinea & "<br>" & vbCrLf) End If Wend strTemp = "</div>" & vbCrLf Response.Write(strTemp) strTemp = vbCrLf & "<p><img src='imagenes/mail_alerta.gif' width=14 height=12 border=0>" 170
  • strTemp = strTemp & "&nbsp;&nbsp;" strTemp = strTemp & "<input type='submit' value='Simular' class='submit'>" strTemp = strTemp & vbCrLf & "</form>" Response.Write(strTemp) Else strTemp = "<p><p><div class='variable'>Ha ocurrido un error fatal!</div>" Response.Write(strTemp) End If End If 'Fin si ningun modelo ha sido seleccionado Set rsTabla = Nothing Set oConexion = Nothing Response.Flush %> </div> </td> </tr> </table> <!-- Fin tabla de contenido --> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE = "VBSCRIPT" %> <% '******************************************************************* ' Página: graficar.asp ' Autor: Omar Sosa Tzec ' Fecha: Julio de 2002 ' Descripción: Es la página donde el usuario puede ' graficar los resultados de la simulación ' Establece: Nada. Se enlaza a index.asp y modelo.asp '******************************************************************* If Session("sessUsrNombre") = "" Then Response.Redirect("index_gnal.asp") End If ' Variables de objeto y cadena para tablas en BD Dim oConexion, rsTabla Dim strSQL Dim srtTemp ' Variables de objeto y cadena para archivo Dim objFSO Dim objTextStream Dim strFileName Dim strFileCopyName Dim strModName Dim strLinea Dim strSplitConIgual Dim i ' Constantes de manejo de archivos 171
  • const fsoForReading = 1 const fsoForWriting = 2 const fsoForAppending = 8 %> <html> <head> <title>Symweb ::Principal::</title> <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0 style="font-family: Verdana, Arial, Helvetica;"> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="333300" class="barra_superior"> <td> <img src="imagenes/logo_chico.gif" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="8"> <br> Usuario: <font color="White"><% Response.Write(Session("sessUsrNombre") & " " & Session("sessUsrApellido")) %></font><br> Categoría de Usuario: <font color="White"><% Response.Write(Session("sessUsrPermiso"))%></font><br> <br><br> Modelo en Uso: <font color="White"><% Response.Write(Session("sessUsrModelo")) %></font> <br><br><br> </td> <td align="center"> <div align="right"> <form name="frmBuscar" action="buscar.asp" method="post"> <font color="#cccc99">Escriba una palabra<br></font> <img src="imagenes/buscar.gif" width="20" height="17" alt="" border="0"> <input type="text" name="buscar" size="15" class="buscar_texto" value=""> <br> <input type="submit" class="buscar_submit" value="Buscar"> </form> </div> </td> <td align="center"> <a href="cerrar_sesion.asp" class="logout" title="Abandonar el sitio de SyMWeb"> <img src="imagenes/cerrar_sesion.gif" width="25" height="25" alt="Botón: Cerrar Sesión" border="0"><br> <font color="#ffffcc">Cerrar<br> Sesión</font></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> <td bgcolor="#999966" class="etiqueta1_inactiva_izq">&nbsp;</td> <td bgcolor="#999966" class="inactiva_int" > <% strTemp = "<a href=""index.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" 172
  • strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Regresar a la página principal y registrarse'" strTemp = strTemp & ">Principal</a>" Response.Write(strTemp) %> </td> <td class="inactiva_der">&nbsp;</td> <td class="inactiva_int"> <% strTemp = "<a href=""modelo.asp?strVariable=" strTemp = strTemp & Request.QueryString("strVariable") strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & """ class='inactiva' title='Selección de modelo a simular'" strTemp = strTemp & ">Modelos</a>" Response.Write(strTemp) %> </td> <td class="activa_izq">&nbsp;</td> <td class="activa_int">Gráficador</td> <td class="etiquetan_activa_der">&nbsp;</td> <td class="borde_sup" width="12%">&nbsp;</td> <td class="borde_sup" width="17%">&nbsp;</td> <td class="borde_sup" colspan="3">&nbsp;</td> </tr> </table> <!-- Tabla de Contenido --> <table class="contenido" width=100% cellpadding=0 cellspacing=10 border=0 height="70%"> <tr> <td width="25%" valign="top"> <% If Request.QueryString("idModSeleccionado")=0 Then strTemp = "<div class='variable'>" & Session("sessUsrModelo") strTemp = strTemp & "</div>" Response.Write(strTemp) Else strTemp = "<div class='variable'>" strTemp = strTemp & "Seleccione una variable de estado para graficar" strTemp = strTemp & "<br><br></div><div class='identado'>" Response.Write(strTemp & vbCrLf) Response.Flush strSQL = "SELECT * FROM modelo WHERE idmod = " & Request.QueryString("idModSeleccionado") Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strFileName = "/symweb/modelos/" & rsTabla.Fields("archivo") & "_init.txt" strModName = rsTabla.Fields("archivo") rsTabla.Close oConexion.Close Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 173
  • If objFSO.FileExists(Server.MapPath(strFileName)) Then Set objTextStream = objFSO.OpenTextFile(Server.MapPath(strFileName),fsoForReading) strLinea = objTextStream.ReadLine ' Bríncate las variables iniciales! While inStr(strLinea, "@") = False strLinea = objTextStream.ReadLine Wend strLinea = objTextStream.ReadLine ' Lee solo las variables de Estado While InStr(strLinea, "*") = False strSplitConIgual = split(strLinea, " = ") strTemp = "<a href='graficar.asp?strVariable=" strTemp = strTemp & strSplitConIgual(0) strTemp = strTemp & "&idModSeleccionado=" strTemp = strTemp & Request.QueryString("idModSeleccionado") strTemp = strTemp & "' class='link'>" strTemp = strTemp & strSplitConIgual(0) & "</a><br><br>" Response.Write(strTemp & vbCrLf) strLinea = objTextStream.ReadLine Wend Else Reponse.Write("Error Fatal!") End If strTemp = "</div>" Response.Write(strTemp) objTextStream.Close Response.Flush End If %> </td> <td class="separador" width="1"></td> <td valign="top" class="modelos"> <strong>Gráfica</strong><p> <% If Request.QueryString("strVariable") = "0" Then strTemp = "<div class='variable'>" strTemp = strTemp & "No puede accederse a la gráfica por alguna de las siguientes razones:<br>" strTemp = strTemp & "</div><div class='identado'>" strTemp = strTemp & "&raquo; No efectuado la simulación de un modelo - Regrese a la sección de modelos y seleccione uno <br><br>" strTemp = strTemp & "&raquo; Acaba de realizar una simulación con nuevos parámetros - Seleccione ahora la variable que desea graficar <br><br>" strTemp = strTemp & "</div>" Response.Write(strTemp) Else strFileName = "/symweb/graficas/" & strModName & "_" strFileName = strFileName & Request.QueryString("strVariable") strFileName = strFileName & "_graf.xml" strFileCopyName = "/symweb/" & strModName & "_" strFileCopyName = strFileCopyName & Request.QueryString("strVariable") strFileCopyName = strFileCopyName & "_graf.xml" If objFSO.FileExists(Server.MapPath(strFileName)) Then objFSO.CopyFile Server.MapPath(strFileName), Server.MapPath(strFileCopyName) strTemp = strModName & "_" & Request.QueryString("strVariable") & "_graf.xml" %> <OBJECT classid='clsid:D27CDB6E-AE6d-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0' WIDTH=550 HEIGHT=400> <PARAM NAME=movie VALUE='fXgraph.swf?dataurl=<%Response.Write(strTemp)%>'> <PARAM NAME=quality VALUE=high> 174
  • <EMBED src='fXgraph.swf?dataurl=<%Response.Write(strTemp)%>' quality=high bgcolor=#99CCFF WIDTH=500 HEIGHT=400 TYPE='application/x-shockwave-flash' PLUGINSPAGE='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'> </EMBED> </OBJECT> <% Else Response.Write("Error Fatal!") End If End If Set objFSO = Nothing %> </td> </tr> </table> <!-- Fin tabla de Contenido --> </html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ LANGUAGE="VBSCRIPT" %> <% Dim oConexion, rsTabla Dim strSQL Dim srtTemp Set oConexion = Server.CreateObject("ADODB.Connection") Set rsTabla = Server.CreateObject("ADODB.Recordset") Set rsTabla2 = Server.CreateObject("ADODB.Recordset") If Request("buscar") = "" Then Response.Redirect("index.asp") End If strSQL = "SELECT * FROM modelo WHERE palabras_cve LIKE '%" & Request("buscar") & "%'" oConexion.Open "db_symweb1" rsTabla.Open strSQL, oConexion strSQL = "SELECT * FROM relacionado WHERE palabras_cve LIKE '%" & Request("buscar") & "%'" rsTabla2.Open strSQL, oConexion %> <html> <head> <title>Buscar - Symweb </title> <link rel="STYLESHEET" type="text/css" href="css/contenido.css"> <link rel="STYLESHEET" type="text/css" href="css/etiqueta.css"> </head> <body bgcolor="#999966" leftmargin=0 topmargin=0> <table cellspacing=0 width="100%" border=0 cellpadding=0> <tr bgcolor="#333300" class="barra_superior"> <td> 175
  • <img src="imagenes/logo_chico.gif" width="71" height="67" alt="Logo: Simulación y Modelaje vía Web de la UADY" border="0"> </td> <td colspan="4"> <font color="#ffffcc"> <% If rsTabla.EOF And rsTabla2.EOF Then strTemp = Session("sessUsrNombre") & ": <font color=White> No se encontraron registros relacionados con la palabra </font>" strTemp = strTemp & Request("buscar") Response.Write(strTemp) Else strTemp = Session("sessUsrNombre") & ": <font color=White> Se encontraron los siguientes registros relacionados con la palabra </font>" strTemp = strTemp & Request("buscar") Response.Write(strTemp) End If %> </font><br><br> </td> <td align="center"> <a href="index.asp?strVariable=0&idModSeleccionado=0" class="logout" title="Regresar a Principal"> <img src="imagenes/volver_principal.gif" width="25" height="25" border="0"><br> <font color="#ffffcc">Volver a<br> Principal</font></a> </td> <td align="center"> <a href="" class="logout" title="Abandonar el sitio de SyMWeb"> <img src="imagenes/cerrar_sesion.gif" width="25" height="25" alt="Botón: Cerrar Sesión" border="0"><br> <font color="#ffffcc">Cerrar<br> Sesión</font></a> </td> </tr> <tr bgcolor="#666600" class="barra_etiquetas"> <td class="borde_sup" width="70">&nbsp;</td> <td class="etiqueta1_activa_izq" width="10">&nbsp;</td> <td class="activa_int" width="11%">Buscar</td> <td class="etiquetan_activa_der">&nbsp;</td> <td class="borde_sup" width="70%">&nbsp;</td> <td class="borde_sup" width="10%">&nbsp;</td> <td class="borde_sup" width="30%">&nbsp;</td> </tr> </table> <table class="contenido" width=100% cellpadding=0 cellspacing=10 border=0 height="70%"> <tr> <td width="20%" valign="top"> <div>Realizr otra búsqueda...<br> <div align="right"> <form name="frmBuscar" action="buscar.asp" method="post"> <input type="text" name="buscar" size="15" class="buscar_texto" value=""> <br> <input type="submit" class="buscar_submit" value="Buscar"> 176
  • </form> </div> </div> <br><br><br> </td> <td class="separador" width="1"></td> <td valign="top" class="modelos"> <h5>Resultados</h5> <div class="identado"> <% While Not rsTabla.EOF strTemp = "<div class='variable'><a href='modelo.asp?strVariable=0&idModSeleccionado=" strTemp = strTemp & rsTabla.Fields("idmod") strTemp = strTemp & "' class='link'>" strTemp = strTemp & rsTabla.Fields("titulo") & "</a></div>" strTemp = strTemp & rsTabla.Fields("descripcion") & "<br>" strTemp = strTemp & "<font color=#996666>Referencia: </font>" strTemp = strTemp & rsTabla.Fields("referencia") strTemp = strTemp & "<br><br>" Response.Write(strTemp) rsTabla.MoveNext Wend %> <% rsTabla.Close While Not rsTabla2.EOF strTemp = "<div class='variable'>" strTemp = strTemp & "<a href='/symweb/relacionados/" strTemp = strTemp & rsTabla2.Fields("nomarch") & "' class='link' target='usrX'>" strTemp = strTemp & rsTabla2.Fields("tituloarch") & "</a><br>" strTemp = strTemp & rsTabla2.Fields("descriparch") & "<br>" strTemp = strTemp & "<font color=#996666>Tamaño: </font>" strTemp = strTemp & rsTabla2.Fields("tamano") strTemp = strTemp & "Kb. <br><br>" Response.Write(strTemp) rsTabla2.MoveNext Wend rsTabla2.Close %> </div> </td> </tr> </table> <!-- Fin tabla de contenido --> </body> </html> 177
  • 178
  • Amico, Vince, et al. (1997). “Critical Issues in Simulation”. In Press. Arsham, Hossein (2002). Systems Simulation: The Shortest Path from Learning to Applications. URL: http://ubmail.ubalt.edu/~harsham/simulation/sim.htm Box, George E. P., et al. (1999). Introducción al diseño de experimentos, análisis de datos y construcción de modelos. Reverté Ediciones. México. Baldwin, L.R. (1995). “Modeling Ruminant Digestion and Metabolism”. Chapman and Hall England. In Press. Chí, Martín (2000). “Introducción a la Simulación”. Simulación. Materiales de Clase. Facultad de Matemáicas. UADY. URL: http://www.uady.mx/sitios/matemati/enlinea/simula/materiales/Unidad1-J7Sep00.html. Dijkstra, Edsger (1976). “A Discipline of Programming”. Prentice-Hall, Englewood Cliffs, NJ. USA. Dijkstra, Jan (1992). Journal of Nutrition 122. pp 2239-2256. In Press. DMSO: Defense Modeling and Simulation Office of the Department of Defense of USA (2002). URL: https://www.dmso.mil DoD: Department of Defense of USA (1998). “High Level Architecture Run-Time Infrastructure Programmers Guide Version 1.3”. In Press. Dondis, D. A. (1973). La sintaxis de la imagen. Introducción al alfabeto visual. Ediciones G. Gili S.A. de C.V. (GG Diseño). México. Fishwick, Paul A. (1995). “Computer Simulation: The Art and Science of Digital World Construction”. URL: http://www.cise.ufl.edu/~fishwick/introsim/paper.html Fishwick, Paul A. (1996). “Web-Based Simulation: Some Personal Observations”. In 1996 Winter Simulation Conference, December, San Diego, CA, pp. 772-779. Fraternali, Piero (1999). “Tools and Aproaches for Developing Data-Intensive Web Applications: A Survey”. In ACM Computing Survey, Vol. 31, No. 3, September 1999. Heylighen, F. (2000). "Web Dictionary of Cybernetics and Systems”. Principia Cybernetica Web. URL : http://pespmc1.vub.ac.be/ASC/indexASC.html HPS, Inc. (2002). Stella VI. URL : http://www.hps-inc.com/ 179
  • InfoSoft (2002). FXgraph 4.0. http://www.infosoftglobal.com/fXgraph INT, Media Group. (2002). Webopedia : Online Dictionary for Computer and Internet Terms. URL : http://www.webopedia.com Isakowitz, et al. (1995). “RMM : A methodology for structured hypermedia design”. Communications of ACM. August 1995. Vol. 38, No. 8. pp 34-44. Kuljis, Jasna et al. (2000). A Review of Web Based Simulation : Whither we wander ? Proceedings of the 2000 Winter Simulation Conference. pp. 1872-1881. Java Soft, Inc. (2002). The Remote Method Invocation (RMI). URL : http://java.sun.com/products/jdk/rmi/ Mathworks, Inc. (2002). MathLab 6.1 Website. URL: http://www.mathworks.com/products/matlab/ Microsoft, Inc. (2002a). Creating ActiveX Components. Microsoft Developers Network. URL : http://msdn.microsoft.com/library/default.asp?url=/library/en- us/vbcon98/html/vbconcreatingolecomponents.asp Microsoft, Inc. (2002b). Microsoft COM Specification. URL : http://www.microsoft.com/com/resources/comdocs.asp Nanard, et al. (1995). “Hypertext Design Environments and the Hypertext Design Process”. Communications of the ACM. August 1995. Vol. 38, No. 8. pp 49-56. Nielsen, Jakob. (1993). Usability Engineering. Morgan Kaufmann. USA. Nielsen, Jakob. (2000). Usabilidad. Diseño de sitios Web. Prentince Hall. España. OMG : Object Management Group (2002). The Common Object Request Broker Architecture. URL : http://www.corba.org/ Page, Ernest H. (1998). “The Rise of Web-Based Simulation: Implications for the High Level Arquitecture” Proceedings of the 1998 Winter Simulation Conference. pp. 1663-1668. Page, Ernest H., et al. (2000a). “Web-Based Simulation: Revolution or Evolution?” ACM Transactions on Modeling and Computer Simulation, Vol. 10, No. 1, January. pp 3-17. 180
  • Page, Ernest H., et al. (2000b). “Investigation the Application of Web-Based Simulation Principle within the Architecture for a Next-Generation Computer Generated Forces Model”. Future Generation Computer System , 17 (2). Pp 159-169. Perakath, Benjamin (2000). “Use of Components and Agents in Web-Based Simulation”. Panel Discussion. WEBSIM 2000. URL: http://chief.cs.uga.edu/~jam/jsim/websim/papers/benjamin.html Ku, Vera (2000). “Desarrollo de un Modelo Dinámico para la Simulación de la Producción Bovina de Carne en el Trópico”. Proyecto 33722-B. Conacyt. Richardson, George P. (1981). “Introduction to System Dinamics Modeling with Dynamo”. Wright Allen Pr; ISBN: 0262181029. Rockwell Software, Inc. (2002). Arena. URL: http://www.arenasimulation.com/ Rogers, Ralph V. (1997). Results of the Workshop “What makes a modeling and simulation professional”. University of Central Florida. USA. October 11-12. Rumbaugh, M (1991). “Object Oriented Modelling and Design”. Pretince Hall Inc. Sanchez, et al. (1983). “Differential Equations: An Introduction” Addison-Wesley. Schwabe et al. (1998). “An Object Oriented Aproach to Web-Based Application Design. Theory and Practice of Objects Systems” 4(4), 1998. Willey and Sons, New York, ISSN 1074- 3224. Schwabe, Daniel (1999). "'Just Add Water' Applications: Hypermedia Application Frameworks". Extended abstract for the Hypertext '99 Workshop on "Hypermedia Development: Design Patterns in Hypermedia". In Press. Schwabe et al. (2000a). “Modeling interactions and Navigation in Web Applications”. Lecture Notes in Computer Science 1921, Proceedings of the World Wild Web and Conceptual Modeling ’00 Workshop, ER ’00 Conference, Springer, Salt Lake City, 2000 (Extended Version). Schwabe et al. (2000b). "Web Design Frameworks: An Approach to Improve Reuse in Web Applications", Lecture Notes in Computer Science (Hot Topics) - Proc. of the Second International Workshop on Web Engineering, WWW9 Conference , Springer Verlag. Schwabe et al. (2001a). “Engineering Web Applications for Reuse”. IEEE Multimedia, Spring 2001 2-12. 181
  • Schwabe et al. (2001b). “Designing Personalized Web Applications”. WWW10, May 1-4, 2000, Hong Kong, China. ACM. In Press. Schwabe et al. (2002). “The Object-Oriented Hypermedia Design Model”. URL: http://www.telemidia.puc-rio.br/oohdm/oohdm.html Steed, Marlo (1996). “Stella, A Simulation Construction Kit; Cognitive Process and Educational Implications”. URL: http://www.edu.uleth.ca/faculty/members/steed/Articles/Stella/Stella.html SCS: Society of Computer Simulation (2002). URL: www.scs.org Taffe, William J. (1991). “Simulation and Modelling with Stella. A General Education Courses”. Plymouth State College. Journal on Modeling and Simulationl. ACM. In Press, pp. 87-91. White, Liz (2002). DIS Reference Page. URL: http://cs.gmu.edu/~white/Pages/dis.html W3C: World Wide Web Consortium (2002a). Hypertext Markup Language Home Page. URL: http://www.w3.org/MarkUp/ W3C: World Wide Web Consortium (2002b). HTTP - Hypertext Transfer Protocol. URL: http://www.w3.org/Protocols/ Young, Hae Lee, et al. (1998). “Web-Based Simulation with the Remote Method Invocation”. Hanyang University, South Korea. In Press. 182