Tutoriales de Perl en Español http://perlenespanol.baboonsoftware.com/tutoriales/ Tutoriales de Perl. es-mx Uriel Lizama 2007-10-18T11:46:19-06:00 Despliegue de Fecha I http://perlenespanol.baboonsoftware.com/tutoriales/fechatiempo/despliegue_de_fecha_i.html En este tutorial vamos a aprender como manejar la fecha y hora en Perl así como una manera sencilla de desplegarla.... Fecha/Tiempo Uriel Lizama 2007-10-18T11:46:19-06:00 En este tutorial vamos a aprender como manejar la fecha y hora en Perl así como una manera sencilla de desplegarla.

]]> En este tutorial vamos a aprender como desplegar la fecha con Perl de manera sencilla y rápida.


time() y localtime()

En Perl podemos saber la hora del día usando la función time(), esta función regresa un número que si lo vemos es similar al siguiente:

1192320763

Este número representa la cantidad de segundos que han transcurrido desde una fecha en específico, en la mayoría de los sistemas esta fecha es el 1º de Enero de 1970 a las 0 horas GMT, una excepción de estos sistemas es la Mac, que cuenta los segundos desde el 1º de Enero de 1904 en la zona horaria del sistema.

A menos que tengamos la habilidad para hacer las fórmulas matemáticas en nuestro cerebro para convertir esos segundos en días, meses y años, realmente no nos ayuda de mucho, y para ello debemos de usar otra función de Perl que es localtime().

La función localtime recibe un número de tiempo similar al regresado por la función time() de Perl y convierte el número en una lista de 9 elementos.

#   0,    1,   2,   3,    4,    5,   6,    7,     8
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$sec(segundos), $min(minutos), y $hour(horas), representan la hora de la fecha especificada por time.

$mday es el día del mes y $mon es un número del 0 al 11 que representa el mes, donde 0 es Enero y 11 es Diciembre.

$year es la cantidad de años desde 1900 a la fecha. Así que para 2007 este elemento tendrá un valor de 107.

$wday es el día de la semana, representado con un número del 0 al 6, donde 0 es Domingo y 6 es Sábado.

$yday es el número del día del año, este número está en el rango del 0 al 364 y hasta 365 en años bisiestos.

Finalmente $isdst es verdadero en el caso de que la fecha esté dentro del horario de verano, también conocido como Daylight Saving Time, será falso de lo contrario.

Ya teniendo nuestros elementos entonces es simplemente cuestión de imprimirlos como nosotros querramos para sacar la fecha y hora actual:

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$year += 1900;
$mon++;

print "$mday/$mon/$year $hour:$min:$sec\n";

Primer recibimos nuestros 9 elementos de la fecha usando localtime().

Después sumamos 1900 al número que tenemos en $year, debido a que localtime() nos regresa la cantidad de años desde 1900.

En la cuarta línea sumamos uno al mes, pues recuerda que los meses los empieza a contar desde 0 y no de 1 como nosotros queremos.

Finalmente en la última línea imprimos la fecha y hora para que se vea de la siguiente manera:

13/10/2007 18:33:11


POSIX

Ya sabemos como imprimir la fecha, pero como todo en Perl, hay más de una manera de hacer las cosas, y de hecho hay una manera que es mucho más sencilla.

Todas las distribuciones de Perl vienen con módulos base, entre ellos POSIX. Este módulo contiene una función llamada strftime que nos permite darle formato a alguna fecha de manera sencilla.

Por ejemplo, para imprimir la fecha en el formato anterior, haríamos lo siguiente:

use POSIX qw/ strftime /;

print strftime( "%d/%m/%Y %H:%M:%S", localtime(time) );

En la primera línea cargamos el módulo POSIX con la función strftime para poder usarla en nuestro código.

Después, en la siguiente línea hacemos la llamada a la función e imprimimos el resultado.

Debemos enviar 10 argumento en total a strftime(), el primero es el formato en que queremos imprimir la fecha, y los otros nueve son todos aquellos elementos que nos regresa la función localtime. En este caso, simplemente hacemos una llamada a localtime que envía la lista a la función strftime.

Como ves es cuestión de un par de líneas desplegar la fecha como nosotros queremos, pero incluso podemos formatear la fecha de diversas maneras. Si ves, la cadena de formato está compuesta de varios símbolos de porcentaje seguidos de letras, estas expresiones serán sustiuidas por valores específicos por medio del POSIX, las posibles expresiones que podemos usar son:

%aabreviación del día de la semana en inglésSun a Sat
%Adía de la semana en inglésMonday
%bmes abreviado en inglésJan a Dec
%Bmes en inglésJanuary
%cfecha pre-formateadaej. Fri Apr 28 17:23:15 1995
%ddía del mesej. 01-31
%Hhora del día00-23
%Ihora del día01-12
%jdía del año0-365
%mmes del año01-12
%Mminuto00-59
%pAM o PMAM-PM
%ssegundos00-59
%usemana del año (Domingo como primer día)01-53
%wdía de la semana1 (Lunes) a 7 (Domingo)
%Wsemana del año (Lunes como primer día)01-53
%xfecha formateadaej. 04/28/95
%Xhora del díaej. 03:30:01 AM
%Yaño en 4 dígitosej. 2007
%Zzona horariaej. Center Daylight Time

El camino que tomes para desplegar la fecha en tu código depende de ti, pero mi recomendación es que uses POSIX pues te simplificará la vida.

En el siguiente tutorial veremos maneras más completas de desplegar la fecha en otros idiomas como el Español, usando unos módulos bastante sencillos.

]]>
Creando aplicaciones web con CGI::Application http://perlenespanol.baboonsoftware.com/tutoriales/cgi/creando_aplicaciones_web_con_c.html En este tutorial vamos a aprender a crear aplicaciones web usando el módulo CGI::Application. Este módulo nos dará la capacidad de crear aplicaciones CGI portables y fáciles de mantener, sin duda una gran herramienta para el programador web. CGI Uriel Lizama 2007-02-05T13:59:55-06:00 En este tutorial vamos a aprender a crear aplicaciones web usando el módulo CGI::Application. Este módulo nos dará la capacidad de crear aplicaciones CGI portables y fáciles de mantener, sin duda una gran herramienta para el programador web. En este tutorial vamos a aprender a usar el módulo CGI::Application.

El módulo CGI::Application nos brinda una estructura que nos permite escribir aplicaciones web rehúsables. Sencillamente CGI::Application proporiciona una estructura que usa todo lo que funciona de CGI y quita todo lo negativo que hoy en día se pueden encontrar en aplicaciones CGI creadas con Perl.

A través del siguiente tutorial verás que este módulo permite crear aplicaciones web que funcionan en todos lados siempre y cuando se tenga la capacidad de ejecutar Perl y CGI. Incluso, permite crear aplicaciones funcionales que podrían ser distribuidas por medio de CPAN.

Entendiendo CGI::Application

Todas las aplicaciones web consisten de diferente modos de ejecución, por ejemplo, si tuviéramos una aplicación que hace búsquedas en una base de datos, tendría un modo que desplegaría el formulario de búsqueda, otro modo donde se despliegan los resultados, otro modo donde se podrían ver los detalles de una entrada, etc. Todos estos modos de ejecución en su conjunto arman lo que sería nuestra aplicación.

Cada programador tiene una manera distinta de administrar o manejar los modos de ejecución de la aplicación. Lo más común es usar bloques de IF-ELSE para decidir que parte de la aplicación ejecutar.

Por ejemplo, para una aplicación que muestra los resultados de una base de datos, se podría seleccionar que parte ejecutar dependiendo de los parámetros enviados:

   my $query = CGI->new();

   print $query->header();

   if ( my $busqueda = $query->param('busqueda') ) {
       #Hacemos la búsqueda y la desplegamos
   }
   else{
       #Mostramos el formulario de búsqueda
   }
Este tipo de código es lo que da una mala reputación a los CGIs. Tiene una pésima estructura y cualquier cambio que se quiera hacer es sumamente complicado.

CGI::Application nos brinda una excelente solución para administrar y manejar los modos de ejecución de nuestra aplicación.

Creando las facetas de nuestra aplicación

Lenguajes como ASP, Cold Fusion y JSP intentan administrar estos modos de ejecución teniendo un archivo distinto por cada modo de la aplicación. Esto crea la desventaja de que terminas teniendo tantos archivos en tu aplicación como modos de ejecución. Al hacer esto, sacas de contexto los modos al independizar cada parte, pues al final de todo, estos modos de ejecución son parte de la misma aplicación.

CGI::Application ataca el problema desde otro punto de vista al brindar dos funciones básicas.

En primer lugar, CGI::Application designa un único campo de HTML como el "Mode Parameter" (parámetro de Modo). Este Mode Parameter es usado para almacenar el modo de ejecución actual de tu aplicación, cuyo valor es una simple cadena de texto. El Mode Parameter funciona como un policía de tráfico, dirigiendo la ejecución de la aplicación correctamente.

La segunda función, es que CGI::Application asocia cada modo de ejecución como una subrutina de Perl. Cada subrutina, llamada como "Método de Ejecución", contiene la manera en que la aplicación se comporta en cada modo de ejecución. Todos los Métodos de Ejecución se encuentran en un mismo módulo de Perl, al que llamaremos Módulo de la Aplicación.

Tu Módulo de la Aplicación es una subclase de CGI::Application. De hecho, CGI::Application no fue creado para usarse directamente.

Nuestra primera aplicación

Vamos a crear una pequeña aplicación que va a constar de tres modos de ejecución, en el primero mostraremos el formulario de búsqueda, en el segundo mostrará los resultados y en la tercera mostraremos los detalles de cada elemento.

Empecemos creando un nuevo archivo .pm para crear nuestro Módulo de la Aplicación al que llamaremos: "MiPrimeraAplicacion".

En al primera línea vamos a identificar a nuestro módulo:


    package MiPrimeraAplicacion;
Después de ello usaremos la función base que nos permite cargar un módulo pero heredando todas sus funciones. En esta caso el módulo del cual queremos heredar es CGI::Application.

    use base qw( CGI::Application );
El siguiente paso es hacer la inicialización de nuestra aplicación. La inicialización consiste en crear el mapa de nuestra aplicación. El mapa será usado para unir cada modo de ejecución con la subrutina correspondiente.

Piensa en este mapa como la lista definitiva de cosas que tu aplicación puede hacer. Si más adelante quieres agregar más funcionalidades, todo lo que tendrías que hacer es meter una nueva entrada en tu mapa.

Para hacer la inicialización tenemos que crear una función setup():


    sub setup {

    }
Debido a que el módulo CGI::Application está orientado a objetos, entonces nuestro módulo también creará un objeto. Hagamos el setup() de nuestra aplicación de ejemplo:

    sub setup {

        my $self = shift;

        $self->run_modes(
            'modo_1' => 'mostrar_formulario',
            'modo_2' => 'mostrar_resultados',
            'modo_3' => 'mostrar_detalles'
        ); 

        $self->start_mode('modo_1');

        $self->mode_param('accion');

    }
Expliquemos un poco lo que acabamos de hacer. Primero asignamos a la variable $self una instancia de nuestra clase de la aplicación. Después llamamos al método run_modes() que se encarga de crear el mapa. El método recibe un %hash en donde las llaves son el nombre de nuestro modo de ejecución, y el valor es el nombre de la función que queremos llamar en ese modo de ejecución.

Después debemos de asignar nuestro modo de ejecución default, en nuestro caso será el "modo_1" pues queremos mostrar de entrada el formulario de búsqueda.

Finalmente con el método mode_param() asignamos el nombre del Mode Parameter, es decir, ese campo del formulario HTML que nos dice que modo de ejecución es la que se debe de ejecutar. En este caso la llamaremos 'accion'.

Los modos de ejecución

Ahora debemos de crear las subrutinas de los modos de ejecución. Recuerda que cada modo de ejecución está asignado a su subrutina la cual identificamos al crear el mapa.

Las subrutinas de cada modo de ejecución se crean igual que cualquier otra subrutina. Al ser llamada se le envía como primer parámetro una referencia al objeto de la aplicación, y las subrutinas deben de regresar el "output" que queremos desplegar.

Es muy importante que nunca imprimas nada en el STDOUT en tus subrutinas, pues el módulo CGI::Application se encarga de hacer esto con los encabezados adecuados.

En tu aplicación siempre será necesario tener interacción entre los datos enviados por medio de GET o POST a tu CGI. CGI::Application no intenta hacer esto, en su lugar, usa el gran módulo CGI.pm para toda interacción con los querys de tu CGI.

Al llamar el método query() de CGI::Application el módulo te regresará un objeto de tipo CGI.pm que podrás ya usar con normalidad.

