From emhn at telcel.net.ve Fri May 4 09:42:38 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Serial CD 2 In-Reply-To: <20010504062423.7986.qmail@nwcst336.netaddress.usa.net> Message-ID: On 4 May 2001, mou ef wrote: > en el mail anterior les pedi como averiguar el numero serial de un CD > pero pido disculpas por no explicarme bien lo que en realidad necesito > es algun programa que pueda leer el numero serial del CD y guardarlo en > un archivo de texto... lo necesito por favor ya que tengo que registrar > bastantes CD y si pudiera hacerlo un programa seria mejor... > > (si no conocen algun programa como este pero tienen idea de como hacer > uno que lo haga "en leguaje C o Basic" por favor haganla llegar tambien y yo > tratare de inventarme el programa...) Los CD-ROMs o CD-AUDIO no tienen ning?n identificador ?nico tal y como lo define el Red Book y los subsiguientes Yellow Book, Green Book y Orange Book, de manera que no existe "firma" o "serial" escrito en ellos (contrariamente a lo que cree todo el mundo :-). Sin embargo, la tabla de contenidos del disco puede ser usada como un identificador bastante confiable, porque es muy poco probable que existan dos CD's diferentes con la misma cantidad de pistas con _exactamente_ la misma duraci?n y longitud. En esto se basa el mecanismo de indizado que utliza CDDB para registrar los discos; no es perfecto, pero en general funciona. Entonces, para obtener un "serial" de un CD de audio, simplemente utiliza cualquier software de reproducci?n de CD que soporte CDDB y ver?s que en los archivos de inventario generados aparece la "firma" CDDB, que no es m?s que aplicar ciertas operaciones aritm?ticas combinando los datos de la tabla de contenidos. Por ejemplo, usando kscd en KDE, en los directorios $KDEBASE/share/apps/kscd/cddb/* encontrar?s archivos cuyos nombres son las "firmas" de los CDs. Puedes usar la opci?n -toc de cdrecord para obtener la tabla de contenidos (conocida como PMA) de un CD. Pero por supuesto... #!/usr/bin/perl # Los IOCTLs tomados desde /usr/include/linux/cdrom.h my $CDREADTOCHDR = 0x5305; my $CDREADTOCENTRY = 0x5306; my $CDMSF = 0x02; my $be = unpack("h*",pack("s",1)) =~ /01/; sub ReadTOC { my $device = shift; my $tochdr; sysopen(CD,$device,O_RDONLY|O_NONBLOCK) or die "Pon un CD! [$!]"; ioctl(CD,$CDREADTOCHDR,$tochdr) or die "Pon un CD de audio! [$!]"; my ($start,$end) = unpack "CC",$tochdr; my @tracks; for ($start..$end) { push @tracks,$_; } push @tracks, 0xAA; my @r; my $tocentry; my $toc = ''; my $size = 0; for (@tracks) { $toc .= (" " x 8); $size += 8; } my $count = 0; foreach my $i (@tracks) { $tocentry = pack "CCC", $i,0,$CDMSF; ioctl(CD,$CDREADTOCENTRY,$tocentry) or die "Pista $i chimba [$!]"; my ($min,$sec,$frame) = unpack "CCCC", substr($tocentry,4,4); $count += 8; push @r, { min => $min, sec => $sec, frame => $frame, frames => $frame + $sec * 75 + $min * 60 * 75 }; } close CD; return @r; } sub CDDBSum { my $n = shift; my $ret = 0; while ($n > 0) { $ret += ($n % 10); $n = int $n / 10; } return $ret; } sub CDDBId { my ($total,$toc) = @_; my ($i,$t,$n) = (0,0,0); while ($i < $total) { $n += CDDBSum(($toc->[$i]->{min} * 60) + $toc->[$i]->{sec}); $i++; } $t = (($toc->[$total]->{min} * 60) + $toc->[$total]->{sec}) - (($toc->[0]->{min} * 60) + $toc->[0]->{sec}); return (($n % 0xff) << 24 | $t << 8 | $total); } sub GetCDId { my $cd = shift; my @toc = ReadTOC($cd); my $total = $#toc; my $id = CDDBId($total,\@toc); return ($id,$total,\@toc); } my ($id,$total,$rtoc) = GetCDId("/dev/cdrom"); printf "Id: %lu CDDB Id %08X\n",$id,$id; printf "Total: %2d\n",$total; my $t = 1; foreach (@$rtoc) { printf "Trk %2d: %02d:%02d, %8ld frames\n", $t, $_->{min}, $_->{sec}, $_->{frames}; $t++; } Este programa es espec?fico para Linux y muestra el Id "calculado" para el CD de _audio_ tal como lo sugiere CDDB tanto en decimal como en hexadecimal. Si quieres hacerlo funcionar en otro Unix debes cambiar los IOCTLs seg?n corresponda (afirmo que funciona en (Free|Net|Open)BSD :-). -- Ernesto Hern?ndez-Novich - Running Linux 2.4.2 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 Fri May 4 14:08:53 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Los populares JAPHs Message-ID: Ya sali? la ?ltima actualizaci?n de los JAPHs y est? disponible en http://www.cpan.org/misc/japh. Alg?n d?a... -- Ernesto Hern?ndez-Novich - Running Linux 2.4.2 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 Fri May 4 14:14:13 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Serial CD 2 Message-ID: On 4 May 2001, mou ef wrote: > en el mail anterior les pedi como averiguar el numero serial de un CD > pero pido disculpas por no explicarme bien lo que en realidad necesito > es algun programa que pueda leer el numero serial del CD y guardarlo en > un archivo de texto... lo necesito por favor ya que tengo que registrar > bastantes CD y si pudiera hacerlo un programa seria mejor... > > (si no conocen algun programa como este pero tienen idea de como hacer > uno que lo haga "en leguaje C o Basic" por favor haganla llegar tambien y yo > tratare de inventarme el programa...) Los CD-ROMs o CD-AUDIO no tienen ning?n identificador ?nico tal y como lo define el Red Book y los subsiguientes Yellow Book, Green Book y Orange Book, de manera que no existe "firma" o "serial" escrito en ellos (contrariamente a lo que cree todo el mundo :-). Sin embargo, la tabla de contenidos del disco puede ser usada como un identificador bastante confiable, porque es muy poco probable que existan dos CD's diferentes con la misma cantidad de pistas con _exactamente_ la misma duraci?n y longitud. En esto se basa el mecanismo de indizado que utliza CDDB para registrar los discos; no es perfecto, pero en general funciona. Entonces, para obtener un "serial" de un CD de audio, simplemente utiliza cualquier software de reproducci?n de CD que soporte CDDB y ver?s que en los archivos de inventario generados aparece la "firma" CDDB, que no es m?s que aplicar ciertas operaciones aritm?ticas combinando los datos de la tabla de contenidos. Por ejemplo, usando kscd en KDE, en los directorios $KDEBASE/share/apps/kscd/cddb/* encontrar?s archivos cuyos nombres son las "firmas" de los CDs. Puedes usar la opci?n -toc de cdrecord para obtener la tabla de contenidos (conocida como PMA) de un CD. Pero por supuesto... #!/usr/bin/perl # Los IOCTLs tomados desde /usr/include/linux/cdrom.h my $CDREADTOCHDR = 0x5305; my $CDREADTOCENTRY = 0x5306; my $CDMSF = 0x02; my $be = unpack("h*",pack("s",1)) =~ /01/; sub ReadTOC { my $device = shift; my $tochdr; sysopen(CD,$device,O_RDONLY|O_NONBLOCK) or die "Pon un CD! [$!]"; ioctl(CD,$CDREADTOCHDR,$tochdr) or die "Pon un CD de audio! [$!]"; my ($start,$end) = unpack "CC",$tochdr; my @tracks; for ($start..$end) { push @tracks,$_; } push @tracks, 0xAA; my @r; my $tocentry; my $toc = ''; my $size = 0; for (@tracks) { $toc .= (" " x 8); $size += 8; } my $count = 0; foreach my $i (@tracks) { $tocentry = pack "CCC", $i,0,$CDMSF; ioctl(CD,$CDREADTOCENTRY,$tocentry) or die "Pista $i chimba [$!]"; my ($min,$sec,$frame) = unpack "CCCC", substr($tocentry,4,4); $count += 8; push @r, { min => $min, sec => $sec, frame => $frame, frames => $frame + $sec * 75 + $min * 60 * 75 }; } close CD; return @r; } sub CDDBSum { my $n = shift; my $ret = 0; while ($n > 0) { $ret += ($n % 10); $n = int $n / 10; } return $ret; } sub CDDBId { my ($total,$toc) = @_; my ($i,$t,$n) = (0,0,0); while ($i < $total) { $n += CDDBSum(($toc->[$i]->{min} * 60) + $toc->[$i]->{sec}); $i++; } $t = (($toc->[$total]->{min} * 60) + $toc->[$total]->{sec}) - (($toc->[0]->{min} * 60) + $toc->[0]->{sec}); return (($n % 0xff) << 24 | $t << 8 | $total); } sub GetCDId { my $cd = shift; my @toc = ReadTOC($cd); my $total = $#toc; my $id = CDDBId($total,\@toc); return ($id,$total,\@toc); } my ($id,$total,$rtoc) = GetCDId("/dev/cdrom"); printf "Id: %lu CDDB Id %08X\n",$id,$id; printf "Total: %2d\n",$total; my $t = 1; foreach (@$rtoc) { printf "Trk %2d: %02d:%02d, %8ld frames\n", $t, $_->{min}, $_->{sec}, $_->{frames}; $t++; } Este programa es espec?fico para Linux y muestra el Id "calculado" para el CD de _audio_ tal como lo sugiere CDDB tanto en decimal como en hexadecimal. Si quieres hacerlo funcionar en otro Unix debes cambiar los IOCTLs seg?n corresponda (afirmo que funciona en (Free|Net|Open)BSD :-). -- Ernesto Hern?ndez-Novich - Running Linux 2.4.2 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 Fri May 4 14:21:24 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Otro "modismo" Perl (Era Re: Serial CD 2) In-Reply-To: Message-ID: On Fri, 4 May 2001, Ernesto Hernandez-Novich wrote: > #!/usr/bin/perl > # Los IOCTLs tomados desde /usr/include/linux/cdrom.h > my $CDREADTOCHDR = 0x5305; > my $CDREADTOCENTRY = 0x5306; > my $CDMSF = 0x02; > > my $be = unpack("h*",pack("s",1)) =~ /01/; Obviamente, esta l?nea se puede eliminar del programa y no cambia para nada puesto que $be no se usa nunca en el programa, pero... ?Qu? estoy tratando de averig?ar con ?sta instrucci?n? Asuman que m?s adelante se hace algo como if ($be) { /* Si es */ } else { /* No es */ } as? que $be es un flag que cuando vale 1 indica... ?qu?? -- Ernesto Hern?ndez-Novich - Running Linux 2.4.2 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 jrey at linuxsis.net Tue May 8 00:06:10 2001 From: jrey at linuxsis.net (Jose Rey) Date: Wed Aug 4 23:59:24 2004 Subject: Otro "modismo" Perl (Era Re: Serial CD 2) References: Message-ID: <004e01c0d77c$abe1ea80$220ba8c0@hr.lxs> From: Ernesto Hernandez-Novich To: Perl Mongers Caracas > On Fri, 4 May 2001, Ernesto Hernandez-Novich wrote: > > #!/usr/bin/perl > > # Los IOCTLs tomados desde /usr/include/linux/cdrom.h > > my $CDREADTOCHDR = 0x5305; > > my $CDREADTOCENTRY = 0x5306; > > my $CDMSF = 0x02; > > Yo pense que la l?nea tenia que ser interpretada en el contexto del programa, sin embargo resulto tener significado propio y no muy dif?cil de averiguar una vez leido el correspondiente manual de pack (no soy capaz de rordar el churro de opciones de ninguna manera). > > my $be = unpack("h*",pack("s",1)) =~ /01/; de perlfunc: pack("s",1) hace pack de 1 en un short (16 bits), dependiente de la arquitectura unpack("h*",x) hace unpack de x como lo nibble first Asi que incluso el nombre cuadra, $be == $BigEndian ya que en little endians (i.e. intel) da 1000 y no hace match con /01/ mientras que en big endians (i.e. motorola) da 0001 que si hace match con 01. Esta chevere el test de la arquitectura. > > Obviamente, esta l?nea se puede eliminar del programa y no cambia > para nada puesto que $be no se usa nunca en el programa, pero... > ?Qu? estoy tratando de averig?ar con ?sta instrucci?n? > > Asuman que m?s adelante se hace algo como > > if ($be) { > /* Si es */ # es big endian (motorola) > } else { > /* No es */ # es little endian (intel) > } > ------------------------------------------------------------------------ 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 May 8 08:10:24 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Otro "modismo" Perl (Era Re: Serial CD 2) In-Reply-To: <004e01c0d77c$abe1ea80$220ba8c0@hr.lxs> Message-ID: On Tue, 8 May 2001, Jose Rey wrote: > From: Ernesto Hernandez-Novich > To: Perl Mongers Caracas > > > > On Fri, 4 May 2001, Ernesto Hernandez-Novich wrote: > > > #!/usr/bin/perl > > > # Los IOCTLs tomados desde /usr/include/linux/cdrom.h > > > my $CDREADTOCHDR = 0x5305; > > > my $CDREADTOCENTRY = 0x5306; > > > my $CDMSF = 0x02; > > > > > Yo pense que la l?nea tenia que ser interpretada en el contexto del > programa, sin embargo resulto tener significado propio y no muy dif?cil de > averiguar una vez leido el correspondiente manual de pack (no soy capaz de > rordar el churro de opciones de ninguna manera). > > > > my $be = unpack("h*",pack("s",1)) =~ /01/; > > de perlfunc: > > pack("s",1) > hace pack de 1 en un short (16 bits), dependiente de la arquitectura > > unpack("h*",x) > hace unpack de x como lo nibble first > > Asi que incluso el nombre cuadra, $be == $BigEndian ya que en little endians > (i.e. intel) da 1000 y no hace match con /01/ mientras que en big endians > (i.e. motorola) da 0001 que si hace match con 01. Absolutamente correcto. > Esta chevere el test de la arquitectura. Es una sugerencia de Tom Christiansen pre-Perl 5.6. A partir de 5.6 no hay que preocuparse por "endianness" para las operaciones open() ni ioctl(). El programa est? inspirado en un algoritmo modelo en C para hacer los c?lculos y los nombres de las variables est?n "copiados" con modificaciones menores. La versi?n original en C si deb?a preocuparse por endianness pero la forma de verificarlo tomaba seis l?neas... y resulta que despu?s de todo ni siquiera hace falta en Perl. -- Ernesto Hern?ndez-Novich - Running Linux 2.4.2 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 Mon May 21 14:20:59 2001 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:24 2004 Subject: Como trabajo con proxys?.. In-Reply-To: Message-ID: On Mon, 21 May 2001, pinocho madera wrote: > Hola lista, queria saber si alguien me puede decir donde puedo conseguir > informacion sobre los protocolos que usan los proxys, por ejemplo quiero que > mis programas en perl se conecten a traves de un proxy pero el problema es > que no se bien como trabajan los proxy, no se por ejemplo como pedirle que > me redireccionen a X servidor http y hacer un http request etc.. Bueno si > alguien sabe por favor que me pase algun url sobre algun tutorial, bien > gracias.. El proxy habla los mismos protocolos que los extremos, esto es, si usas un browser para conectarte a una p?gina Web emplear?s el protocolo HTTP y el proxy simplemente _releva_ tu petici?n HTTP al servidor. Lo mismo puede decirse de FTP. En lugar de tener, Cliente <--> HTTP <--> Servidor tienes, Cliente <--> HTTP <--> Proxy <--> HTTP <--> Servidor Algunos proxies tienen la posibilidad de conversar con otros proxies para intercambiar informaci?n de vecindad o jerarqu?a, utilizando los protocolos ICP y HTCP... pero en la pr?ctica _nunca_ los vas a utilizar desde un programa (a menos que est?s escribiendo un proxy, por supuesto). Y tambi?n es posible que quieres monitorear el proxy, si este utiliza SNMP, para lo cual podr?as utilizar MRTG. Como vez hay muchos protocolos en juego, seg?n sea la tarea que te ocupa... de acuerdo a tu explicaci?n, yo dir?a que s?lo te interesa hacer un programa que usa HTTP/FTP para "pasar" a trav?s de un proxy. Una de las condiciones para que un proxy sea ?til es que no altere en modo alguno la transferencia de datos, salvo la posible identificaci?n del proxy. Esto simplifica la escritura de un programa que utilice HTTP (o FTP, o lo que sea) porque puedes escribirlo pensando que la conexi?n es directa, y para que trabaje con el proxy no hay que hacer ninguna modificaci?n especial. En Perl dispones de la librer?a LWP (Library for WWW access in Perl) que te permite acceder a la mayor?a de servicios en la Web (man LWP, si no muestra nada es porque no la tienes instalada y debes obtenerla desde CPAN en www.perl.com). Un ejemplo trivial puede ser: #!/usr/bin/perl # Un browser en 10 l?neas use LWP; $c = new LWP::UserAgent; $c->agent("Slowzilla/0.0"); $r = new HTTP::Request GET => 'http://www.yahoo.com'; $u = $c->request($r); if ($u->is_success) { print $u->content; } else { print "Algun error"; } Este es un programa b?sico: - Construye un agente $c. - Le dice que se identifique como "Slowzilla/0.0". - Construye una petici?n $r GET http://www.yahoo.com. - Construye un URI $u en base a pedirle a $c que ubique $r. - Si tiene ?xito, lo imprime. El programa funciona perfectamente sin necesidad de un proxy. Si hay un proxy en el medio, hay dos alternativas: $c->proxy('http','http://proxy:8080/'); Que obviamente especifica que para HTTP hay que usar el proxy determinado. $c->env_proxy() Que especifica tomar las variables de ambiente http_proxy, ftp_proxy, etc. para identificar el proxy. Lee la documentaci?n de LWP para aprender a utilizar HTTP, FTP, Gopher, News y hasta MailTo. Los protocolos que hablan los proxies son los mismos, y est?n definidos en www.w3c.org o en www.faqs.org. (S?lo para los Perl Mongers: ?Qui?n puede decir "Tutorial"?) -- 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. ------------------------------------------------------------------------