From emhn at telcel.net.ve Fri Jul 13 15:37:40 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:25 2004 Subject: =?ISO-8859-1?Q?CGI_en_Perl_=28y_algo_m=E1s_para_los_Monge?= =?ISO-8859-1?Q?rs=29_=28Era_Re=3A_seguridad_en_linux=29?= In-Reply-To: Message-ID: ?Qu? tiene que ver ejecutar un CGI con el asunto? En el futuro procura utilizar un asunto m?s descriptivo. On Thu, 12 Jul 2001, Carlos Rodriguez wrote: > tengo un problema al momento de ejecutar un script cgi-!! > estoy haciendo un script de prueba para que me envie a una pagina html un > mesaje.!!! > necesito saber como poder enviar mensajes de un cgi a una pagina html .. > pero no puedo.!! > este enjemplo lo saque de un libro de perl pero no e funciona.! > lo que debe de hacer es leer un archivo .txt e incrustar el mensaje dentro > de la pagina html.! > les mano los 3 archivos que estoy utilizando.!!! > ojala y alguno de ustedes me pueda ayudar.!! El programa .cgi que anexas tiene un error de sintaxis. Lo reporta en la l?nea 54, pero en realidad est? m?s arriba por omitir un sub antes de declarar una subrutina. Si en el _libro_ estaba as?, excusado; si en el libro est? bien pero lo copiaste mal, m?s cuidado la pr?xima vez. Antes de ejecutar un programa CGI, verif?calo en la l?nea de comandos con un usuario que no sea root para saber que no tiene errores de sintaxis y que puede leer los archivos que necesita. Luego lo llevas al directorio cgi-bin correspondiente y le asignas permisos 755 y lo vuelves a correr all? mismo desde la l?nea de comandos. Reci?n entonces lo pruebas a trav?s de un browser. Si tienes un problema al ejecutarlo a trav?s de un browser, en el error.log del servidor encontrar?s los mensajes de error emitidos por el programa que pueden servirte para diagnosticar la causa del problema. (De aqu? en adelante para los Perl Mongers o Perl Acolytes :-) El programa es _correcto_, pero es exageradamente verboso e innecesariamente lento y complejo. Hace mucho tiempo que en Perl se dispone del m?dulo CGI para generar p?ginas HTML "al voleo". Este programa opera para que sobre un archivo con N l?neas (N desconocido a priori), se escoja una l?nea aleatoriamente. El algoritmo es: leer todo el archivo para contar las l?neas y saber el valor de N, escoger un n?mero aleatorio P entre 1 y N, volver a leer el archivo desde el principio para buscar y mostrar la l?nea P. El lector astuto notar? que en el _mejor_ de los casos (P = 1), hay que leer el archivo completo m?s una l?nea y en el _peor_ de los casos (P = N) hay que leer el archivo completo _dos_ veces (omygosh!). Alguien avispado podr?a sugerir leer el archivo en _memoria_ una sola vez y luego navegarlo. Si, es algo mejor, hasta que intente leer un archivo gigantesco. No pude resistirme a resumir el programa en: #!/usr/bin/perl $|++; use CGI; my $q = new CGI; srand; $nombre_fichero = '/var/www/html/citas.txt'; print $q->header, $q->start_html, BlackJuju, $q->end_html; sub BlackJuJu { my $l; open(C,$nombre_fichero); rand($.) < 1 && ($l = $_) while ; close ; return $l; } Lo trivial primero: - Desactivar el buffering, esencial en una aplicaci?n CGI. - El m?dulo CGI forma parte de la distribuci?n de Perl y est? dise?ado para generar p?ginas din?micamente. $q ser? una p?gina generada din?micamente. - Ubicaci?n del archivo. - Imprimir el encabezado HTML, el inicio de HTML, la magia negra y terminar el HTML. Lo bonito ahora: Es inconcebible leer el archivo completo dos veces... es demasiado lento si el archivo es largo. Pensando en grande, ?qu? tal si fuese una base de datos con decenas de miles de registros? ?Horrible! As? que de entrada, leer todo el archivo para averig?ar N es una soluci?n mal?sima. ?Ser? posible escoger una l?nea sin necesidad de leer _todo_ el archivo y sin conocer N de antemano? Por supuesto, con ayuda de las probabilidades (Jos? Luis, ?a?n ah?? ;-). Abro el archivo una sola vez. (Con ustedes la "magia negra") rand($.) < 1 && ($l = $_) while ; $. es una variable especial de Perl que contiene el n?mero de l?nea actual, i.e. la primera vez que lea vale 1, la segunda vez vale 2, y as? hasta llegar a la ?ltima l?nea para la cual valdr?a N (que a?n no conozco ;-). El while lee una l?nea (se incrementa $. autom?ticamente). Escojo un n?mero aleatorio entre 0 y $. (con el rand($.)); rand(X) devuelve un n?mero entre 0 y X inclusive. Si el resultado de rand() es menor que 1 entonces guardo la l?nea le?da en $l. Una vez recorrido todo el archivo en este plan, lo cierro y retorno $l que ha sido mi l?nea escogida aleatoriamente. No solamente leo el archivo _una_ sola vez, sino que s?lo ocupo tanta memoria como la l?nea m?s larga del archivo. Y es _perfectamente_ aleatorio, todas las l?neas tienen la misma oportunidad de ser escogidas. ?Por qu? sostengo ?sto? Como rand(X) devuelve un n?mero entre 0 y X, hay 1/X oportunidades de quedarse con la l?nea. Esto es, hay 1/1 chance de escoger la 1, 1/2 de escoger la 2, 1/3 de escoger la 3 y as? hasta 1/N de escoger N. Ejemplos pr?cticos: - Si el archivo tiene 1 l?nea, _siempre_ va a salir escogida. Obviamente no s?lo es justo, sino que es correcto retornar la ?nica posibilidad. - Si el archivo tiene 2 l?neas, la primera fue escogida cuando se ley? y la segunda tiene 1/2 de chance de ser escogida... y entre dos eventos, la probabilidad uniforme es 1/2... sigue siendo justo. - Para tres l?neas, la primera fue escogida siempre, la segunda tuvo un chance 1/2 y la tercera tiene un chance de 1/3. Si la tercera tiene 1/3, para que sea "justo", los 2/3 anteriores deben repartirse a partes iguales. Pero ya mostramos que dos l?neas tienen 1/2 cada una, de modo que los 2/3 se dividen a 1/2, i.e. 1/3 de probabilidad para cada una de las tres l?neas. Probabil?sticamente justo. - Para cuatro l?neas, la primera fue escogida siempre, la segunda tuvo un chance 1/2, la tercera tuvo chance 1/3 y la cuarta tiene un chance 1/4. Si la cuarta tiene 1/4, para que sea "justo", los 3/4 anteriores deben repartirse a partes iguales. Pero ya mostramos que tres l?neas tienen 1/3 cada una, de modo que los 3/4 se dividen a 1/3, i.e. 1/4 de probabilidad para cada una de las cuatro l?neas. Probabil?sticamente justo. Ejemplo te?rico (el m?s compacto): Si tengo un conjunto de N+1 elementos ordenados y escojo el ?ltimo con probabilidad 1/N+1 y escojo cualquiera de los N previos con probabilidad N/N+1, entonces la probabilidad combinada es N/N+1 dividido N cuyo resultado es 1/N+1. Esto es, tengo igual probabilidad de escojer el ?ltimo elemento que escojer _cualquiera_ de los previos; por inducci?n matem?tica se desprende que la probabilidad es justa. Ciencia de la computaci?n sin matem?tica... contradicci?n. La magia negra es un "idioma Perl" precisamente para "escoger 1 de N con probabilidad uniforme en una sola pasada"; generalmente se aplica a l?neas de archivos, pero tambi?n se puede aplicar a listas o cualquier conjunto ordenado de objetos. -- Ernesto Hern?ndez-Novich - Running Linux 2.4.5 i686 - Unix: Live free or die! -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS/E d+(++) s+: a C+++$ UBLAVHIOSC*++++$ P++++$ L+++$ E- W+ N++ o K++ w--- O- M- V PS+ PE Y+ PGP>++ t+ 5 X+ R* tv+ b++ DI+++$ D++ G++ e++ h r++ y+ -----END GEEK CODE BLOCK----- ------------------------------------------------------------------------ Enviar e-mail a colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------ From emhn at telcel.net.ve Sat Jul 14 12:10:22 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:25 2004 Subject: =?iso-8859-1?Q?Re:_CGI_en_Perl_=28y_algo_m=E1s_para_los_Mongers=29_=28Era?= =?iso-8859-1?Q?_Re:_seguridad_en_linux=29?= In-Reply-To: <00e201c10beb$392487c0$0a000062@entelchile.net> Message-ID: On Fri, 13 Jul 2001, Luis Roa Pietra wrote: > Para variar. FANTASTICO. Debo aclarar que comet? un error importante en la descripci?n de una de las propiedades del algoritmo. > > Y es _perfectamente_ aleatorio, todas las l?neas tienen la misma > > oportunidad de ser escogidas. Es imposible que el algoritmo sea perfectamente _aleatorio_ en la mayor?a de los computadores, porque rand() genera n?meros pseudo-aleatorios, utilizando una semilla no aleatoria y congruencias enteras. Lo que deb? haber escrito es que la selecci?n de l?nea implementada en el algoritmo es perfectamente _equiprobable_ y justa; en otras palabras, todas las l?neas tienen la misma probabilidad de ser escogidas. En el caso _particular_ de Linux, la funci?n rand() de Perl utiliza /dev/random que no es pseudo-aletorio... pero eso no reduce en nada mi error en el uso del t?rmino apropiado. Gracias a Ricardo Strusberg que me hizo la oportuna correcci?n. -- Ernesto Hern?ndez-Novich - Running Linux 2.2.19 i686 - Unix: Live free or die! -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS d+(-) s+: a C+++$ UBLAVHIOSC++++$ P++++$ L+++$ E- W+ N++ ?o ?K w--- O- M- V PS+ PE Y+ PGP>++ t+ 5 X+ R* tv+ b++ DI+++$ D++ G>++ e++ h+ r+ y++ -----END GEEK CODE BLOCK----- ------------------------------------------------------------------------ Enviar e-mail a colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------ From emhn at telcel.net.ve Tue Jul 31 10:24:54 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:25 2004 Subject: Image ISO de CPAN In-Reply-To: <01073110392700.01562@juanjose> Message-ID: On Tue, 31 Jul 2001, Juan Jose Natera Abreu wrote: > // ?Alguien sabe de d?nde se puede bajar uno el CPAN en formato ISO? > // (Creo que cabr?a en dos CDs). A ver, Juan Jos?, una ayudita ah? :) > > Pana yo no tengo, en tal caso creo que es mejor tener un mirror, ya que > hay muchas actualizaciones diarias. En alg?n directorio con espacio en disco suficiente (~2Gb) en una m?quina que tenga buen ancho de banda a Internet (256Kb es _escaso_, habla la experiencia :-/): mkdir /mirrors/cpan.org rsync -avP --delete ftp.funet.fi::CPAN /mirrors/cpan.org/ Ahora bien, ftp.funet.fi est? en Finlandia (GMT+2, o sea seis/siete horas m?s adelante que nosotros). Hacer rsync entre las 2 y 13 horas de Venezuela est? _muy_ mal porque es la hora de mayor tr?fico all?, no obstante usar otros horarios es pesado ac?. Hay que usar _otro_ mirror que no sea el sitio principal, y buscarlo en http://www.cpan.org/SITES.html. La _primera_ vez que se sincroniza es eteeerno, pero si despu?s se automatiza la sincronizaci?n diaria una o dos veces al d?a, es mucho m?s corto. Por otro lado, usa rsync; insisto, _quieres_ usar rsync... _necesitas_ usar rsync. Es much?simo m?s eficiente que wget, mirror o cualquier otro script que haga lo mismo v?a FTP/HTTP. Hay casos de personas que ya no usan ni siquiera cp/scp para copiar directorios, usan rsync :-) Lo que prefiero hacer es usar un mirror para hacer la primera copia, y luego hacer dos actualizaciones diarias contra funet.fi. Como dice Juan Jos?, se mueve _mucho_ en un d?a, as? que si quieres tenerlo actualizado debes pagar la penalidad. -- Ernesto Hern?ndez-Novich - Running Linux 2.4.5 i686 - Unix: Live free or die! -----BEGIN GEEK CODE BLOCK----- Version: 3.1 GCS/E d+(++) s+: a C+++$ UBLAVHIOSC*++++$ P++++$ L+++$ E- W+ N++ o K++ w--- O- M- V PS+ PE Y+ PGP>++ t+ 5 X+ R* tv+ b++ DI+++$ D++ G++ e++ h r++ y+ -----END GEEK CODE BLOCK----- ------------------------------------------------------------------------ Enviar e-mail a colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------ From oskarcah at telcel.net.ve Tue Jul 31 02:53:46 2001 From: oskarcah at telcel.net.ve (=?iso-8859-1?Q?Oskar_Cahue=F1as?=) Date: Wed Aug 4 23:59:25 2004 Subject: Programacion Ilustrada Message-ID: Me preguntaba si alguien por aqu? conoce algo sobre la programaci?n ilustrada (literate programming) ideada por D. Knuth. Principalmente me gustar?a saber si exist?a alguna implementaci?n en PERL de Web y Tangle o algo que produzca una salida tan agradable para el lector. A mi me parece muy agradable leer el c?digo fuente con este estilo de programaci?n (leer el c?digo de TeX es una maravilla) donde el c?digo y la documentaci?n de la estructura de datos se funden en uno solo, pero me parece que esta metodolog?a (paradigma?) de programar, o mejor dicho, de escribir, no ha encontrado muchos adeptos. Alguien ha trabajado con esto, en PERL? ------------------------------------------------------------------------ Enviar e-mail a colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------