Ahora vamos a crear nuestra primer subrutina para el método de ejecución "modo_1. La subrutina la vamos a llamar mostrar_formulario().


    sub mostrar_formulario {

          my $self = shift;

          # Obtener el objeto CGI.pm
          my $q = $self->query();

          $output .= $q->start_html(-title => "Formulario de Búsqueda");
          $output .= $q->start_form();


          $output .= "Buscar en el database: ";
          $output .= $q->textfield(-name => 'database');
          $output .= $q->submit();

          # Ponemos la llamada al siguiente modo de ejecución
          $output .= $q->hidden(-name => 'accion', -value => 'modo_2');
          $output .= $q->end_form();
          $output .= $q->end_html();

          return $output;


    }
Como podrás ver la subrutina es bastante clara. La subrutina del modo de ejecución es llamada en un contexto orientado a objetos ($self). Obtenemos un objeto CGI.pm por medio del método query() de nuestro Módulo de la Aplicación heredado desde el módulo CGI::Application.

En este caso, usamos el mismo objeto de CGI.pm para crear el formulario, pero básicamente lo puedes hacer como quieras, siempre y cuando regreses el resultado usando return(). Recuerda que NO debes de imprimir nada al STDOUT.

Como ves todo es bastante sencillo, quizá lo más "complicado" es que siempre debemos recordar poner un campo "accion" (en este caso es así porque así decidimos llamar a nuestro Mode Parameter) cuyo valor será el modo de ejecución que queremos ejecutar. En este caso como el responsable de mostrar los resultados de la búsqueda es el "modo_2", entonces tenemos que poner ese valor para que se llame a la función mostrar_resultados().

Veamos ahora un ejemplo de como sería nuestra subrutina mostrar_resultados().


    sub mostrar_resultados {

          my $self = shift;

          # Obtener el objeto CGI.pm
          my $q = $self->query();

          # Creamos un hash con todos los parámetros recibidos
          my %Input = $q->Vars;


          my $output = "";
          # Hacemos la búsqueda
          # por ejemplo seleccionar de un database todas las
          # entradas que tengan la palabra puesta por
          # el usuario en $Input{'busqueda'}


          return $output;

    }
Bastante sencilla ¿no?. Ahora cuando mostramos los resultados podremos poner a cada resultado un link parecido al siguiente: 'miaplicacion.cgi?accion=modo_3&id_entrada=232562'.

Así el usuario podrá ver más detalles de cada entrada, recuerda que el modo_3 llama a la función mostrar_detalles() que se encargará de desplegar los detalles de la entrada, quizá buscando por el id enviado en el parámetro 'id_entrada':


    sub mostrar_detalles {

          my $self = shift;

          # Obtener el objeto CGI.pm
          my $q = $self->query();

          # Creamos un hash con todos los parámetros recibidos
          my %Input = $q->Vars;


          my $output = "";
          # Buscamos los detalles de la entrada con id $Input{'id_entrada'}


          return $output;

    }

Los encabezados de HTTP

Por default el módulo CGI::Application imprimirá todo el contenido con el MIME-Type "text/html". Si deseas usar otro MIME-Type, manipular algún cookie, o crear alguna redirección de HTTP, entonces deberás de cambiar los encabezados de HTTP.

Esto lo puedes hacer usando el método heredado header_type() y header_props(). Checa la documentación de CGI::Application para sus detalles.

Nuestro Script CGI

Listo, ya tenemos nuestro Módulo de la Aplicación listo, pero ahora tenemos que hacer el script CGI. Nuestro script CGI será el encargado de ejecutar nuestra aplicación.

En la programación tradicional de CGI, tendríamos un archivo llamado por ejemplo, miaplicacion.cgi que será ejecutado por nuestro servidor y mostrado el resultado. Normalmente este script sería muy grande pues contendría todo el código necesario para ejecutar la aplicación, pero usando CGI::Application todo el código está en nuestro Módulo de la Aplicación.

De esta manera nuestro script CGI estaría realmente vacío, pues de lo único que se encargaría es de cargar un nuevo objeto de MiPrimeraAplicación y listo. Así que vamos a crear un archivo CGI al que vamos a llamar miaplicacion.cgi:


    #!/usr/bin/perl -w

    use strict;
    use MiPrimeraAplicacion;


    my $app = MiPrimeraAplicacion->new();
       $app->run();
Realmente sencillo. Cargamos nuestro objeto MiPrimeraAplicacion y lo ejecutamos.

En nuestra aplicación de prototipo MiPrimeraAplicacion vimos todos los elementos esenciales de una aplicación hecha con CGI::Application.

Nuestro Módulo de la Aplicación lo podemos poner en cualquier lugar de nuestro servidor, siempre y cuando pueda ser accesado por perl y nuestro CGI. Lo más recomendado es que lo pongas en un directorio que no pueda ser accesado por el servidor web.

Conclusiones y Conceptos Avanzados

En este tutorial vimos las bases para que puedas empezar a crear tus aplicaciones usando el excelente módulo CGI::Application. Sin embargo, el módulo nos ofrecer características más avanzadas que podrás aprovechar.

Reutilización del código

Uno de los puntos fuertes que tiene el crear tus aplicaciones cgi con CGI::Application, es que toda la funcionalidad de tu aplicación lo pones dentro de un módulo, siguiendo su estructura y sy lógica. Esto te permite rehusar código de manera sencilla.

En este tutorial no vimos el método cgiapp_init() que te permite inicializar el objeto de tu aplicación con unos parámetros iniciales, así podrías por ejemplo, permitir que ciertas partes de tu aplicación sean accesadas, o que otras se comporten de diferente manera dependiendo de como cargues el objeto desde tu script CGI.

En fin, las posibilidades son tantas como se te ocurran, lo importante es que sigas los linamientos de CGI::Application, y te encontrarás haciendo aplicaciones CGI fáciles de mantener y con excelente portabilidad.

Usando HTML::Template

En todo tipo de aplicación la separación entre lo que cambia y lo que nunca cambia es totalmente importante. Usando templates tenemos la capacidad de separar el diseño del código.

El módulo CGI::Application viene con una sencilla manera de integrar el módulo HTML::Template a nuestra aplicación por medio de los métodos tmpl_path() y load_tmpl(). Para más detalles acerca de ellas, checa la documentación de CGI::Application.

Otros Recursos

El tutorial lo basé en el artículo 'Using CGI::Application' de Jesse Erlbaum que lo puedes encontrar en:
http://www.perl.com/pub/a/2001/06/05/cgi.html

Documentación de CGI::Application
http://search.cpan.org/search?query=CGI%3A%3AApplication&mode=all

Documentación de CGI.pm
http://search.cpan.org/search?query=CGI&mode=all

Como usar el módulo HTML::Template
Usando HTML::Template ]]> Mecánica Cuántica en Perl http://perlenespanol.baboonsoftware.com/tutoriales/misc/mecanica_cuanti.html La ciencia avanza, y junto con ella, Perl. Vamos a ver en este tutorial como podemos aplicar un poco de mecánica cuántica en Perl, y los usos prácticos que le podemos dar a este nuevo conocimiento. Misc Uriel Lizama 2006-10-16T13:15:40-06:00 La ciencia avanza, y junto con ella, Perl. Vamos a ver en este tutorial como podemos aplicar un poco de mecánica cuántica en Perl, y los usos prácticos que le podemos dar a este nuevo conocimiento. La ciencia avanza, y junto con ella, Perl. Vamos a ver en este tutorial como podemos aplicar un poco de mecánica cuántica en Perl, y los usos prácticos que le podemos dar a este nuevo conocimiento.

Un poco acerca de la materia

La interpretación básica de la mecánica cuántica, o física cuántica para algunos, dice que todas las partículas existen como un discontinuo infinito de probabilidades hasta el momento en que son observadas.

Por ejemplo, una partícula que es observada en un estado A, B ó C, puede considerarse que tiene un estado inicial en cual simultáneamente tiene A, B y C. De ésta manera podemos decir que tiene una superposición de todos los estados, y hasta el momento en que es observada es que elige alguno de ellos.

En este momento se está haciendo un desarrollo que se encuentra muy avanzado, en donde se busca la creación de qubits. Los qubits serán bits de información que contienen tanto el 1 como 0.

¿Mecánica Cuántica en Perl?

Damian Conway desarrolló un módulo al que llamó Quantum::Superpositions. Éste módulo simula partículas cuánticas en superposición.

El módulo agrega dos nuevos operadores a Perl: any() y all(). Estos dos operadores nos ayudarán a crear nuestras variables cuánticas.

NOTA: A partir de este momento llamaremos variable cuántica a las variables inicializadas con el módulo.

Por ejemplo, vamos a crear una variable cuántica con 3 números distintos:

use Quantum::Superpositions;

my $i_cuantica = any(2,4,6);
En este momento nuestra variable $i_cuantica es una variable cuyos posibles valores son 2,4 y 6, todo depende del observador.

Entonces podemos hacer lo siguiente:

if($i_cuantica == 6){
    print "Seis";
}
Veremos que se despliega Seis en nuestra pantalla, pues al momento de hacer el if la variable $i_cuantica tomó el valor de 6, o por lo menos la simulación.

Pero que tal si hacemos lo siguiente:

if($i_cuantica == 2*2){
    print "Verdadero";
}
Entonces nos dará Verdadero, pues nuestra variable cuántica también tiene un valor de 4.

Pero que pasa si hacemos nuestra variable cuántica con all:

my $all_cuantica = all(2,4,6);
En ese momento los ifs anteriores serán falsos pues no cumple con TODAS las equivalencias. Lo que sería verdadero sería lo siguiente:
if($all_cuantica == any(2,4,6)){
    print "Verdadero";
}
Esto es porque $all_cuantica es una variable cuyo valor es igual a TODOS los valores, y un valor any() es equivalente a CUALQUIERA de sus valores. Por lo que las dos terminan siendo iguales, pero su funcionamiento es distinto.

¿Tu mente no logra comprender esto? Ummm... la magia de la mecánica cuántica.

Ejemplo Práctico

Podemos usar nuestras variables cuánticas para muchas cosas. A continuación pongo un ejemplo básico de lo que podrías lograr usando las variables cuánticas.

Digamos que tienes un listado de personas como el siguiente:


my %Personas = (
                'Uriel' => { Nacionalidad => 'Mexicana', Edad => 21 },
                'Esteban' => { Nacionalidad => 'Argentina', Edad => 23 },
                'Pepe' => { Nacionalidad => 'Mexicana', Edad => 16 },
                'Julio' => { Nacionalidad => 'Española', Edad => 25 }
               );

Y digamos que quieres los nombres de las personas de nacionalidad Mexicana o Española que tengan una edad de 21 ó 25 años.

Entonces podemos hacer nuestra variable cuántica de la siguiente manera:


my $admitidos = all(Nacionalidad=>any('Mexicana','Española'),Edad=>any(21,25));

Y después hacemos nuestro loop por todas las personas:
while(my ($key,$val) = each %Personas ){

    if($admitidos eq any(%{$val})){
        print $key,"\n";
    }
}
Lo cual desplegará de manera correcta:

Julio
Uriel

En este ejemplo puedes modificar la variable cuántica dependiendo del filtro que deseas poner.

Últimas Palabras

En el tutorial echamos un vistazo rápido al módulo Quantum::Superpositions, para más detalles acerca de lo que puedes lograr con el módulo, te recomiendo que leas su documentación:
http://search.cpan.org/search?query=Quantum%3A%3ASuperpositions&mode=all

Si no sabes que es la mecánica cuántica, te recomiendo que veas la película What the Bleep Do we Know?. Un excelente documental que te muestra las bases de la mecánica cuántica y algunas sorpresas más:
What the Bleep Do We Know!? ]]> Creando Sellos Dorados con Fireworks 8 http://perlenespanol.baboonsoftware.com/tutoriales/fireworks/creando_sellos_dorados_con_fir.html Crea sellos dorados que se vean profesionales de manera sencilla usando solamente algunas figuras, textos, gradientes y unas sombras. Al final tendrás un sello que podrás usar en tus diseños. Fireworks Uriel Lizama 2006-10-15T12:58:51-06:00 Crea sellos dorados que se vean profesionales de manera sencilla usando solamente algunas figuras, textos, gradientes y unas sombras. Al final tendrás un sello que podrás usar en tus diseños.

]]>

Ya sea para simbolizar mérito o señalar nuevo contenido, un sello dorado casi siempre es la mejor opción. Usando dos herramientas de Fireworks: Auto Shapes y Text On a Path, estarás creando sellos dorados en minutos.

Notas Iniciales

Éste tutorial fue creado con Adobe Fireworks 8 y requiere conocimiento de uso de figuras automaticas y trazados.

Al final del tutorial tendrás imagenes que se ven totalmente realisticas:

Creando Sellos Dorados


Creando una Estrella

Empezamos creando una figura base, la estrella. Selecciona la Herramienta Estrella Herramienta Estrella y dibuja una estrella de unos 150px de ancho. Arrastra el cuadro de Puntos(Points Handle) para incrementar la cantidad de puntas a unas 22, haz lo mismo con el radio interior Radio 2(Inner Radius Handler) para producir puntas más cortas y más triangulares.

