Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ TRABAJO PRACTICO Nº 3 – Procesador de un log file 1) Objetivo del T.P.: El objetivo del presente trabajo consiste en la realización de un programa ejecutable en modo consola generador de estadísticas sobre los datos almacenados en un archivo log del tipo CSV (log file), correspondientes a las visitas de un sitio web. El programa debe proporcionar de forma conveniente un listado conteniendo la frecuencia de visitas de cada usuario a un sitio web. 2) Alcance del T.P.: Mediante el presente trabajo se busca que el alumno adquiera y aplique conocimientos sobre los siguientes temas: • Arreglos dinámicos de estructuras (Growing Arrays) . • Manejo de punteros dobles ó triples. • Sintaxis básica del lenguaje HTML [opcional]. • Concepto y ventajas/desventajas de programas Common Gateway Interface (CGI) [opcional]. 3) Desarrollo del T.P.: Las tareas a realizar por el programa son: • Lectura del archivo histórico de visitantes (log). • Construcción de un arreglo de estructuras con los datos de los visitantes, obtenidos del archivo log de entrada. • Cálculo de la frecuencia de visitas de cada usuario. • Presentación tabular de los datos. • Destrucción del arreglo dinámico de estructuras. En cuanto a la presentación de los resultados, ésta debe efectuarse generando un archivo de texto por redireccionamiento del stdout, y optativamente en formato HTML o por CGI (ver Anexo). La fuente de datos (entrada) es un log file con las siguientes características: • Archivo de texto denominado "webhits.log" en el cual cada línea contiene los campos de información del visitante separados por un carácter delimitador '\n'. Optativamente puede reemplazarse el carácter separador LF de cada campo por un Pipe ("|"=ALT+124), terminando una línea CSV da con un carácter de fin de línea (LF). • Los campos de información son los siguientes (en este orden): 1 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ - User ID . Campo obligatorio. Apellido del usuario. Campo obligatorio. Nombre del usuario. Campo obligatorio. Sector/Empresa . Este campo puede venir vacío. Fecha y hora de la visita (formato DD/MM/YYYY HH:MM:SS). Puede ser vacío. Dirección IP (formato AAA.BBB.CCC.DDD). Campo obligatorio. • Por el mecanismo de generación del log file, se supone no puede existir un carácter separador dentro de los campos de datos. Ejemplo de un archivo de entrada para la parte obligatoria (campos delimitados por LF): 001 Perez Juan Logística 15/01/2001 16:52:54 10.68.5.77 002 Ugarte Luís <campo vacío> <campo vacío> 10.68.5.75 003 Beccar María Martha Caja 18/01/2001 16:52:55 162.55.55.56. 004 Perez Juan Logística 15/01/2001 16:52:54 10.87.5.77 005 Perez Juan Logística 17/01/2001 16:52:54 10.87.8.7 006 Perez Juan Logística 15/04/2001 16:20:47 10.4.5.22 Ejemplo de un archivo de entrada para la parte optativa (campos delimitados por Pipes): 001|Perez|Juan|Logística|15/01/2001 16:52:54|10.68.5.77 002|Ugarte|Luís|||10.68.5.75 2 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ 003|Beccar|María Martha|Caja|18/01/2001 16:52:54|162.55.55.56. 004|López|Cecilia|Compras|25/01/2001 1:54:00|10.68.5.15 005|Ugarte|Luís|||10.68.25.75 006|Ugarte|Luís|||10.68.15.7 Nota: Si se decide realizar este punto optativo (con Pipes) puede obviarse el punto obligatorio (campos separados por LF). NOTA IMPORTANTE: La longitud de cada campo es desconocida, por lo que debe utilizarse memoria dinámica para leer una línea completa del archivo (para ambos casos, obligatorio y opcional), y lo mismo para el arreglo de estructuras. Forma de invocación: El programa en modo consola, denominado "visitas.exe", debe ser invocado sin argumentos, y el archivo de entrada se supone que estará ubicado en el mismo directorio que el ejecutable (por razones de seguridad, aunque esto presenta ciertas desventajas). Generales: Debe preverse que el programa funcione de manera controlada ante los siguientes eventos inusuales: • No existe el archivo log en la ruta indicada. • El archivo existe, pero está vacío (no hubo visitantes). • Memoria insuficiente. En los tres casos el pograma no deberá interrumpirse abruptamente, sino que desplegará un mensaje de error al usuario. 4) Entrega del Trabajo Práctico: a) Deberá presentarse la correspondiente Documentación de desarrollo del TP, incluyendo: • estructura lógica y funcional del programa desarrollado. • explicación de las alternativas y estrategias adoptadas. • reseña sobre los problemas encontrados en el desarrollo del programa y las soluciones implementadas para subsanarlos. b) Deberá entregarse los fuentes (implementación y headers) de los programas desarrollados. NO entregar archivos de códigos objeto y/o ejecutables. c) Deberá entregarse un archivo script MAKEFILE de compilación que indique cómo deben ser compilados los códigos fuentes del punto b) mediante el compilador GCC/DJGPP. d) Debe entregarse un archivo de entrada para poder probar el programa. 3 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ 5) Bibliografía: Debe incluirse la referencia a toda bibliografía consultada para la realización del presente TP: libros, artículos, URLs, etc. En el caso de libros, citar el código ISBN, la edición y el nombre de la Editorial. 4 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ ANEXO: Detalles sobre partes optativas del TP Para la realización optativa (archivo HTML) la operatoria responde al siguiente esquema: Optativamente, a criterio del alumno, la presentación de resultados puede efectuarse generando dinámicamente una página web mediante un programa CGI, para lo cual el alumno debe disponer de alguno de los siguientes servidores web de desarrollo: Personal Web Server (P.W.S.) de Microsoft, Internet Information Server (I.I.S.) de Microsoft, o Apache Web Server de dominio público (los tres productos mencionados cumplen con el standard HTTP 1.0 del N.C.S.A.). Para la alternativa CGI, la operatoria responde al siguiente esquema: Para cualquiera de las dos alternativas (archivo HTML o CGI) se debe disponer de un navegador de Internet (browser), como por ejemplo Internet Explorer (3.0 ó superior), Netscape Navigator (4.0 ó superior), Konqueror u Opera. En cuanto a la presentación tabular de los datos, dado que se supone que este programa debe integrarse a un sitio web corporativo de una empresa, cuyo departamento de Imagen Corporativa ha determinado una serie de normas de diseño gráfico e integración de contenidos, debe generarse un archivo HTML/página web que responda a las siguientes características: •El título de la página web debe ser "Estadísticas de Visitantes". 5 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ • Debe incluirse el logo de la empresa en el margen izquierdo superior (se ajunta archivo GIF, "adobe.gif"), sin borde, que presente el texto alternativo "Adobe Argentina S.A.", y con un link a la URL: http://www.adobe.com. • Toda la tipografía debe realizarse con tipo de letra "verdana" sobre un fondo de color amarillo (RGB=ffff99). Los títulos deben estar escritos en negrita, cursiva y subrayados con tamaño de letra "5" y color bordeaux (RGB=993366). El resto de las letras en tamaño "2" (color a libre elección). • La tabla de visitantes debe estar centrada , y la frecuencia de visitas resaltada en color rojo (RGB=FF0000). • Debajo de la tabla deben mostrarse dos links a otras páginas: uno a la página anterior (http://localhost/informatica.htm), bajo la leyenda "[Volver]", y otro para enviar un correo electrónico a la dirección 7502@fi.uba.ar, bajo la leyenda "[Contáctenos]". A modo de ejemplo, se presenta prototipo de la página HTML, y a continuación su código HTML: <html> <head> <title>Estadísticas de Visitantes</title> </head> <body bgcolor="#ffff99"> <left> <a href="http://www.adobe.com"> <img src="adobe.gif" alt="Adobe Argentina S.A." border="0" align="left"> </a> <br> <center> <font face="arial" size="5" color="#993366"><b><i><u>Estad&iacute;sticas de Visitantes</b></i></u></font> 6 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ <br> <Br> <br> <table align="center" border="1"> <tr> <th bgcolor="#aaccff"><font size="2" face=verdana>Apellido y Nombre</font></th> <th bgcolor="#aaccff"><font size="2" face=verdana>Sector/Empresa</font></th> <th bgcolor="#aaccff"><font size="2" face=verdana>Visitas</font></th> </tr> <tr> <td align="center"><font size="2" face=verdana>Beccar, Mar&iacute;a Martha</font></td> <td align="center"><font size="2" face=verdana>Caja</font></td> <td align="center"><font size="2" face=verdana color="#ff0000"><b>1</b></font></td> </tr> <tr> <td align="center"><font size="2" face=verdana>L&oacute;pez, Cecilia</font></td> <td align="center"><font size="2" face=verdana>Compras</font></td> <td align="center"><font size="2" face=verdana color="#ff0000"><b>1</b></font></td> </tr> <tr> <td align="center"><font size="2" face=verdana>Perez, Juan</font></td> <td align="center"><font size="2" face=verdana>Log&iacute;stica</font></td> <td align="center"><font size="2" face=verdana color="#ff0000"><b>1</b></font></td> </tr> <tr> <td align="center"><font size="2" face=verdana>Ugarte, Luís</font></td> <td align="center"><font size="2" face=verdana>&nbsp;</font></td> <td align="center"><font size="2" face=verdana color="#ff0000"><b>3</b></font></td> </tr> </table> <BR> <BR> <BR> <a href="http://localhost/informatica.htm"><font size="2" face=verdana>[Volver]</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto: 7502@fi.uba.ar"><font size="2" face=verdana>[Cont&aacute;ctenos]</a> <br> <br> </body> </html> 7 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ El código HTML del template es: El código HTML del template es: <html> <head> <title>Estadísticas de Visitantes</title> </head> <body bgcolor="#ffff99"> <left> <a href="http://www.adobe.com"> <img src="adobe.gif" alt="Adobe Argentina S.A." border="0" align="left"> </a> <br> <center> <font face="arial" size="5" color="#993366"><b><i><u>Estad&iacute;sticas de Visitantes</b></i></u></font> <br> <Br> <br> <table align="center" border="1"> <!-- COMIENZO DEL TITULO --> <tr> <th bgcolor="#aaccff"><font size="2" face=verdana>Apellido y Nombre</font></th> <th bgcolor="#aaccff"><font size="2" face=verdana>Sector/Empresa</font></th> <th bgcolor="#aaccff"><font size="2" face=verdana>Visitas</font></th> </tr> <!-- FIN DEL TITULO --> <!-- ESTE ELEMENTO SE REPITE PARA CADA VISITANTE à <tr> <td bgcolor="#aaccff"><font size="2" face=verdana> [Apellido y Nombre] </font></td> <td bgcolor="#aaccff"><font size="2" face=verdana> [Sector/Empresa] </font></td> <td bgcolor="#aaccff"><font size="2" face=verdana> [Visitas] </font></td> </tr> <!-- FIN DEL ELEMENTO --> </table> <BR> <BR> <BR> <a href="http://localhost/informatica.htm"><font size="2" face=verdana>[Volver]</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto: 7502@fi.uba.ar"><font size="2" face=verdana>[Cont&aacute;ctenos]</a> <br> <br> 8 Alg. y Prog. I (75.02) - Trabajo Práctico Nº 3 - Memoria Dinámica _______________________________________________________________________________________________ </body> </html> Invocación del programa: En cuanto a la forma de invocación del programa, para la alternativa de archivo HTML basta con ejecutar el programa "visitas.exe" y el archivo "visitas.htm" deberá ser generado en el directorio actual del aplicativo, el cual podrá ser visualizado con un navegador de Internet (browser). No olvidarse de refrescar la pantalla para ver los resultados. Para la alternativa II (CGI) el programa debe ser invocado desde la ventana de un navegador o bien desde otra página web de prueba diseñada libremente por el alumno, con un link a la dirección donde se halle el programa CGI en cuestión: NOTA: En ningún caso el programa CGI debe recibir parámetros ("por razones de seguridad informática"). [Esto es además una excepción/restricción intencional para no implicar una complejidad excesiva del presente Trabajo Práctico]. 9