A continuación vamos a agregar un poco de color. Dale a tu nueva figura un relleno gradientado hacia arriba, de #DDA600 a #FFEB77. Eso le dará un buen tono dorado. Ajusta los colores de acuerdo a tu gusto y necesidades; puedes usar un azul rey, rojo, o algún verde.

Ahora vamos a agregarle a nuestro sello una sombra sutil. Agrégale a la figura un Filtro de Sombra, con 2 de Distancia, 55% de Opacidad, 2 de Suavidad y 270º de Ángulo.


Mini Tutorial de Faux Invertido

Usa la Herramienta Texto Herramienta Texto e introduce tu texto principal encima y centrado en tu figura del sello. Para el ejemplo usé la fuente Georgia negrita-itálica, pero puedes usar cualquier fuente que sea de tu agrado (las fuentes serif tradicionales se ven bien en los sellos). Dale un color similar en hue, pero un poco más oscuro al color de tu figura del sello, en este caso vamos a usar #DDA600.

Copia el texto (Ctrl+C) y pégalo (Ctrl+V) y muévelo una capa hacia abajo (Ctrl+?). Usando las flechas de tu teclado, sube el nuevo texto dos píxeles, dale un relleno negro, y pon su opacidad en 50%.

Repite los pasos anteriores pero ahora mueve el texto dos píxeles abajo y ponle un relleno color blanco, igual con la opacidad en 50%.

NOTA: Ésta técnica para dar el efecto de relieve funciona mucho mejor en elementos gráficos sólidos y pequeños. Tuve que encontrar éste técnica porque el filtro de Bisel y Relieve que viene con Fireworks es de muy mala calidad. Si quieres dar efecto de bisel todo lo que tienes que hacer es intercambias los dos colores del fondo.


Palabras que dan la Vuelta

Para la pièce de résistance, vamos a poner un texto acompañando a nuestro sello siguiendo una guía circular, muy similar a los sellos dorados que vemos en certificados o documentos legales.

Usa la Herramienta Elipse Herramienta Elipse para crear un círculo exterior, centrado sobre la figura del sello. Después, usando la Herramienta Texto crea un par de textos centrados y justificados que formarán las partes del texto que rodeara el sello. Céntralos horizontalmente sobre el círculo que acabas de crear, alinea la parte superior del primer texto con la parte superior del círculo, y alinea la parte inferior del segundo texto, con la parte inferior del círculo.

Después de esto, crea un nuevo círculo más pequeño que el anterior, con su parte superior tocando el inferior del primer texto y su parte inferior tocando por arriba al segundo texto. Esto hará que tus textos estén perfectamente alineados a los trazados concéntricos una vez que los unamos a los círculos.

Una vez que tengas todo alineado, selecciona la primera parte del texto y el círculo interior, y únelos al trazado (Texto > Unir al Trazado; Ctrl+Shift+Y). Una vez que el texto esté unido al trazado del círculo, ajusta el Desplazamiento de Texto o la Posición del Texto sobre el Trazado hasta que esté bien centrado. Repite lo mismo con la segunda parte del texto, pero ahora lo harás con el círculo exterior, y aparte invertirás la dirección del texto (Texto > Invertir dirección) para que el texto se mueva dentro del círculo.

Para terminar, ajusta la distancia de las letras en tus textos para que ocupen la cantidad de espacio suficiente. Dale a tus textos un color similar a la de tu figura del sello, con la suficiente oscuridad o brillantez para generar un contraste con el fondo.


Tips para su Uso

Cuando hayas terminado, selecciona todos los objetos de tu lienzo (Ctrl+A) y crea un símbolo con ellos (F8). Debido a algunos detalles con el Fireworks cuando escalas o rotas figuras con gradientes y textos sobre trazados, te convendrá allanar todas las capas de tu nuevo símbolo (Ctrl+Shift+Alt+Z) antes de aplicar cualquier transformación. También, dependiendo de la situación, te convendría ajustar la intensidad de la sombra para hacer que tu sello destaque más.

Creando Sellos Dorados


NOTA: El autor de éste tutorial no se hará responsable por ninguna consecuencia legal que pueda surgir por el mal uso del mismo, incluyendo pero no limitado a falsificación de documentos oficiales.



Éste tutorial es una traducción de Rapid Fire #2: Golden Seal.

Creado por:
Six Things


]]>
Leyendo tu Ipod con Perl (Parte 1) http://perlenespanol.baboonsoftware.com/tutoriales/misc/leyendo_tu_ipod.html Aprende como puedes leer tu Ipod desde Perl. En este tutorial te muestro como crear un sencillo scipt de Perl que lee tu Ipod y crea un archivo XML con el listados de las canciones que tienes en él. Misc Uriel Lizama 2006-10-11T12:58:43-06:00 Aprende como puedes leer tu Ipod desde Perl. En este tutorial te muestro como crear un sencillo scipt de Perl que lee tu Ipod y crea un archivo XML con el listados de las canciones que tienes en él. Hace poco me compré un Ipod, de esos blancos que pueden contener cerca de 80GB de música. Como uso Windows me descargué el Itunes que es el que uso para transferir datos a mi Ipod.

Itunes funciona muy bien, siempre y cuando sea cuestión de pasar datos al Ipod, el problema viene cuando quieres leer tu Ipod. Pero como siempre, viene Perl al rescate.

Perl al Rescate

Es increíble la cantidad de cosas para la que podemos usar Perl, basta con entrar a CPAN y realizar búsquedas de temas extraños, y de seguro vas a encontrar por lo menos un módulo para ello.

En CPAN podremos encontrar varios módulos que nos sirven para leer nuestro Ipod y realizar operaciones con él. Me puse a checar todos hasta que encontré el módulo Mac::Ipod::GNUpod. Éste módulo es el más completo de todos, y te permite leer Ipods formateados ya sea con Itunes o con GNUpod.

El módulo tiene un sin fin de opciones que te permite hacer básicamente de todo con tu Ipod, puedes formatearlo, inicializarlo, leerlo, transferir archivos, etc.

Leyendo nuestro Ipod

Para este tutorial vamos a aprender a leer nuestro Ipod, y vamos a desplegar nuestras canciones en un sencillo formato XML.

Lo primero que vamos a hacer es crear un nuevo objeto 'Mac::Ipod::GNUpod':

my $ipod = Mac::iPod::GNUpod->new(mountpoint => 'I:');

Es muy importante el 'mountpoint' pues eso le indica a nuestro módulo en que lugar está montado nuestro Ipod. En Windows será una letra de disco (D:,E:,F:,etc.) y en Unix será algo así como '/mnt/ipod'.

Si alguna vez has navegado a través de los archivos de tu Ipod, verás que no simplemente son copiados los archivos, sino que el Ipod los distribuye a través de carpetas con nombres raros. Lo que hace el Ipod es crear un database con todas las canciones, entonces, ya que tenemos nuestro objeto creado, ahora hay que leer el database de nuestro Ipod.

Como mi Ipod yo lo inicialicé con Itunes, entonces el database estará en tipo Itunes por lo que para cargarlo tengo que usar la siguiente línea:

$ipod->read_itunes;

En caso de que estés en UNIX con GNUpod entonces deberás de hacerlo con:

$ipod->read_gnupod;

Dependiendo del tamaño de tu database y de la velocidad de conexión con tu Ipod será el tiempo que le tomará a tu script cargar el database completo.

Una vez que lo hemos cargado entonces ya podemos empezar a hacer cosas con él. Por ejemplo, vamos a tomar un listado de todas las canciones en nuestro Ipod:

my @songs = $ipod->all_songs;

Nuestro array @songs tendrá la lista completa de los IDs de cada una de las canciones en nuestro Ipod, pero tener una lista de números no es para nada útil, sin embargo los podemos usar para cargar los datos de cada uno de los mp3 del Ipod, para hacerlo usamos la función get_song():

my $mp3 = $ipod->get_song([ID_CANCION]);

El valor [ID_CANCION] es el id de la canción de la cual queremos los detalles. Al final tendremos en nuestra variable $mp3 una referencia a un hash con todos los detalles de nuestra canción, por ejemplo, para imprimir el título podríamos hacer:

print $mp3->{title};

Ahora, tenemos un detalle muy importante y que debemos de tener en cuenta porque después podría ocasionar resultados no deseados. Todos los campos del hash con los detalles de nuestra canción no son cadenas, sino son objetos de tipo Unicode::String, y aunque tiene los métodos necesarios para varias operaciones, podría no estar en la codificación que quieres, por eso es mejor hacer lo siguiente:

my $title = $mp3->{title}->as_string;

Así $title tendrá la cadena del título, de lo contrario se haría una copia del objeto Unicode::String.

Los valores posibles que nos regresará la canción son los siguientes:

id
artist
album
title
songnum
songs
cdnum
cds
composer
year
genre
fdesc
filesize
bitrate
time
srate
playcount
path
orig_path

En caso de que no exista algún valor retornará nulo.

Creando nuestro XML

Ya sabemos como leer nuestro Ipod, ahora vamos a crear nuestro sencillo XML. Para ello vamos a usar el módulo XML::Simple, éste módulo nos permite leer y escribir archivos de tipo XML de manera sencilla.

Para que el módulo haga el dump en XML debemos de pasarle una referencia a nuestro hash, para ello vamos a hacer un nuevo hash:

my %Song;

Vamos a crear una llave MP3 con una referencia a un array anónimo:

$Song{'MP3'} = [];

El array lo iremos llenando con los detalle de cada canción. De ésta manera nos quedará una estructura bien definida.

Ahora haremos el loop a través de los ids de nuestras canciones:

for my $id(@songs){

}

Vamos a tomar los detalles de cada una de las canciones o MP3:

my $mp3 = $ipod->get_song($id);

Y ya con eso podemos agregar un nuevo elemento a nuestro hash:

        push(@{$Song{'MP3'}},
                     {
                      ID      => $id,
                      Titulo  => $mp3->{title}->as_string,
                      Artista => $mp3->{artist}->as_string,
                      Album   => $mp3->{album}->as_string
                     }  );

Agregamos un nuevo elemento a nuestro array anónimo definido en la llave MP3 de nuestro hash MP3. El nuevo elemento será una referencia a un hash anónimo con las llaves que queremos mostrar.

Tu podrás editar las llaves que quieres pasar de acuerdo a los detalles que quieres mostrar en tu archivo XML.

Finalmente le pedimos al módulo XML::Simple que haga el dump de nuestra variable en un archivo de tipo XML:

my $xsimple = XML::Simple->new();

open my $XML, '>:encoding(iso-8859-1)', 'mi_ipod.xml' or die "No se pudo abrir archivo: $!";

print {$XML}
$xsimple->XMLout(
           $Song,
           noattr     => 1,
           AttrIndent => 1,
           RootName   => "Ipod",
           KeyAttr    => { 'MP3' => 'ID' },
           xmldecl    => '<?xml version="1.0" encoding="iso-8859-1" ?>'
          );

close $XML;

La Salida de XML

Si todo te funciona bien, entonces tendrás un archivo XML llamado "mi_ipod.xml" con entradas que se van a ver algo así:

<Ipod>
  <MP3>
    <ID>4228</ID>
    <Album>High Hopes</Album>
    <Artista>Pink Floyd</Artista>
    <Titulo>A Great Day for Freedom</Titulo>
  </MP3>
</Ipod>

Código Final

ipod2xml.pl

#!/usr/bin/perl

use strict;

use XML::Simple;
use Mac::Ipod::GNUpod;


my $ipod = Mac::iPod::GNUpod->new(mountpoint => 'I:');

   $ipod->read_itunes;

   my @songs = $ipod->all_songs;

    my %Song;
       $Song{'MP3'} = [];

    for my $id(@songs){

        my $mp3 = $ipod->get_song($id);

        push(@{$Song{'MP3'}},
                     {
                      ID      => $id,
                      Titulo  => $mp3->{title}->as_string,
                      Artista => $mp3->{artist}->as_string,
                      Album   => $mp3->{album}->as_string
                     }  );
    }


my $xsimple = XML::Simple->new();

open my $XML, '>:encoding(iso-8859-1)', 'mi_ipod.xml' or die "No se pudo abrir archivo: $!";

print {$XML}
$xsimple->XMLout(
           $Song,
           noattr     => 1,
           AttrIndent => 1,
           RootName   => "Ipod",
           KeyAttr    => { 'MP3' => 'ID' },
           xmldecl    => '<?xml version="1.0" encoding="iso-8859-1" ?>'
          );

close $XML;

]]> Fotografías Realisticas con Fireworks 8 http://perlenespanol.baboonsoftware.com/tutoriales/fireworks/fotografias_rea.html Haz tus fotografías digitales más realistas y convincentes con algunos gradientes y unas sombras customizadas. Una vez que hayas finalizado, tus fotografías se verán como fotos reales, y se verán como si salieran de tu pantalla. Fireworks SixThings 2006-09-19T11:38:18-06:00 Haz tus fotografías digitales más realistas y convincentes con algunos gradientes y unas sombras customizadas. Una vez que hayas finalizado, tus fotografías se verán como fotos reales, y se verán como si salieran de tu pantalla.

]]>

Haz tus fotografías digitales más realistas y convincentes con algunos gradientes y unas sombras customizadas. Una vez que hayas finalizado, tus fotografías se verán como fotos reales, y se verán como si salieran de tu pantalla.


Notas Iniciales

Éste tutorial fue creado con Adobe Fireworks 8 y requiere conocimiento de rellenos gradientados y del uso de la Herramienta Pluma.

Al final del tutorial tendrás imagenes que se ven totalmente realisticas:

Fotos Realistas


Preparando la Foto

Primero vamos a crear la base de la fotografía. Usa la Herramienta Rectángulo Herramienta Rectángulo para dibujar un rectángulo con más o menos las proporciones de una impresión 4R. Después usa un relleno gradientado que cruce diagonalmente, de blanco puro a un blanco sucio. Esto será el rectángulo de base.

Ahora crea otro rectángulo, ésta vez con un color sólido, un poco más pequeño que el anterior y céntralo encima de nuestro rectángulo base. Éste nuevo rectángulo nos servirá como la máscara de nuestra imagen y para crearle un buen borde.

Como siguiente paso vamos a importar nuestra imagen (Ctrl+R) al documento actual, y ponerle una opacidad de 30%. Al hacer esto será mucho más fácil acomodar la imagen sobre el rectángulo que vamos a usar para la máscara. Ten cuidado en que ninguna parte del rectángulo que vamos a usar como máscara sobresalga a la imagen.


NOTA: Antes de hacer cualquier transformación a una imagen importada, conviértela primero en un símbolo (F8). De ésta manera mantendrás la información de la imagen original que normalmente perderías al cambiar su tamaño o rotarla.

Una vez que estés satisfecho con los ajustes, regresa su opacidad a 100% a corta la imagen (Ctrl+X). Selecciona el rectángulo que vamos a usar como máscara y pega tu imagen dentro de él (Ctrl+Shift+V). ¡Ahora ya tenemos completa nuestra base de fotografía!


Luces y Sombras

Ahora vamos a empezar con el realismo. Selecciona y copia tu rectángulo base (Ctrl+C) en el layer más alto. Cambia su gradiente para que vaya de negro (100%) a negro (0%), y pon la opacidad en 50%. Ajusta el gradiente para que cubra solamente la esquina superior del rectángulo base. Baja el tamaño del ancho y alto del nuevo rectángulo en 2px, y céntralo en el rectángulo base; esto dará la sensación de una orilla iluminada contra una sombra gradientada.

Clona el rectángulo que acabas de crear (Ctrl+Shift+D) y rota el nuevo rectángulo 180º (Modificar > Transformar > Rotar 180º). Ahora, cambia su gradiente, que vaya de blanco (100%) a blanco (0%) y pon su opacidad en 100%; esto produce el efecto de una iluminación gradientada y una orilla con sombra.


Nada como una buena sombra

Selecciona todos los objetos en tu documento y rótalos (Ctrl+Shift+T, Girar) 12 ó 15º a la derecha. Esto le dará a tu imagen una posición más natural y espontánea. Además, esto pone los efectos que hicimos antes uno arriba del otro, como si estuvieran alineados con una fuente de luz.

Ahora para el elemento final: vamos a agregar nuestra sombra. Pero en vez de usar el efecto de Sombra que viene con el programa, haremos uso de una técnica mucho más flexible.


Mini-Tutorial: Sombra Natural

Empezaremos por clonar nuestro rectángulo base y moviendo la copia al layer más bajo (Ctrl+Abajo). Vamos a darles algunas características de sombra con un relleno sólido color negro, 60% de opacidad, un efecto Desenfoque gaussiano (Radio de desenfoque: 4). Ponlo unos 10 píxeles abajo para que la sombra coincida con la posición de nuestra fuente de luz.

Desagrupa el "rectángulo de sombra" (Ctrl+Shift+G) para convertirlo en un trazado editable. Usa la Herramienta Pluma Herramienta Pluma para agregar unos puntos Bézier en él, uno en cada lado. Esto ayudará a quitar un poco la dureza que las imágenes digitales normalmente tienen, y permitirte crear sombras más naturales.

Ahora, acomoda los puntos de las sombras para que los puntos Bézier estén alineados con las orillas del rectángulo base. Jala cada punto de las esquinas un poco más abajo para enfátizar el levantado de las esquinas de la fotografía.

Selecciona todo lo del documento y Agrúpalo (Ctrl+G). Ahora tu imagen está lista para ser usada.


Toques Finales

Después de seleccionar un fondo para tu fotografía, necesitarás hacer unos pequeños ajustes en la opacidad de tus sombras y luces. También, si cambias de parecer en cuanto a la posición de la fuente de luz, tendrás que hacer que la dirección de tus gradientes y la forma de la sombra customizada se conforme a ella. En el ejemplo que vimos, le dí al rectángulo base un poco de redondez en las esquinas para que parezca más percudido.



Éste tutorial es una traducción de Rapid Fire #1: Photo-Realistic.

Creado por:
Six Things


]]>
Perl Básico - Parte 1 http://perlenespanol.baboonsoftware.com/tutoriales/aprendiendo_perl/perl_basico_parte_1.html La primera parte de tres acerca de Perl Básico. Con éste tutorial aprenderemos las bases del lenguaje de programación Perl, en ésta primera parte veremos los temas: Historia de Perl, Variables y Operadores.... Aprendiendo Perl Uriel Lizama 2006-08-08T16:04:02-06:00 La primera parte de tres acerca de Perl Básico. Con éste tutorial aprenderemos las bases del lenguaje de programación Perl, en ésta primera parte veremos los temas: Historia de Perl, Variables y Operadores.

Historia de Perl

Como primer tema de ésta parte vamos a ver un poco de los inicios de Perl, no va a ser muy extenso pues es algo trivial; simplemente para entender un poco sus comienzos.

Muy bien, antes que nada el lenguaje se llama Perl, solamente la primera P se pone en capitulares. Tradicionalmente el programa que ejecuta los scripts de Perl se llama perl, todo en minúsculas. Esto nos servirá para más adelante diferenciar entre el lenguaje y el programa.

El lenguaje Perl toma su nombre de Practical Extraction and Report Language y fue ideado por Larry Wall. La primera versión sale en el año de 1987.

Originalmente Larry Wall lo describe como un excelente lenguaje optimizado para leer archivos de texto, extraer información de esos archivos y crear reportes basados en esa información, combinando lo mejor de C, sed, awk y sh. Para los que conocen alguno de los lenguajes y herramientas antes mencionados, se podrán dar cuenta que la sintáxis del lenguaje es muy similar y no tendrán mucho problema en adoptarlo.

Perl se considera un lenguaje interpretado, es decir, no es necesaria una previa compilación para poder ejecutarse, lo único que se necesita es darle al interprete, perl, el código que queremos que ejecute.

Desde sus inicios Perl ha avanzado mucho y ahora se encuentra en la versión 5 con la versión 6 en pleno desarrollo.

Cabe mencionar que Perl hoy en día es usado para una gran variedad de cosas, desde avanzados programas de seguridad hasta sencillos CGIs para administrar formularios. Uno de los fuertes de Perl es la existencia de CPAN, un directorio de módulos que podemos integrar a nuestros scripts para facilitarnos la vida.

CPAN es definitivamente uno de los íconos representativos de Perl, otros lenguajes (proyectos) han querido implementar algo similar, pero han fallado. Perl lleva a CPAN desde su nacimiento. La filosofía comunitaria de Perl ha hecho de CPAN lo que es ahora, es el centro de distribución comunitario de paquetes que ningún otro lenguaje ha tenido. Sin duda, CPAN representa todo el trabajo que la comunidad de Perl ofrece, y que a su vez, es una excelente manera de contribuir con algo.

LAS VARIABLES

Éste es nuestro primer tema, y en él vamos a hablar de la pieza fundamental de cualquier lenguaje de programación: las variables.

¿Qué es una variable?

Una variable como bien dice su nombre es algo que puede "variar". Al nosotros hacer un script no tenemos manera de saber toda la información que vamos a tener, ya sean resultados de sumas, entradas de datos, etc. Para ello usamos las variables, para almacenar todos esos datos.

En Perl hay varios tipos de variables, y les vamos a hechar un vistazo a las mismas:

Las Escalares ($variable)

En Perl la variable básica es la escalar. Ésta variable puede contener cualquier tipo de información ya sean números, letras, cadenas de texto, signos, código ASCII, etc, así como cosas más avanzadas como referencias que veremos más adelante.

Para definir una variable escalar todo lo que tenemos que hacer es:

$variable

El símbolo $ se usa para identificar a nuestra variable, y después podemos usar el nombre que queramos. Para nombrar nuestras variables debemos de seguir algunas de reglas:

  • Nuestras variables únicamente pueden nombrarse con valores alfanúmericos.
     
  • El nombre de nuestras variables son sensibles al uso de mayúsculas y minúsculas, esto significa que las variables $variable y $Variable son dos variables distintas.
     
  • Las variables NO puden comenzar con números, solamente letras o _, ya después se puede usar cualquier cáracter alfanúmerico
     
  • Al definir nuestra variables es buen hábito usar el keyword "my"
     
Muy bien, ahora veamos como podemos definir una variable e iniciarla con un valor:
my $numero = 10;

También podemos definirla primero, y después inicializarla:

    my $numero;
    $numero = 10;
En ambos casos nuestra variable terminará con el valor "10".

Podemos asignar el valor de una variable a otra, por ejemplo:
1
2
3
4
5
6
7
    my $variableA = "Mi Variable";
 
    my $variableB = $variableA;
 
    my $variableC;
 
    $variableC = $variableA;
En la línea 1 definimos e inicializamos la variable $variableA con el valor "Mi Variable".
Luego en la línea 3 definimos e inicializamos la variable $variableB con el valor de $variableA, de ésta manera ambas variable tendrán el mismo valor.
Y en las líneas 5 y 7, definimos la variable, e inicializamos la variable en dos pasos distintos.

En este momento podremos ver que cada línea de código de Perl debe de acabar con un ;

Los Arrays (@array)

Los arrays o arreglos como se les llama comúnmente en español no son exactamente vectores, más que nada se les puede definir como una lista de cosas, éstas cosas pueden ser números, letras, palabras o hasta variables. Este tipo de variable es un punto sumamente fuerte de Perl y que te verás usando más de una vez en tus scripts. Nuestro array se define de la siguiente manera:

my @array;
Vemos que debemos de usar el símbolo @ para definir nuestros arrays.

Como los arrays son listas de cosas, es diferente la manera en que los inicializamos:

my @array = ('Perro','Gato','Gallina','Pez');
Aquí definimos e inicializamos nuestra variable, para definir la lista con la que queremos inicializar a nuestro array, ponemos todos los elementos de la lista entre paréntesis y separando cada elemento por una coma. Aquí como cada elemento de la lista es una cadena de texto, por eso los ponemos entre comillas sencillas, aunque también podrían ser comillas dobles.

La separación es por comas, así que no importa la cantidad de espacios que haya entre cada elemento, a continuación pongo un ejemplo:
1
2
3
4
5
6
    my @array = (
                 'Perro',
                 'Gato',
                 'Gallina',
                 'Pez'
                );
Ya que tenemos una lista de "cosas" cargadas dentro de nuestro array, ahora debemos de poder tomar alguno de estos elementos. A cada elemento dentro de nuestra lista le corresponde un número, basado en su posición dentro de la lista, lo hay que tener en mente, es que Perl empieza a contar los elementos desde 0 NO desde 1.

Por lo que en nuestro array con la lista de animales, el elemento 0 sería "Perro" y el elemento 1 sería "Gato", así sucesivamente.

Para tomar algún elemento de nuestra lista debemos de usar la siguiente sintáxis:

$array[<num_elemento>];
En donde <num_elemento> es un número que corresponde al elemento que queremos tomar, veamos un ejemplo
1
2
3
my @array = ('Perro','Gato','Gallina','Pez');
 
my $animal = $array[3];
En la línea 1 definimos e inicializamos nuestro array, en la línea 3 asignamos el elemento 3 de nuestro array a la variable $animal.

¿Sabes cuál será el valor de nuestra variable $animal?

Si pensaste "Pez" estás en lo correcto.

Los hashes (%hash)

La variable hash o arreglo asociativo es un tipo de variable sumamente especial en Perl, ya que pocos lenguajes cuentan con variables de este tipo. El hash es un tipo de lista por medio de la cual podemos llamar a sus valores con el uso de llaves. Así dependiendo de la llave que se llame será el valor que se retorne.

Entenderemos esto más a fondo ahora que veamos unos ejemplos.

El hash se define de la siguiente manera:

my %hash;
Vemos que el símbolo para diferenciar a las variables de tipo hash es el símbolo %. Ahora, como se explicó nuestro hash es una lista que corresponden a llaves y valores, los hashes los podemos inicializar de dos maneras distintas:
my %hash = ('Uno','One','Dos','Two','Tres','Three');
Parece similar a una array pero hay una gran diferencia, pues realmente lo que ve Perl es lo siguiente:
1
2
3
    Uno  => One
    Dos  => Two
    Tres => Three
Va tomando de dos en dos los elementos, el primer elemento de cada par lo toma como llave, y el segundo elemento como su valor. ¿Por qué se dicen "llaves"? Es debido a que funciona como una llave real, con una llave solamente podemos abrir una puerta, de ésta manera con una llave solamente podremos adquirir un valor.

Para llamar el valor de una de nuestras llaves la sintáxis es:

$hash{<nombre_llave>};
En donde es el nombre de la llave de la cual queremos el valor. Entonces, tomando el hash que tenemos de ejemplo, podemos adquirir el valor de la llave Uno de la siguiente manera:
$hash{'Uno'};
Expliqué que hay dos maneras de inicializar nuestros hashes, y ahora les voy a mostrar la segunda manera. Ésta sintáxis en lo personal me parece mucho más clara, y les recomiendo que la usen:
1
2
3
4
5
6
     my %Animales = (
                 'Perro'   => 'Dog',
                 'Gato'    => 'Cat',
                 'Gallina' => 'Chicken',
                 'Pez'     => 'Fish'
                 );
Vemos como cada par llave-valor es separado por comas, ahora, dentro del par llave-valor se usa la siguiente sintáxis:
<LLAVE>   => <VALOR>
En dónde <LLAVE> es el nombre de la llave, y <VALOR> el valor de la misma. Entonces siguiendo con éste hash de ejemplo, dígamos que queremos saber como se dice "Gallina" en inglés, podríamos entonces hacer lo siguiente:
my $gallina_ingles = $Animales{'Gallina'};
Al pedir el valor de la llave "Gallina" nos dá como resultado "Chicken".

Ahora, que pasa si hacemos lo siguiente:

my $variable = $Animales{'Pez'};
¿Cuál será el valor de $variable?

Si pensaste en "Fish" estás en lo correcto.

Muy bien, ¿por qué cuando llamamos a los valores de nuestro array o hash usamos el símbolo $ en vez del @ ó %?

La razón de esto es que si podemos ver bien, los arrays y los hashes almacenan variables escalares, entendemos como variable escalar todo aquello que sea un número, una cáracter, una cadena de texto, etc. Entonces cuando pedimos algún elemento de nuestro hash o array, estamos pidiendo un valor escalar, es por ello que usamos el

$array[<elemento>]
$hash{<llave>};
Muy bien, ahora voy a enlistar los tipos de variables que faltan. Éstas variables no se van a explicar, pues para entenderlas tendríamos que ver temas más avanzados que se verán en el futuro.

Los FILEHANDLES

Con este tipo de variable podemos hacer llamadas a archivos desde Perl. Éstas variables las conoceremos en el tutorial intermedio cuando aprendamos a leer y manipular archivos.

Los DIRHANDLES

Ésta variable se usa cuando hacemos lectura de un directorio, de igual manera lo veremos hasta el tutorial intermedio.

Los Typeglobs

Un typeglob es una entrada a la tabla de símbolos de Perl, por lo que con un typeglob podemos llamar a todos los tipos de variables de Perl.

OPERADORES DE PERL

Los operadores son instrucciones que se le da a la computadora para efectuar sobre operandos. Los operandos pueden ser desde números hasta palabras.

Perl es uno de los lenguajes que existen con más operadores, y aquí vamos a enlistar todos los que tiene. Podrás ver que los operadores son bastante intuitivos, antes de que se dé la explicación podrás saber la función que realiza el operador.

Operadores Aritméticos

Son los operadores más comúnes e incluyen suma, resta, multiplicación, exponenciación, división y módulo.
    op1 + op2   Suma
    op1 - op2   Resta
    op1 * op2   Multiplicación
    op1 ** op2  Exponenciación
    op1 / op2   División
    op1 % op2   Módulo
Todos los operadores aritméticos son bastante intuitivos y no vale la pena profundizar sobre ello, quizá solamente destacar que el operador de módulo retornará el residuo de un división. Por ejemplo en la operación 9%7 el resultado será 2, ya que 9/7 es igual a 1 con residuo de 2.

Veamos unos ejemplos prácticos del uso de estos operadores:
1
2
3
4
5
6
    my $a = 10;
    my $b = 15;
 
    my $c = $b - $a;  #$c tiene valor de 5
 
    my $d = $a * $b;
Dentro del ejemplo, podrán ver que en la línea 3 hay un texto que viene en verde. Simplemente les comento que eso es un comentario.

Un comentario es un texto al cual perl no le dá importancia y lo ignora por completo. Todos los comentarios de Perl inician con el símbolo de número o gato #.

Operadores Aritméticos Unitarios

Los operadores unitarios actúan sobre un solo operando y básicamente se usan para cambiar el signo de un valor, incrementar el valor o disminuir el valor.
    +op1  Convierte el operando a positivo
    -op1  Convierte el operando en negativo
 
    ++op1 Pre-incremento del operando en uno
    --op  Pre-disminución del operando en uno
 
    op1++ Post-incremento del operando en uno
    op1-- Post-decremento del operando en uno
Si vemos la tabla podremos apreciar que hay pre-operaciones y post-operaciones, ambas realizan los mismo, incrementar o disminuir en una unidad el valor del operando, sin embargo el momento en que lo realizan es diferente.

Las pre-operaciones primero cambian el valor del operando y después lo retornan, por ejemplo:
1
2
3
    my $var = 10;
 
    my $var1 = $var++;
En éste caso al terminar de ejecutar tendremos a $var con un valor de 11 y a $var1 con un valor de 10. Esto es porque debido a que usamos el post-incremento, primero se asigna el valor a $var1 y después se realiza el incremento de $var.

Si usaramos el pre-incremento, ambas variables terminarían con lo mismo valor.

Operadores Lógicos

Los operadores lógicos normalmente los vamos a usar siempre que querramos controlar el flujo de nuestro programa, más adelante que veamos los Enunciados de Control veremos como.
1
2
3
    op1 && op2   Operación AND
    op1 || op2   Operación OR
    !op1         Operación NOT
En sí es sencillo comprender que es un operador lógico, el programa va a realizar una desición en base a dos operandos cuya condición puede retornar verdadero o falso.

Si en algún momento hemos tomado la materia de lógica en la escuela se nos será muy fácil comprender estos operadores. A continuación viene una tabla de resultados de los operadores, en la prímera columna viene el valor del operando1, en la segunda columna del operando2, y en la tercera y última columna el resultado en Verdadero o Falso.
   RESULTADO &&
    OP1     OP2     OP1 && OP2
    0       0       0
    1       0       0
    0       1       0
    1       1       1
 
 
   RESULTADO ||
    OP1     OP2     OP1 || OP2
    0       0       0
    1       0       1
    0       1       1
    1       1       1
 
 
   RESULTADO !
    OP1     !OP1
    0       1
    1       0
Operadores a Nível bit

A continuación viene el listado de cada operador junto con su breve descripción. Cabe destactar que estos operadores solamente funcionan con BITS.

op1 & op2
Este operador AND compara dos bits y retorna un resultado de 1 si ambos bits son 1, de lo contrario regresa 0.

op1 | op2
El operador OR compara dos bits y retorna un resultado de 1 si los bits son complementarios, de lo contrario regresa 0. op1 ^ op2
El operador OR EXCLUSIVO compara dos bits y retorna un resultado de 1 si alguno o ambos bits son 1, de lo contrario retorna 0.

-op1
Este operador se usa para invertir todos los bits del operando. op1 >> op2
El operador de DESPLAZAMIENTO A LA DERECHA mueve todos los bits a la derecha, se deshace del bit de la extrema derecha y asigna 0 al bit de la extrema izquierda, esto hace que cada movimiento divida a op1 a la mitad.

op1 << op2
El operador de DESPLAZAMIENTO A LA IZQUIERDA mueve todos los bits a la izquierda, se deshace del bit de la extrema izquierda y asigna 0 al bit de la extrema derecha, esto hace que cada movimiento multiplique a op1 en 2.

Operadores Relacionales Numéricos

Estos operadores se usan para verificar la relación que hay entre dos operadores númericos. Ya sea igualdad, mayor o menor, etc op1 == op2
Este operador retornará verdadero si ambos operadores son verdaderos. Por ejemplo, lo siguiente es verdadero: 7 == 7

op1 != op2
La contraparte del operador anterior, esto regresará verdadero si los operadores no son iguales. Por ejemplo, lo siguiente retornará verdadero: 6 != 7

op1 < op2
El operador retornará verdadero si op1 es menor a op2. Por ejemplo 2 < 6 es verdadero.

op1 <= op2
El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo 4 <= 4 y 4 <= 5 son verdaderos.

op1 > op2 El operador retornará verdadero si op1 es mayor a op2. Por ejemplo 6 > 5 es verdadero.

op1 >= op2
El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo 8 >= 8 y 8 >= 4 son verdaderos.

op1 <==> op2
Este operador es algo diferente pues en vez de dos posible retornos, tiene 3. El operador retorna 1 si op1 es mayor a op2, 0 si op1 es igual a op2, y -1 si op1 es menor a op2.

Operadores Relacionales de Cadena

Estos operadores se usan para verificar la relación entre dos operandos de cadena, los operandos de cadena se consideran aquellos que NO son númericos. op1 eq op2
El operador retornará verdadero si op1 es igual a op2. Por ejemplo "c" eq "c" es verdadero.

op1 ne op2
El operador retonará verdadero si op1 no es igual a op2. Por ejemplo "a" ne "b" es verdadero.

op1 lt op2
El operador retornará verdadero si op1 es menor a op2. Por ejemplo "a" lt "b" es verdadero.

op1 le op2
El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo "a" le "b" y "a" le "a" son verdaderos.

op1 gt op2
El operador retornará verdadero si op1 es mayor a op2. Por ejemplo "z" gt "a" es verdadero.

op1 ge op2
El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo "z" ge "y" y "z" ge "z" son verdaderos.

op1 cmp op2
El operador tiene tres posible retornos. 1 si op1 es mayor a op2, 0 si op1 es igual a op2 y -1 si op1 es menor a op2.

Operador Ternario

El operador ternario es sumamente útil en Perl y realmente es una secuencia de operadores, su sintáxis es como sigue:

CONDICION ? PARTE-VERDADERA : PARTE-FALSA
Lo que te permite el operador es evaluar la CONDICION y dependiendo de si es verdadera o falsa se regresará la parte que corresponda. Esto se podrá comprender más con un ejemplo:
my $num = 10;
my $var1 = ($num > 5) ? "Mayor" : "Menor";
Lo que estamos haciendo es realizando una asignación a la variable $var1 dependiendo de la condición. En este caso la condición es ($num > 5), si esto resulta verdadero, la palabra Mayor se asignará a la variable, de lo contrario será la palabra Menor.

Este operador se podrá comprender más a fondo cuando veamos los enunciados de control en la siguiente parte del tutorial.

Operador de Rango (..)

El operador de rango nos resulta sumamente útil cuando queremos crear arrays con valores contiguos. Por ejemplo, dígamos que queremos crear un array con los números del 1 al 10, uno estaría tentado a hacerlo de la siguiente manera:

my @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
NOTA: Vemos como no usamos comillas para los valores en este caso debido a que los elementos son números NO cadenas de texto

Esto resulta sumamente impráctico, y más si queremos asignar mucho más números. Pero esto es posible comprimirlo usando el operador de rango:

my @array = (1..10);
Ahora tendremos nuestro array con la lista de números del 1 al 10.

Pero aparte el operador es inteligente, entonces si hacemos algo así:

my @array = (01..10);
Nuestro array contendrá correctamente los valores 01,02,03,04,05,06,07,08,09,10.

Ahora veamos que pasa si usamos letras:

my @array = ('a'..'e');
El resultado es justo como lo queremos a,b,c,d,e.

Pongamos ahora en prueba a Perl, ¿te puedes imaginar los valores que resultarían de lo siguiente?:

my @array = ('aa'..'af');
Los valores serían aa,ab,ac,ad,ae,af.

Operador de Concatenación

Muchas veces no queremos sumar ni restar, o realizar ninguna operación entre dos operandos, sino que queremos "pegarlos''. Para eso tenemos el operador de concatenación.

Este operador es un simple punto . y funciona de la siguiente manera:
1
2
3
4
    my $saludo = "Hola me llamo ";
    my $nombre = "Uriel";
 
    my $frase = $saludo . $nombre;
Como resultado nuestra variable $frase tendrá el valor "Hola me llamo Uriel". Pero, que pasa si combinamos números con cadenas:

my $edad = "Tengo " . 21 . " años".
Como resultado en la variable $edad tendremos el valor "Tengo 21 años", pues Perl realiza la conversión del número 21 a una cadena detrás de las cortinas de manera automática.

Operador de Repetición

Este operador lo usamos para duplicar una cadena n número de veces. El operador se define con una x, por ejemplo:

my $var = "A" x 6;
Esto genera el valor AAAAAA.

Operadores de Asignación

A través de todo el tutorial hemos estado usando el operador de asignación básico =. Ahora veremos que hay más maneras de asignar un valor a una variable.

Por ejemplo, dígamos que tenemos algo así:
1
2
3
4
    my $var = 1;
    my $num = 20;
 
    $var = $var + $num;
Al final obtendremos el valor 21 en nuestra variable $var, pero esto se ve demasiado repetitivo y tedioso, y pues como siempre, Perl tiene una manera más simple de realizar las cosas, pues esto lo podríamos lograr más sencillamente usando alguno de los operadores de asignación.

$var += $num;
Vemos como estamos usando un diferente operador de asignación +=. Este operador lo que hace es sumar el valor de la derecha a nuestra variable de la izquierda.

Hechemos una vistazo a otro ejemplo para entender un poco más. Lo más seguro es que sepas el valor final de nuestra variable con solo verlo, pues Perl es muy intuitivo:

my $num = 5;

$num -= 4;
¿Puedes suponer que valor tendrá $num?

Si dijiste 1 estás en lo correcto.

Aquí está la lista de todos los operadores de asignación disponibles:
    var = op1;
    var += op1;
    var -= op1;
    var *= op1;
    var /= op1;
    var %= op1;
    var .= op1;
    var **= op1;
    var x= op1;
    var <<= op1;
    var >>= op1;
    var &= op1;
    var |= op1;
    var ^= op1;
Orden de Precedencia

Muchas veces nos encontraremos usando varios operadores en una misma expresión.

my $var = 10 + 5 * 4 / 2;
Si esto sucede, ¿qué operadores se ejecutan primero? Para esto Perl tiene un orden de precedencia, es un orden establecido en donde podemos ver que operadores se ejecutan primero y cuales al final. Es sumamente importante que tengamos siempre presente esto o si no nos encontraremos con resultados innesperados.

Aquí va una tabla con los operadores más usados ordenados por precedencia:
    (), [], {}    LLamadas a funciones, paréntesis
    ++,--         Incremento y decremento
    **            Exponenciación
    *,/,%,x       Multiplicación,división,módulo,repetición
    +,-,.         Suma, resta, concatenación de cadena
    &&            AND lógico
    ||            OR lógico
    ..            Operador de rango
    =             Operadores de asignación
Cabe destacar que la tabla para nada está completa, faltan muchos operadores, los cuales se podrán ver en la documentación de Perl. Simplemente se enlistaron los más comúnes.

Viendo la tabla ¿te podrías imaginar el resultado de la siguiente operación?:

my $num = 10 + 4 / 2;
Si dijiste que 7 estás incorrecto, el resultado será 12. La razón de esto es que si vemos la tabla de precedencia podremos ver que la división tiene más precedencia que la suma, por lo que la primera operación que se realiza es es 4/2, por lo que después se realiza 10+2.

Pero ¿qué pasa si queremos que se ejecute la suma primero? Para eso nos sirven los paréntesis que tienen la mayor precedencia:

my $num = (10 + 4) / 2;
Ahora sí, como los paréntesis ocupan el primer lugar de precedencia lo primero que se ejecuta es 10+4 y después 14/7.

Realmente es sencillo, solamente hay que recordar en todo momento los níveles de precedencia, y SIEMPRE que haya alguna duda, usa los paréntesis.

Así finalizamos con los operadores.

Podrán pensar que es demasiada información, pero como dije al principio, son bastante intuitivos, se terminarán acostumbrando a ellos, pues junto con las variables, esto es lo más básico de Perl.

Así termina la primera sesión del tutorial Perl Básico.

]]>
PDL (Perl Data Language) http://perlenespanol.baboonsoftware.com/tutoriales/modulos/pdl_perl_data_language.html Una breve introducción a PDL. En este tutorial aprenderemos para que sirve mediante a un ejemplo práctico así como sus ventajas y desventajas.... Módulos Joaquin Ferrero 2006-06-09T15:13:14-06:00 Una breve introducción a PDL. En este tutorial aprenderemos para que sirve mediante a un ejemplo práctico así como sus ventajas y desventajas.

]]>

Introducción

El PDL (Perl Data Language) es un conjunto de módulos que le dan a Perl la facultad de realizar operaciones matemáticas en conjuntos matriciales de datos de cualquier dimensión. Y, según los recursos disponibles, de cualquier tamaño. Se podría decir que es una librería matemática para el lenguaje Perl.


Por qué usar PDL

Ya sabemos que nuestro querido Perl es un lenguaje interpretado y, por tanto, tiene esa mala fama de ser lento. Me refiero al momento de la ejecución del programa. Sabemos que si tenemos que procesar miles, millones o incluso miles de millones de datos, el hacerlo con un programa interpretado será desperdiciar recursos, frente a una solución compilada, como puede ser C o C++.

Pero Perl tiene algo a lo que no podemos resistirnos: su rapidez en la producción de una solución. Perl nos permite tener un programa listo para correr en muy poco tiempo. No hay que compilar nada y su lenguaje de muy alto nivel nos permite dar una solución en muy pocas líneas de código, según nuestro nivel de experiencia con él. Así que tendemos a resolver todos los problemas con Perl. Y con los ordenadores modernos, una solución interpretada es válida en muchísimos casos.

Entonces, si Perl es interpretado, no puede ayudarnos a resolver un problema que requiere una solución compilada para la máquina en la que se va a correr. Como mucho, Perl podría llamar a un programa de procesado, un programa externo a nuestro script. Pero eso se traduce también en una solución lenta, ya que se pierde un poco de tiempo, en el sistema, para llamar a un nuevo programa, pasarle los argumentos y esperar su resultado. Lo ideal es que Perl pueda tener su propio librería compilada de procesado de datos y ser él mismo el que haga todos los procesos.

PDL viene a llenar este hueco. Nos permite manejar millones y millones de datos con la sintaxis de Perl.


Ejemplo: Nubosidad

Se describe a continuación un ejemplo de aplicación de Perl con la librería PDL. El ejemplo es de grado medio, medio-alto. Aunque el lenguaje Perl utilizado es sencillo, la parte de PDL es muy especial, pero, con sólo leerlo, puede dar una idea de lo que se puede hacer con PDL. No se trata de un ejemplo para empezar a trabajar con PDL.

El ejemplo propuesto trata de resolver el siguiente problema:
Trabajamos en un departamento que se dedica a la investigación del clima y la vegetación.

Una de las rutinas normales del trabajo es la del procesado de imágenes de satélites de baja órbita. Estos satélites se caracterizan por una alta resolución (250m/pixel). Uno de las productos que se pueden sacar de estas imágenes es el nivel de nubosidad que existía en el momento en que el satélite hizo la pasada por encima de una determinada zona a analizar.

Definimos nubosidad como el porcentaje de píxeles de una comarca que están despejados de nubes con respecto al total de píxeles que cubre esa comarca. Saber la nubosidad es importante porque luego podremos deducir cálculos de índice de vegetación y riesgo de incendios.

La misión es: tenemos una serie de imágenes, todas ellas de la misma zona del planeta, de un tamaño de 6144 por 4096 píxeles, y de dos bytes por pixel cada uno, donde esos bytes pueden ser 0 si en ese pixel había una nube y un valor mayor que 0 si estaba despejado. Hay que calcular el índice de nubosidad para todas las comarcas de esa zona, por cada una de las imágenes.

Naturalmente, para saber dónde están las comarcas necesitamos un mapa. El mapa es otra imagen del mismo tamaño que las anteriores, donde cada pixel es de un byte, con un valor que representa el número de comarca. Si hubiese un 0, es que ese pixel pertenece a otro país o al mar.


Problemas...

Bueno, como hay que procesar una serie de imágenes y sacar un informe para cada una de ellas, enseguida pensamos en Perl. Pero... ¡cada imagen tiene más de 24 millones de píxeles!. Aunque no hay que hacer ninguna operación matemática, el simple hecho de recorrer 24 millones de puntos en un bucle en Perl... puede hacerse eterno (desde el punto de vista del ordenador). Y el enunciado del problema no comenta el número de imágenes a procesar... pueden ser dos o doscientas... Y si hay otra persona o programa esperando los resultados... mal vamos. Hay que buscar una solución más rápida.


PDL al rescate

La operación a realizar en todos los píxeles es sencilla: saber cuántos píxeles de una zona son mayores que 0. Y luego dividirlo por el número de píxeles del total de la zona.

Lo vamos a expresar bien: queremos saber lo despejada que es una comarca, es decir, cuántos píxeles de la imagen que pertenecen a esa comarca son mayores que 0. Y esto, repetirlo para todas las comarcas y para todas las imágenes.


Empezamos

El código que resuelve el problema está al final del artículo. Lo vamos a comentar línea a línea.

Al principio, en la línea 1, activamos el sistema de avisos (warnings) con la opción -w.
Se podría haber colocado un use warnings; en el código, pero poniéndolo arriba del todo, nos avisará de cualquier posible fallo, incluído en todos los módulos que usemos.

En las líneas 8 y 9 incorporamos a nuestro programa toda la sabiduría de los módulos PDL y PDL::IO::FastRaw. El primero es obligatorio si vamos a usar alguna de las funciones de la librería PDL, y el segundo lo necesitamos para poder leer ficheros de forma muy rápida.

La línea 10 nos obliga a programar de forma cuidadosa...

De la línea 12 a la 15 inicializamos algunas constantes. Se podrían haber definido con use constant ... pero el programa es tan pequeño que no merecía la pena tener tanto cuidado. No vamos a cambiarlas a lo largo del programa.
Aparte del $ancho y $alto de las imágenes y del $directorio donde están almacenadas, tenemos puesto el nombre del fichero que guarda la posición de cada una de las comarcas.

En la línea 17 nos colocamos en nuestro directorio de trabajo... o morimos en el intento.
En la 19, quitamos el buffer de salida. Todos los mensajes de los print saldrán inmediatamente a pantalla (y fichero).

De la 20 a la 22 tenemos las variables que vamos a usar:

@comarcas es un array que guarda el código de cada comarca. Por ejemplo, $comarca[32] puede tener el código 452, indicando que ese es el número de código para la comarca 31ª. @indices_comarcas es un array que guarda apuntadores a cada uno de los píxeles que forman las comarcas. Esto hay que explicarlo un poco: necesitamos saber dónde está (qué píxeles forman) la comarca 31ª. Pues en $indices_comarcas[32] guardaremos un objeto que tendrá todos esos píxeles. Pueden ser un píxel o un millón. Nos da igual. Realmente, lo que estamos guardando es la posición (offset) desde el principio de la imagen de todos esos píxeles. El primer pixel de la imagen será el 0, luego el 1, etc. etc. hasta el 24 millones. Nosotros guardamos esas posiciones. Una comarca que tuviera sólo 3 píxeles, podrían ser por ejemplo, el 653711, el 653712 y el 659855 (por estar en la línea de abajo de los otros dos). @pixeles_comarcas es un array para ahorrar un poquito de tiempo... va a guardar cuántos píxeles hay por cada comarca. Podríamos habernos ahorrado esta variable, pero ya digo que es por ahorrar un poco (realmente muy poco) tiempo de procesado.


Comenzamos con los preparativos

En la línea 25 nos leemos el fichero del mapa de comarcas.
Utilizamos la función mapfraw, sacada del módulo PDL::IO::FastRaw. Esta función NO lee un fichero. Lo que hace realmente es mapear el fichero a la memoria, es decir, accederemos a la memoria reservada como si estuviera ocupada por el contenido del fichero, pero en realidad, lo que estará haciendo el sistema operativo es acceder al disco duro. Esto nos permite acceder a un fichero muy grande (incluso a veces mucho más grande que la propia memoria del ordenador) sin tener que leerlo enteramente a memoria (porque a veces es imposible, claro).
Para 'leer' el fichero, indicamos las dimensiones de la imagen ($ancho*$alto), el formato de cada pixel (ushort quiere decir un entero de dos bytes, sin signo) y, además, indicamos que no vamos a modificarlo (ReadOnly=>1).
Notar algo especial... hasta ahora hemos hablado de imágenes, zonas, comarcas... por lo que estamos pensando en 2 dimensiones (estamos trabajando en superficies)... pero... en nuestro problema, las operaciones que vamos a realizar son a nivel de píxel: lo que ocurre en un pixel no influye en el de al lado... ergo no es necesario tratar los datos como si estuvieran en dos dimensiones. En vez de leer una imagen de dimensiones $ancho y $alto, tenemos en su lugar una matriz de una dimensión, de tamaño $ancho*$alto. Y así trabajaremos con todas las imágenes. Esto acelera mucho más los cálculos (aunque con PDL, se nota poco la diferencia).
Ya se acabó la línea 25... una sola línea que da mucho juego...

En la línea 28 vamos a averiguar todos los códigos de las comarcas. Vamos a usar dos funciones de PDL: uniq y list. uniq nos va a devolver un piddle (ahora mismo lo explico) que contiene todos los valores distintos (únicos) del piddle $imagen_comarca. list transforma ese piddle en una lista normal de Perl.

Ahora es cuando nos encontramos con un nuevo objeto llamado piddle... ¿Qué es un piddle? Pues un piddle es un objeto PDL. Es una 'entidad matemática' que contiene datos numéricos, en una serie de dimensiones. Podría ser un simple valor escalar (un dato en una dimensión), o un hipercubo de un millón de datos, en 6 dimensiones.

Al final, como resultado, tenemos en @comarcas todos los números distintos que hemos encontrado en el mapa de comarcas. Y además, ordenados, de menos a mayor.

En la línea 29 quitamos el primer valor del array @comarcas, pues siempre vale 0. Resulta que nos hemos enterado que en el mapa de comarcas sí aparecen valores 0, representando píxeles que son el mar. Y el mar no es ninguna de nuestras comarcas, así que lo quitamos.

De la línea 31 a la 40 vamos a sacar una serie de estadísticas, que nos ayudarán más tarde, comarca por comarca.
En la línea 34 averiguaremos dónde está esa comarca. Usaremos la función which, del PDL. Lo que hace esa función es buscar por toda la $imagen_comarca aquellos píxeles que tienen el código de la comarca que estamos analizando. El resultado es un piddle que guarda las posiciones a todos esos píxeles. Ese piddle lo guardamos dentro del array @indices_comarcas.

Después de saber dónde está la comarca, en la línea 37 sabremos cuántos píxeles la forman. Llamamos de nuevo a una función PDL, nelem, que nos devuelve esa cantidad, y la guardamos en el array @pixeles_comarcas.

La línea 37 sólo es informativa, por si nos interesa ver qué es lo que está haciendo nuestro programa.


Empieza la magia

El bucle que va desde la línea 42 hasta el final recorre todas las imágenes a procesar. Cada $fichero sale del operador diamante, que se utiliza en este caso como un patrón de nombres de ficheros con un carácter comodín. Este patrón se pasa al sistema operativo y este nos devolverá todos los nombres de ficheros que coincidan con ese patrón. Repito: el comodín (*) que usamos ahí no tiene significado en Perl, sino para el sistema operativo.

Después de informar al usuario de la imagen que estamos procesando en ese momento, en la línea 47 la leemos, de la misma forma que hemos hecho antes con la imágen de comarcas. El resultado se guarda en el piddle $imagen_nubosa. Este piddle será una matriz de una dimensión cuyos valores serán 0 para el caso de que el pixel tenga una nube encima o un valor superior si está despejado.

En las líneas 51 y 52 vamos a abrir el fichero de texto donde guardaremos el resultado del procesado del $fichero. El nombre del fichero de texto lo derivamos del propio nombre del $fichero original de la imagen, cambiando la extensión 'img' por 'txt'.

Bueno, ya tenemos cargada una imagen. Hay que procesarla. El proceso significa que recorremos todas las comarcas y calculamos su índice de nubosidad.

Pues eso hacemos... el bucle de las comarcas empieza en la línea 54.

Y aquí llegamos a la magia...

De la línea 56 a la 62 -que en realidad, sólo es UNA- averiguamos cúantos píxeles de esa comarca están despejados.

La información la tenemos, pero está repartida entre varios piddles y arrays. Sólo hay que acceder a ellos de forma correcta.

Primero leamos los comentarios que hay puestos a la derecha del código, pues todos juntos forman la frase que resuelve el problema, y cada renglón corresponde con el código Perl que tienen a la izquierda. Es un conjunto de llamadas a funciones PDL. Vamos a describir el funcionamiento en el mismo sentido en que Perl las ejecuta.

En la línea 60, $indices_comarcas[$num_comarca] es un piddle que nos devuelve las posiciones de los píxeles de la comarca que estamos analizando.

En la línea 59, con la función index, 'sacamos' los píxeles de la $imagen_nubosa que acabamos de leer que corresponden a esas posiciones. Por si alguien no se ha dado cuenta: las posiciones de los píxeles las hemos sacado del fichero de comarcas. Ahora las usamos en OTRA imágen, la nubosa que hemos leído. Si suponemos que los dos ficheros tienen las mismas dimensiones, lo que estamos haciendo es mirar en la imágen nubosa los píxeles que coinciden en posición con los mismos píxeles de la comarca. El resultado es otro piddle, que en este caso contiene esos píxeles (puede parecer un poco vago decir esto, pero en realidad, eso es lo que ocurre: 'tenemos' esos píxeles).

Ahora, en la línea 58, preguntamos cuáles de esos píxeles son mayores que 0 (que está en la línea 62, sólo hay que seguir la lista de paréntesis). El resultado es un piddle que contiene los píxeles que están despejados (son mayores de 0, en nuestro problema). Sólo falta que en la línea 57, nelem nos devuelva el número de elementos de ese piddle.

Ya está... de los 24 millones de puntos, sólo miramos aquellos que corresponden a la comarca. Y de esos, cuáles y cuántos son los que son mayores de 0.

Naturalmente hay otras formas de hacerlo. En C o C++ lo que haríamos sería recorrer toda la imagen e ir mirando pixel por pixel a qué comarca pertenece (del fichero de mapas) y si está despejado (del fichero de imagen nubosa). Se puede hacer todo a la vez y al final, sacar los resultados. Incluso hasta podría ser más rápido... pero no tan bonito como aquí.

Probé a realizarlo en C y la mejora de velocidad no es significativa. Lo que sí fué notable fue el tiempo que tardé en hacerlo en C.

En la línea 64 calculamos el índice de nubosidad. Una simple división entre los píxeles que están despejados con respecto al total de píxeles que forman la comarca.

Finálmente, sacamos los valores calculados a pantalla (línea 67) y al fichero de texto (línea 71). El resultado que nos piden es que a de ser un fichero de texto con dos columnas. En el primero, el código de comarca y en la segunda, el porcentaje de nubosidad, multiplicado por 100 y con un decimal de resolución.


1 #!/usr/bin/perl -w
2 #
3 # Cálculo de la nubosidad.
4 # Programa para el cálculo de los píxeles nubosos de las comarcas.
5 # Joaquín Ferrero. 2004.
6 #
7
8 use PDL;
9 use PDL::IO::FastRaw;
10 use strict;
11
12 my $ancho = 6144; # Constantes
13 my $alto = 4096;
14 my $dir = '/almacen1/nubosidad';
15 my $fichero_comarcas = 'COMARCAS.img';
16
17 chdir $dir or die "No puedo entrar en el directorio de trabajo: $!";
18
19 $|++; # Salida a pantalla sin buffer
20 my @comarcas; # Números de las comarcas
21 my @indices_comarcas; # Índices de píxeles a cada comarca
22 my @pixeles_comarcas; # Número de píxeles por cada comarca
23
24 print "Leyendo imagen de comarcas\n";
25 my $imagen_comarca = mapfraw(
26 $fichero_comarcas, {Dims=>[$ancho*$alto],Datatype=>ushort,ReadOnly=>1});
27
28 @comarcas = list $imagen_comarca->uniq; # Valores únicos de las comarcas
29 shift @comarcas; # Quitamos el '0', que siempre está
30
31 foreach ( 0..$#comarcas )
32 {
33 # Dónde está cada comarca
34 $indices_comarcas[$_] = which($imagen_comarca == $comarcas[$_]);
35
36 # Cuantos píxeles hay por comarca
37 $pixeles_comarcas[$_] = $indices_comarcas[$_]->nelem;
38
39 printf "Comarca %-3d : %-3d : %d\n",$_,$comarcas[$_],$pixeles_comarcas[$_];
40 }
41
42 foreach my $fichero ( ) # Para todos los ficheros
43 {
44 print "Procesando fichero $fichero...\n";
45
46 # Leemos la imagen filtrada por nubes
47 my $imagen_nubosa =
48 mapfraw($fichero,{Dims=>[$ancho*$alto],Datatype=>ushort,ReadOnly=>1});
49
50 # Abrimos fichero de texto destino
51 (my $texto = $fichero) =~ s/img$/txt/; print "Salida en fichero $texto\n";
52 open SALIDA,">$texto" or die "No puedo escribir a $texto: $!";
53
54 foreach my $num_comarca ( 0..$#comarcas ) # Para cada comarca
55 {
56 my $despejado = # Cuanto está despejado
57 nelem( # Cuantos píxeles,
58 which( # de
59 $imagen_nubosa->index( # la imagen nubosa
60 $indices_comarcas[$num_comarca] # que pertenecen
61 # a la comarca,
62 ) > 0 )); # son mayores que 0
63
64 my $ratio =
65 $despejado / $pixeles_comarcas[$num_comarca];
66
67 printf
68 "%s comarca %3d: %5d/%5d = %05.1f%%\n",
69 $fichero,$comarcas[$num_comarca],
70 $despejado,$pixeles_comarcas[$num_comarca],100*$ratio;
71 printf SALIDA "%03d %05.1f\n",$comarcas[$num_comarca],100*$ratio;
72 }
73
74 close SALIDA;
75 }
76 # Fin

Espero que con este humilde programa os haya picado la curiosidad de esta fantástica librería.


Ahora comentaros los aspectos negativos...

La curva de aprendizaje de PDL es muy fuerte. Pero mucho. Muchísimo más que el propio Perl.

Me he encontrado muchas veces completamente perdido. La documentación es escasa (aparte del manual y un libro), a veces poco actualizada. La mejor manera de solucionar un problema es participar en la lista de correo de PDL. Hay gente que, muy amablemente, te echarán una mano y te asombrarás de las soluciones que te ofrecen.

Realmente, lo más difícil de esta librería es saber qué función debes usar en cada momento. Con el tiempo aprender a usar unas cuantas de ellas, pero las distintas formas de combinarse entre ellas y otro aspecto importante, la forma de acceder a los datos, es lo más complicado. En cierto sentido, si usas piddles en 3 dimensiones, tiendes a pensar en 3 dimensiones para resolver el problema.

Y no digamos si necesitas más dimensiones. Me encontré con un problema que requería 8 dimensiones. Con la calculadora en la mano, me salían tiempos de procesado de más de una semana, con un programa en C. Al final de muchos días de pruebas y programación, con Perl y PDL, el programa tarda 8 horas en procesar 521.838.526.464.000 datos. Asombroso.

Nuestro trabajo figura como caso de éxito en la página de PDL, entre otros maravillosos ejemplos.

Desde hace unos meses que ya no sigo allí y que no necesito usar PDL, pero algunas cosas no se olvidan fácilmente. PDL se olvida muy rápido -por lo complicado que es-, pero nó sus efectos.


Cortesía de Joaquín Ferrero

Joaquín Ferrero es programador y moderador del foro de Perl en Español, y gentilmente ha ofrecido algunos de sus tutoriales para su publicación en este sitio.

Puedes visitar la página personal de Joaquín Ferrero con el siguiente link:
http://www.joaquinferrero.com/

O puedes ver su perfil de "Perl en Español".

]]>
Perl y Ajax http://perlenespanol.baboonsoftware.com/tutoriales/cgi/perl_y_ajax.html En este tutorial vamos a hecharle un vistazo a Ajax. Veremos de que trata la tecnología y como la podemos implementar con Perl, así como las ventajas y desventajas de su uso.... CGI Uriel Lizama 2006-05-02T11:09:18-06:00 En este tutorial vamos a hecharle un vistazo a Ajax. Veremos de que trata la tecnología y como la podemos implementar con Perl, así como las ventajas y desventajas de su uso.

]]>

Para muchos AJAX es lo último en tecnología, y es que recientemente se ha puesto de moda principalmente porque Google empezó a hacer uso de ésta tecnología que existe desde hace algunos años.

Debido a esto decidí dedicar un pequeño tutorial a ésta "nueva" tecnología. Vamos a ver de que se trata, como poder implementarlo y las ventajas y desventajas que nos trae el uso de AJAX.


¿Qué es AJAX?

La palabra AJAX viene de: Asynchronous JavaScript and XML, y describe una técnica desarrollada para crear aplicaciones web interactivas.

La finalidad es lograr una sensación de interactividad total al realizar intercambios de información con el servidor sin la necesidad de recargar toda la página web.

Ésta técnica usa un combinación de varios elementos, como lo son:

  • XHTML o HTML y CSS para desplegar y estilizar la información.
  • El DOM accesado por medio de lenguajes de script del lado del cliente, como son JavaScript y JScript.
  • El objeto XMLHttpRequest para intercambiar los datos con el servidor web.
  • XML que es comúnmente el formato usado para realizar los intercambios de información, aunque cualquier formato puede ser usado.

Finalmente el próposito es brindarle al usuario una manera más sencilla de realizar la navegación, pues con AJAX puedes realizar cambios sin la necesidad de cargar toda la página web nuevamente.


AJAX y Perl

Ahora vamos a crear un sencillo ejemplo con el cual vamos a ver de manera sencilla como es que funciona el AJAX.

Lo que vamos a hacer es crear un pequeño formulario con un campo en donde los usuarios deben de ingresar una contraseña. Cada que el usuario introduzca una letra vamos a verificar si la contraseña es correcta de manera inmediata.

En caso de que la contraseña sea incorrecta regresaremos un mensaje notificandolo, y cuando la contraseña sea correcta regresaremos una liga para entrar al sitio secreto.

Es un ejemplo sumamente sencillo, pero bastante útil y práctico para aprender el uso de AJAX.

Para implementar nuestro ejemplo vamos a usar el módulo CGI::Ajax, el cual nos da una interfase bastante limpia para poder implementar el Ajax con Perl.

Para empezar cargamos los módulos necesarios:

use strict;

use CGI;
use CGI::Ajax;


Iniciamos un objeto CGI y creamos una variable con la contraseña correcta:

my $cgi = new CGI;

my $PWD_CORRECTO = "perl";


Ahora vamos a crear un nuevo objeto CGI::Ajax y asociamos una subrutina:

my $pjx = new CGI::Ajax( 'checar_pwd' => \&checar_pwd );

Como vemos estamos definiendo un nuevo argumento "checar_pwd" y le estamos asignando una referencia a un subrutina.

Debemos de asignar un nuevo argumento por cada subrutina que vamos a querer usar por medio de Ajax. El nombre del argumento es como luego nos vamos a referir para hacer la llamada de la subrutina, es este caso opte por ponerle el mismo nombre de la subrutina para evitar confusiones más adelante.

Muy bien, después de eso vamos a armar el HTML:

print $pjx->build_html( $cgi, \&mostrar_formulario);

Lo que vamos a hacer es imprimir a pantalla el resultado del llamado de la subrutina build_html(), como vemos la subrutina recibe dos argumento, el primero es el objeto CGI, que va a servir para poder leer la información envíada por medio de POST o de GET y después una referencia a la subrutina que se encarga de desplegar el HTML.

La razón por la cual no podemos desplegar el HTML sin llamar a la función build_html() es que como el módulo CGI::Ajax se encarga de realizar toda la implementación necesaria para poder usar esta técnica, es necesario que preprocese nuestro código HTML para poder agregar lo necesario.

Ahora veamos como se vería la función mostrar_formulario():

sub mostrar_formulario{

my $html = <<EOHTML;
<HTML>
<BODY>

Escribe la contraseña:
<input type="text" name="pwd" id="pwd"
onKeyUp="checar_pwd( ['pwd'], ['resultado'] );">
<br>
<div id="resultado"></div>
<p>

</BODY>
</HTML>
EOHTML
return $html;

}

Es muy sencillo, capturamos en la variable $html el código HTML de nuestro formulario y después la regresamos como el resultado.

Como podrán ver el código HTML consta de un sencillo formulario con un campo para escribir la contraseña, pero hay unos elementos especiales.

Primero veamos el campo de contraseña:

<input type="text" name="pwd" id="pwd" onKeyUp="checar_pwd( ['pwd'], ['resultado'] );">

Lo primero es que le asignamos un ID de pwd al campo, así se podrá llamar con esa identificación por medio de JavaScript. Cada elemento debe de tener un ID único, nunca los podemos repetir. Ahora lo importante viene en la siguiente parte:

onKeyUp="checar_pwd( ['pwd'], ['resultado'] );"

onKeyUp es un evento que se acciona en el momento en que levantamos una tecla, es decir cuando terminamos de presionarla. Al activarse el evento se llama a la función checar_pwd() a la cual le vamos a dar dos argumentos.

El primero es el ID del campo del cual vamos a leer los datos ['pwd'], el valor de este campo es que el que se va a envíar a nuestro CGI, y el segundo argumento es el ID del campo en donde vamos a desplegar el resultado ['resultado'].

Es aquí donde está toda la magía. Pues el módulo CGI::Ajax se va a encargar de hacer la implementación necesaria para poder llamar de manera dinámica a nuesta función en el CGI.

Luego en el formulario viene el DIV donde se va a desplegar el resultado:

<div id="resultado"></div>

Ahora todo lo que nos falta es crear la función checar_pwd() en nuestro CGI:

sub checar_pwd{


my $entrada = shift;

if($entrada eq ""){
return("Introduce la contraseña secreta");
}
if($entrada eq $PWD_CORRECTO){
return("Acertaste <a href=\"http://google.com\">Entra al sitio secreto</a>");
}
else{
return("$entrada es incorrecto");
}


}

Muy bien, primero recibimos el argumento envíado, el cual especificamos en nuestro HTML, en este caso será el valor del campo pwd. Como vemos hacemos una comprobación del valor recibido y de acuerdo a él regresamos el resultado.

El resultado que regresamos en la función es la que se va a desplegar en el campo asginado, en este caso será el DIV cuyo ID es resultado.

Y eso es todo, podemos ejecutar nuestro CGI, y vemos como el resultado de la comprobación de la contraseña es regresada de manera dinámica sin la necesidad de recargar la página por completo.

Ahora, al ejecutar tu CGI si ves el código HTML que se produce verás que hasta arriba vienen un chorro de líneas con código JavaScript, todo eso es la implementación que hace por nosotros el módulo.

Como podrás apreciar el módulo CGI::Ajax nos hace realmente sencillo el proceso de asociar funciones de nuestro CGI con procesos Ajax.


Código Final

#!perl

use strict;
use CGI;
use CGI::Ajax;


my $cgi = new CGI;


my $PWD_CORRECTO = "perl";

#Creamos un nuevo objeto AJAX
# y asociamos una función
my $pjx = new CGI::Ajax( 'checar_pwd' => \&checar_pwd );

# Desplegamos el HTML
print $pjx->build_html( $cgi, \&mostrar_formulario);

sub checar_pwd{

#Recibimos los datos envíados
my $entrada = shift;

if($entrada eq ""){
return("Introduce la contraseña secreta");
}
if($entrada eq $PWD_CORRECTO){
return("Acertaste <a href=\"http://google.com\">Entra al sitio secreto</a>");
}
else{
return("$entrada es incorrecto");
}


}

sub mostrar_formulario{

my $html = <<EOHTML;
<HTML>
<BODY>

Escribe la contraseña:
<input type="text" name="pwd" id="pwd"
onKeyUp="checar_pwd( ['pwd'], ['resultado'] );">
<br>
<div id="resultado"></div>
<p>

</BODY>
</HTML>
EOHTML
return $html;

}



Otros Usos de AJAX

El ejemplo que vimos es realmente trivial, pero nos permite darle un vistazo a lo que podemos lograr con Ajax. Por ejemplo, podríamos checar de manera dinámica si el nombre de usuario que nuestro cliente está seleccionando no ha sido utilizado con anterioridad. Podríamos hacer una comprobación de otrografía instantánea de un texto ingresado.

Por ejemplo Gmail lo usa para desplegar los mensajes de email de manera dinámica sin la necesidad de recargar por completo la página, lo que permite una sensación de interactividad completa.

Otros usos que he visto por ahí es el de autocompletar, conforme el usuario va poniendo letras, automáticamente se van poniendo palabras que empiecen con esas letras, algo así como el autocompletar que viene con el IExplorer.

También hay casos más complejos, como por ejemplo un chat hecho completamente con Ajax, lo que permite crear un chat sumamente interactivo que da la sensación de ser P2P, pues es inmediata la recepción y no se necesita usar la recarga de la página.

Aquí les pongo algunos URLs con ejemplos de implementaciones que usan Ajax:

Buscador de Amazon
Google Maps
Flickr
Oddpost


Ventajas y Desventajas de AJAX

Las ventajas ya las hemos visto durante el tutorial, y principalmente es hacer más cómoda la navegación y la interacción usuario-servidor. Sin embargo no todo es color de rosa.

Al principio Ajax puede ser muy llamativo, eso genera un abuso de la técnica. Si se sobrecarga de Ajax una aplicación, esto la puede crear confusa y termina siendo contraproducente. Hay que ser prudentes en el uso de la técnica, y solamente usarlo cuando sea necesario y sea evidente la ventaja.

La principal desventaja que tiene el Ajax viene ímplicito en un problema que viene con el mismo protocolo de conexión usado para http. El problema está en que cuando mándamos información por medio de AJAX no podemos estar seguro en que va a llegar en orden.

Por ejemplo, mándamos en orden las letras: "a" "b" "c" "d". No porque mándamos la letra "a" antes que la "b", significa que el CGI las va a recibir de esa manera, pues podrían llegar en otro orden como: "b" "c" "a" "d".

Esto puede generar problemas serios en el caso que se necesite que la información llegue en un orden exacto.

El otro problema podría ser que el usuario no tenga activado JavaScript, sin embargo con un poco más de trabajo se puede preparar para que en ese caso nuestra aplicación aún funcione.


Bibliografía

http://en.wikipedia.org/wiki/AJAX
http://en.wikipedia.org/wiki/XMLHTTP
http://www.perl.com/pub/a/2006/03/02/ajax_and_perl.html
http://domscripting.webstandards.org/?page_id=4

]]>
Vender suscripciones con PayPal http://perlenespanol.baboonsoftware.com/tutoriales/misc/vender_suscripciones_con_paypal.html ¿Quiéres vender suscripciones con PayPal pero no sabes cómo? En este tutorial podrás aprender como empezar a vender suscripciones para tu sitio de manera sencilla y rápida.... Misc Uriel Lizama 2006-03-29T17:24:29-06:00 ¿Quiéres vender suscripciones con PayPal pero no sabes cómo? En este tutorial podrás aprender como empezar a vender suscripciones para tu sitio de manera sencilla y rápida. Así que tienes tu sitio y ahora quieres empezar a vender membresías, con este tutorial vamos a ver como puedes vender membresías de forma sencilla por medio de PayPal. Verás que puedes configurar en menos de 1 hora tu sitio para empezar a vender tus membresías.

Así que empecemos.

Tu cuenta en PayPal

Como es lógico lo primero que tienes que hacer es crear tu cuenta en PayPal, es realmente muy sencillo y puedes crear tu cuenta cliqueando aquí.

Una vez que hayas creado tu cuenta de PayPal ahora podemos empezar a configurar todo.

Creando tu área de miembros

Normalmente cuando vendemos membresías a nuestro sitio lo que hacemos es crear un área especial en donde solamente pueden entrar miembros.

Para poder accesar, nuestros miembros deben de usar una clave y contraseña la cual les es proporcionada una vez que hayan hecho el pago de su membresía.

Lee el siguiente tutorial para que configures tu directorio protegido.

Una vez que ya hayas probado que tu directorio protegido funciona de manera correcta, ahora es momento configurar nuestra interfase con PayPal.

Usando el IPN de PayPal

Vender membresías con PayPal es sumamente sencillo, todo lo que tenemos que hacer es crear una vía de comunicación entre PayPal y nuestro servidor. PayPal se encarga de dar de alta y de baja a nuestro usuarios dependiendo del término de sus membresías, por lo que una vez que hayamos configurado todo ya no nos tenemos que preocupar.

La forma en que PayPal se comunica con nuestro servidor para avísarnos que hay que dar de alta o de baja un usuario es por medio de una tecnología que se llama IPN.

El IPN o Instant Paymen Notification de PayPal es el medio por el cual PayPal se comunicará de manera automática e instantenéa con tu sitio para notificar de cambios. A continuación podrás ver un gráfico que te muestra como funciona esto.

¿Cómo funciona IPN?
¿Cómo funciona el IPN?

1. El pago de un usuario o un refund activa el IPN.

2. PayPal hace un post de con campos de un FORM HTML al URL que pongas en tu perfil. Este POST es el corazón de IPN. Dentro de la notificación vienen incluidas la información de pago de tu cliente (como nombre del cliente y monto de pago).

3. Tu servidor debe entonces validar la notificación para asegurarse que es legítima.

Para configurar el URL de nuestro IPN debemos de accesar a nuestra cuenta de PayPal.

Ahí nos debemos de dirigir a Profile, ahí bajo Selling Preferences encontraremos una liga que dice Instant Payment Notification Preferences.

Muy bien, ahí debemos de ingresar el URL de nuestro CGI de IPN y activarlo. Dependiendo del lugar en donde quieras poner tu CGI es el URL que debes de poner, por ejemplo: "http://www.misitio.com/cgi-bin/paypal.cgi"

Configurando Nuestro IPN

Creando nuestro programa de IPN

Ahora vamos a la parte más delicada de todo el pr