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
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:
| %a | abreviación del día de la semana en inglés | Sun a Sat |
| %A | día de la semana en inglés | Monday |
| %b | mes abreviado en inglés | Jan a Dec |
| %B | mes en inglés | January |
| %c | fecha pre-formateada | ej. Fri Apr 28 17:23:15 1995 |
| %d | día del mes | ej. 01-31 |
| %H | hora del día | 00-23 |
| %I | hora del día | 01-12 |
| %j | día del año | 0-365 |
| %m | mes del año | 01-12 |
| %M | minuto | 00-59 |
| %p | AM o PM | AM-PM |
| %s | segundos | 00-59 |
| %u | semana del año (Domingo como primer día) | 01-53 |
| %w | día de la semana | 1 (Lunes) a 7 (Domingo) |
| %W | semana del año (Lunes como primer día) | 01-53 |
| %x | fecha formateada | ej. 04/28/95 |
| %X | hora del día | ej. 03:30:01 AM |
| %Y | año en 4 dígitos | ej. 2007 |
| %Z | zona horaria | ej. 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.
Existen en la web muchas utilerías para crear blogs en línea, pero sin duda la más popular es la de Google. Hace algunos años Google compró el famoso Blogger.com, un sitio que te permite crear de manera sencilla blogs.
Una de las grandes ventajas que tiene Blogger.com es su versatilidad, es fácil de usar para los usuarios novatos que apenas dan sus primeros pasos en la experiencia de publicar su contenido web, sin dejar de dar grandes ventajas y poder de customización para quienes ya tienen experiencia en diseño web.
Pero quizá lo que es aún más atractivo es que es totalmente gratuito.
Selecciona un tópico para tu Blog
Antes de crear tu cuenta debes de escoger el tópico sobre el cual se va a basar tu blog. Piensa en lo que quisieras escribir, pero ten cuidado en escoger un tema del cual puedas escribir sin problema, pues de esto depende el éxito de tu blog.
Tu blog va a ser más exitoso si tu contenido es interesante para tus usuarios, te recomiendo que escojas un tema que te apasione y del cual crees puedas hacer aportaciones interesantes.
Crea tu Blog
Ya que tienes un tópico seleccionado, crear tu cuenta es sumamente sencillo. Desde la página de inicio de Blogger cliquea en donde dice "CREAR TU BLOG AHORA" y sigue los sencillos pasos que se te van a mostrar.
Cuando Blogger te pida seleccionar un URL para tu blog, procura que el URL que selecciones contenga las palabras referentes a tu tópico. Por ejemplo si vas a poner un blog donde hablas acerca de carros de carrera, podrías seleccionar un URL como "carrocarrera.blogspot.com" o "carros-carrera.blogspot.com". El que tu URL contenga las palabras clave de tu código es importante para que la gente te encuentre al buscar sobre el tópico en los buscadores.
Configuración
Una vez creado tu blog ya puedes configurarlo, aquí están algunos de los puntos que puedes configurar.
Basic
En la pestaña de "Basic", configuras el título de tu blog así como las palabras claves que quieres que se muestren a los buscadores lo que cual te ayudará a tener un mejor ranking.
Responde que si a la pregunta de agregar tu blog a los listados de Blogger.com (Add your Blog to our listings?). Esto hará que tu blog aparezca en la página principal de Blogger.com cuando pongas una nueva entrada, y permite que los usuarios hagan búsquedas usando el mecanismo de Blogger.
Publishing
Pon la opción de notificar weblogs (Notify Weblogs) a "Sí". Así Blogger enviará una notificación a Weblogs cada vez que pongas un nuevo post. Weblogs es un sitio que le permite a los usuarios y a lo navegadores saber cuando hay nuevo contenido en los blogs.
Comments
Es importante que selecciones la configuración de los comentarios de acuerdo al contenido que vas a agregar. Si piensas escribir acerca de temas controversiales y del cual puedes esperar posturas bastante radicales, por ejemplo, acerca de política, entonces lo más seguro es que recibas muchos comentarios basura que realmente no aportan nada y que hace que lo mejor sea que no permitas comentarios.
Si estás escribiendo de tópicos bastante neutrales, por ejemplo, hobbies, entonces ponlos abiertos que cualquier pueda escribir, de esa manera permites que tus usuarios aporten más a los temas que tratas.
Si no estás seguro, entonces puedes poner los comentarios en modo de moderación, en donde puedes publicar los comentarios como te parezca. El problema de los comentarios moderados, es que si tu sitio crece demasiado y recibes muchos comentarios, el moderarlos puede terminar siendo un trabajo de varias horas diarias.
Archiving
Selecciona el método de archivo diario si piensas poner posts todos los días, semanal si vas a poner posts cada dos o tres días.
Aunque hagas un archivo de tu post aún así selecciona que Blogger haga una página por cada post, así cada entrada que pongas tendrá su propia página que terminará traduciéndose en contenido para los buscadores y visitas.
Site Feed
Esto es algo que realmente necesitas. Habilita el feed de tu sitio y selecciona que ponga descripciones cortas, cuida que tus descripciones sean lo suficientemente atractivas como para hacer que los usuarios tengan la necesidad de cliquea para ver la entrada completa.
Templates
Selecciona uno de los templates que Blogger proporciona y que creas que se adaptan a tu sitio de la mejor manera. Aunque hayas seleccionado un template al crear tu cuenta, checa de nuevo pues por alguna razón Blogger no te muestra todos los templates disponibles en la creación del blog.
Todo listo y a comenzar
Ya tienes tu blog listo, ahora todo lo que necesitas es empezar a escribir tus artículos, si tienes artículos interesantes a la gente le va a gustar y tu blog se hará popular rapidamente. ]]>
Y aunque los bots de los buscadores lo pueden leer e indexar en su base de datos, si ponen un penalti por ser un url dinámico. Para solucionar esto, si eres un visitante o un robot, el url que verás será:
Si pruebas ambos urls verás que muestra el mismo contenido. Podrás pensar que son dos páginas distintas, pero no es así, el segundo url, el que simula una página estática, es convertido detrás de las cortinas para llamar a la página real. Así es, en mi servidor no existe un archivo forum-3.html.
En este artículo les voy a mostrar como lograr esto.
Una solución elegante
Quizá estarán pensando que todo esto es un producto de magia, pero realmente es bastante sencillo lograrlo y los resultados serán muy buenos, pues no solamente podrán dar urls estáticos a los buscadores mejorando su posición, sino que también podrán dar urls amigables a sus usuarios.
Para poder lograr esto es necesario tener lo siguiente:
Para poder usar este módulo primero lo tenemos que activar. En caso de que no tengas el módulo activado tendrás que editar tu archivo http.conf y quitar el comentario de la línea que carga el módulo para que quede de la siguiente manera:
#LoadModule rewrite_module modules/mod_rewrite.so #AddModule mod_rewrite.c
Comprendiendo mod_rewrite
Es importante comprender lo que hace exactamente este módulo.
El mod_rewrite se ejecuta después de hacer un request en tu servidor y antes de ejecutar cualquier script. Lo que hace es que aplica un "filtro" configurado por uno sobres los urls y los rescribe detrás de las cortinas.
Por ejemplo, podrías tener un url inexistente como el siguiente:
Y entonces el mod_rewrite lo podría convertir a:
La conversión del url se hace por detrás por lo que el usuario no podrá ver nada de esto, sin embargo si verá el resultado que viene de la ejecución del url "real".
Es importante comprender que mod_rewrite NO puede ser usado para cambiar el URL que el usuario ve es la barra de Dirección de su navegador a menos que una redirección externa es invocada. Sin embargo una dirección externa expone finalmente el url dinámico, así que mod_rewrite hace una redirección interna.
También es importante comprender que mod_rewrite cambia la dirección del archivo y las variables del url pedido pero NO cambia en ningún momento el despliegue de las mismas.
Poniendo mod_rewrite en práctica
Muy bien, empecemos con lo bueno, para esto vamos a hacer un ejemplo práctico.
Digamos que tienes una tienda de ropa y que tus clientes pueden ver la ropa que tienes navegando por categoría y talla de la misma. Para esto tienes una aplicación que se llama de la siguiente manera:
No es para nada bonito el url, por lo que queremos que nuestros clientes puedan acceder de la siguiente manera:
Como ves es más intuitivo y amigable.
Usando mod_rewrite no es necesario hacer ningún cambio en tu aplicación, ni siquiera es necesario que crees los directorios 'playeras/' ni 'playeras/femenino', tampoco es necesario que hagas un archivo que se llame chica.htm.
Lo que vamos a hacer es que cuando algún usuario haga un request de 'http://tusitio.com/playeras/femenino/chica.htm' usaremos el mod_rewrite para filtrar y convertir el url a 'http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica', pero todo esto detrás de las cortinas, usando la redirección interna como habíamos dicho.
Ya que estemos seguros que tenemos el mod_rewrite instalado y activo, vamos a crear un nuevo archivo de configuración .htaccess.
Dentro de nuestro .htaccess vamos a inicializar el módulo mod_rewrite:
RewriteEngine On
Ya que tenemos esto, tenemos que configurar las reglas o filtros que vamos a usar. Cada uno deberá de ir en una nueva línea y podemos tener tantos como nosotros queramos y necesitemos.
Entonces vamos a crear nuestro filtro que ser verá así:
RewriteRule ^playeras/femenino/chica.htm cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica [L,NC]
Comprendamos nuestra línea del filtro. El filtro está conformado por 4 elementos, cada uno separado por un espacio en blanco.
El primer elemento es:
RewriteRule
Aquí indicamos que estamos creando una nueva regla o filtro para la máquina de mod_rewrite. El segundo elemento es:
^playeras/femenino/chica.htm
En este caso es el url que estamos buscando. Es importante que tengamos en cuenta que siempre debemos de usar los directorio relativos, es decir, no debemos de poner el dominio de nuestro sitio, el mod_rewrite lo pondrá por nosotros.
La tercera parte es el nuevo url al cual queremos redirigir, también la dirección debe de estar relativa, mod_rewrite pondrá por nosotros el dominio de nuestro sitio.
cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica
La última parte es opcional y son flags que regulan el comportamiento del mod_rewrite.
[L,NC]
En las siguientes secciones veremos más detalles acerca de los flags, pero podemos decir que con los flags L y NC le decimos al mod_rewrite que sea la última regla que cheque si coincide y que no haga caso a las minúsculas y mayúsculas.
Más poder a nuestro mod_rewrite
El ejemplo anterior es de gran ayuda, vimos como podemos convertir un url dinámico en estático en cuestión de minutos, pero hay un pequeño problema.
Lo más seguro es que nuestra tienda de ropa no venda puras playeras chicas, ni tampoco puras de mujer, y lo más seguro es que venda más productos que puras playeras, debe de haber pantalones, chamarras, shorts, camisas, vestidos, etc, etc.
Hacer una nueva regla por cada producto y por cada tamaño será un verdadero dolor de cabeza, y aparte cada ves que queramos poner una nueva línea de productos en la tienda tendremos que modificar nuestro .htaccess.
Pues bueno, con mod_rewrite podemos evitar eso, pues aún no hemos visto la parte más poderosa.
En el último ejemplo hicimos un filtro bastante sencillo:
RewriteEngine On
RewriteRule ^playeras/femenino/chica.htm cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica [L,NC]
Pero también quisiéramos que los siguientes urls lo redirija al lugar correcto:
Si vemos, todos los urls tiene una misma sintaxis, el primer directorio sería la línea de ropa (pantalones,vestidos,shorts,etc), el subdirectorio sería el departamento (masculino,femenino,infantil,etc) y el archivo html sería la talla (32.htm,mediano.html,12.htm).
mod_rewrite nos permite usar expresiones regulares dentro de nuestros filtros, de esta manera podemos realizar filtros más poderosos.
Las expresiones regulares nos brindan un set de reglas que podemos usar para comprobar valores arbitrarios como en este caso. Sabemos que el url vendrá en una misma sintaxis pero tendrá diferentes valores, usando las expresiones regulares podemos capturar y comprobar esos valores.
Veamos la expresión regular que usaríamos en este caso para hacer lo que queremos:
^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+).htm$
Expliquemos un poco nuestra expresión.
El ^ incial denota inicio de línea, significa que solamente será válida la regla si se cumple iniciando la línea.
Los paréntesis ( ) los usamos para capturar el valor, en este caso así lo queremos pues después tendremos que usarlos para enviárselos a nuestro CGI de la aplicación.
Los [ ] los usamos para asignar un campo de caracteres. Los campos de caracteres los podemos usar cuando queremos checar que ciertos caracteres estén o no estén. En la primera parte que será de la línea de ropa, sabemos que solamente vendrán letras del alfabeto, por lo que solamente queremos de la a-z y de la A-Z, en minúsculas y mayúsculas. Lo mismo en la segunda parte, pero ya en la tercera parte si puede haber números por ejemplo en 32.htm, por lo que tenemos que poner también el 0-9.
El signo de + después del cierre del campo de carácter, significa que debe de haber por lo menos uno o más de los caracteres que queremos.
Luego tenemos la separación con las diagonales '/' que están fuera de los paréntesis pues queremos capturar solamente 'pantalones' y no 'pantalones/'.
Al final también dejamos el .htm fuera de los paréntesis pues no lo queremos usar, y terminamos con $ que simboliza final de línea.
Así ya tenemos nuestros valores capturados que ahora podremos usar en el url para llamar al CGI de nuestra aplicación:
cgi-bin/aplicacion_ropa.cgi?tipo=$1&sexo=$2&talla=$3
Vemos como los valores los sustituimos por $1, $2, $3 que a su vez serán sustituidos por mod_rewrite con los valores que capturamos en nuestros paréntesis.
Cada paréntesis captura en una nueva variable y lo hacen en orden, así que van tomando $1, $2, $3, $4.. así hasta lo que se necesite.
Así que finalmente nuestra regla se verá de la siguiente manera:
RewriteEngine On
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+).htm$ cgi-bin/aplicacion_ropa.cgi?tipo=$1&sexo=$2&talla=$3 [L,NC]
Así si llamamos a los siguientes urls:
Serán redireccionados internamente a:
Así de la nada, tenemos una lista infinita de páginas estáticas fáciles de navegar por nuestros usuarios.
Tomándole la medida a mod_rewrite
Usar mod_rewrite es sumamente sencillo, quizá lo más difícil podría ser aprender a usar las expresiones regulares y los flags que podemos usar para controlar el comportamiento del módulo.
Sin embargo ambas son muy intuitivas y con un poco de uso y de estar jugando y probando con ellas, les tomarás la práctica inmediatamente.
Dave Child hizo un PDF con un "acordeón" que enlista las expresiones regulares y flags que podemos usar en el mod_rewrite. Les recomiendo que descarguen el PDF con la lista y lo tengan a la mano en el momento de crear sus filtros:
http://www.ilovejackdaniels.com/mod_rewrite_cheat_sheet.pdf
Últimas Palabras
Cuando hagas tus primeras pruebas con el mod_rewrite, ten cuidado y si puedes has las pruebas con un servidor Apache que no esté en vivo, pues si tienes algún error de sintaxis al momento de crear tus filtros, verás un error 500 en todo tu sitio, evitando que tus usuarios puedan acceder a él.
En caso de que quieras convertir tu sitio de estático a dinámico pero no te atreves a hacerlo tu sólo, puedes usar nuestros Servicios de Perl en Español y nosotros lo haremos por ti:
http://perlenespanol.baboonsoftware.com/servicios/
Otros Recursos
Documentación de mod_rewrite
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
Introducción a las Expresiones Regulares
http://perlenespanol.baboonsoftware.com/tutoriales/expresiones_regulares/index.html
mod_rewrite Cheat Sheet
http://www.ilovejackdaniels.com/apache/mod_rewrite-cheat-sheet/
]]>
Muchas compañías de hosting solamente ofrecen soporte por email, esto no es suficiente. Puedes tener momentos críticos donde cada minuto cuenta, y por medio de email no puedes tener la certeza de que del otro lado te están escuchando. Checa si la compañía de hosting que seleccionaste tiene soporte por teléfono, muchos hoy en día cuentan con chat en vivo, y otros más tienen avanzados sistemas de "tickets", el cual es como un chat en vivo pero como menos dinámica.Lo importante es que tengas la seguridad de que te responderán en el momento que necesitas sin importar la hora que sea. Checa los horarios de soporte, lo mejor es que encuentres uno que te garantice soporte las 24 horas del día en los 365 días del año.
Te recomiendo que pruebes lo efectivo que es su soporte contactándolos para preguntar por algo, si no recibes respuesta en menos de 24 horas, piensa dos veces el contratar su servicio.
Es importante que te alejes totalmente de aquellas compañías que ofrecen solamente soporte por email. Muchas veces ponen la excusa de que hacen eso para bajar los costos, la verdad es que una buena compañía debe de contar con un excelente soporte.
2. Balancea servicio con precio
Cierto que todos queremos ahorrarnos dinero, pero hay un viejo dicho que dice: "Luego lo barato sale caro". Muchas compañías ofrecen servicios de hosting o alojamiento tan bajo como $1usd, pero si pagas casi nada por el servicio, puedes esperar que el servicio sea casi nada.
3. Garantía
Muchas veces tienes que probar el servicio de hosting para saber si va a cumplir con tus necesidades. Busca que la compañía que contrates tenga garantía y que te regrese tu dinero si no te gusta su servicio. El estándar hoy en día es por lo menos 30 días de garantía. Normalmente esta garantía te muestra lo segura que está la compañía de hosting de su servicio.
4. Busca un servicio de hosting que te dé las herramientas para tener un sitio web exitoso
Es importante que siempre tengas en mente tus necesidades actuales de tu sitio web así como las futuras al momento de escoger tu compañía de hosting. Si tienes un sitio web al cual en el futuro quieres agregar un foro, checa si el servicio de hosting te da las posibilidades para ello.¿Tienes la capacidad de crear la cantidad de cuentas de email que necesitas? ¿Te dan scripts gratuitos? ¿Son fáciles de instalar?
Busca una compañía que te dé más herramientas de la que necesitas y a un precio competitivo.
5. Obtén espacio en tu disco duro para tus necesidades
Uno de los principales problemas que te puedes encontrar en el caso de que tu sitio web crezca demasiado es el espacio en disco. Si piensas tener solamente 10 ó 15 páginas web en tu sitio, 50mb podrían ser más que suficientes, sin embargo, si piensas alojar fotos, mp3s, videos o algún otro tipo de archivo te convendría tener por lo menos 500mb de espacio.
6. El ancho de banda necesario
Junto con el espacio en disco duro, el ancho de banda es igual de importante. El ancho de banda es la cantidad de datos que puedes transferir de tu sitio a tus usuarios. Si piensas ofrecer descargas de archivos necesitarás más ancho de banda a si solamente mostrarás paginas html. Saca tu calculadora y haz tus cálculos en cuanto la cantidad de ancho de banda promedio que necesitarías al mes y ve que tu servicio de hosting de lo proporcione.Es también importante que cheques el precio que el servicio de hosting cobra por ancho de banda excedido, muchas veces tu presupuesto mensual se puede ir por la tubería debido a esto.
7. Toma ventaja de los descuentos que el servicio de hosting ofrece
Muchos servicios de hosting ofrecen descuentos si prepagas por un año o dos años, intenta aprovechar estas ofertas. De igual manera si eres webmaster y piensas alojar muchos sitios, busca servicios de hosting que te den descuentos por múltiples contrataciones, muchas veces podrás ahorrarte hasta el 20% del costo.
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.
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.
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.
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'.
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;
}
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.
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.
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.
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
]]>
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.
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.
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.
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.
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!?
]]>
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.
É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:

Empezamos creando una figura base, la estrella. Selecciona la 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.

Usa la 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%.

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
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.

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.

Éste tutorial es una traducción de Rapid Fire #2: Golden Seal. |
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.
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.
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.
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;
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>
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;
]]>
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.
É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:

Primero vamos a crear la base de la fotografía. Usa la 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.

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!

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.
![]() | ![]() |
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.
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
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.

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. |
¿Qué es un CMS?
CMS significa "Content Management System" lo que en español significa Sistema de Administración de Sistema. Un CMS permite la creación, publicación y administración de contenido, su principal uso es en las páginas web.
Normalmente los CMS consisten en una base de datos en donde se encuentra todo el contenido, y por medio de plantillas el contenido es desplegado de la manera en que nosotros queremos.
Existen hoy en día diferente tipos de CMS, hay para foros, blogs, wikis, etc.
Movable Type un CMS hecho en Perl
Hace varios años cuando decidí empezar con el sitio de Perl en Español, estuve buscando y probando los diferentes CMS que había en ese entonces en el mercado, cabe destacar que cada vez salen más de éste tipo de sistemas. Para mi suerte mo topé con Movable Type.
Movable Type es una aplicación creada por Six Apart, una compañía fundada por una pareja de programadores. De entrada, lo primero que me llamó la atención, es que la aplicación estaba hecha en un 100% con Perl. No es un secreto que hoy en día la mayoría de los CMS y los más populares son creados con PHP.
Así que bajé la aplicación la instalé para nunca volverla a dejar, a continuación explico mis razones.
1. Puro Perl
El Movable Type es creado en puro Perl. Si ves el código fuente de la aplicación, podrás apreciar una aplicación bien desarrollada y con un diseño de código impecable. Usaron de los mejores atributos de Perl haciendo que la aplicación sea sumamente robusta.
2. Opción de crear contenido dinámico o estático
La mayoría de los CMS que existen, generan el contenido de manera dinámica, es decir, la página solamente existe hasta que algún usuario la quiere visualizar. Para mi esto es algo útil para páginas que cambian de contenido todo el tiempo, como las páginas de un foro, pero si la intención es crear un artículos y publicarlos, no veo la necesidad de crear esa página una y otra vez.
La nueva versión del Movable Type te permite escoger entre una publicación dinámica y una estática.
Cuando selecciones la publicación estática se generan los archivos html necesarios, y solamente se vuelve a regenerar si hay un cambio global o alguna edición de tu artículo. Esto baja considerablemente la carga a tu servidor, en especial si recibes miles de visitas diarias en tu sitio.
Pero eso no es todo, a los buscadores no les gustan mucho las páginas dinámicas y prefieren las estáticas, por lo que tendrás más oportunidad de aparecer en los primeros lugares.
3. Excelente administración de plantillas
La manera en que Movable Type decidió manejar las plantillas me parece muy buena, y es que a diferencia de muchos CMS que hay por ahí, el Movable Type te dá total libertad en cuanto al diseño de tus plantillas.
La aplicación te permite crear plantillas de índice, crear plantillas de archivos de tipo, individuales, por fecha (diarias, semanales o mensuales), por categoría o por autor. Tu puedes decidir cuales usas.
Por ejemplo para mis tutoriales de Perl en Español uso las plantillas de tipo individuales para cada tutorial, y para archivarlas uso por categorías.
Debido a que el módulo de plantillas de la aplicación emana del módulo HTML::Template, te dá espacio para muchas cosas.
Por ejemplo, si quisieramos desplegar los títulos de las últimas diez entradas, podríamos poner en nuestra plantilla algo así:
<MTEntries lastn="10">
<$MTEntryTitle$><br>
</MTEntries>
Y es que la etiqueta <MtEntries> es una etiqueta que genera un loop o bucle y las etiquetas dentro de éste bucle van tomando el valor de la entrada actual.
Para el sitio de "Perl en Español" hice una plantilla especial para mostrar el feed en RSS de los últimos tutoriales:
http://perlenespanol.baboonsoftware.com/tutoriales/tutoriales.rss
Esto se puede lograr debido a que el Movable Type te permite crear el tipo de plantillas que quieras, y como no te obliga a usar un forma predeterminado es realmente una chulada acomodarlo a tus necesidades.
4. Plugins para el Movable Type
La arquitectura de la aplicación permite que programadores puedan desarrollar plugins. El Movable Type viene con un importador de plugins, lo que hace la creación de los mismos una cosa sencilla.
Para el sitio de Perl en Español hice un plugin que muestra de manera automática una lectura recomendada por mi, esto lo pueden ver del lado izquierdo en cada tutorial.
La ventaja es que ya ahora existen muchos plugins que puedes usar con tu Movable Type, algunos ejemplos de estos son:
¿Cuánto cuesta Movable Type?
Así que te enamoraste de éste íncreible CMS así como yo lo hice. Pues bueno, el Movable Type es un CMS comercial, sin embargo cuentan con una versión gratuita para sitios de no lucro. Se consideran sitios de no lucro aquellos sitios que no tienen fines comerciales, la publicidad y los afiliados NO son consideradas como actividades comerciales.
Si tienes un sitio comercial la licencia del Movable Type es sumamente baja y está entre los $60 y $99usd, dependiendo de tus necesidades. Pero la licencia incluye soporte gratuito.
¿Es Movable Type lo correcto para mi?
Movable Type no es sencillo al inicio, su instalación es muy sencilla, pero el aprender a manejar sus plantillas puede llevarte varias horas. Sin embargo, una vez que lo entiendes puedes hacer maravillas con las plantillas.
Yo te recomiendo que consideres el Movable Type si quieres hacer un sitio que piensas va a crecer en gran manera, y si quieres hacer sitios con CMS que NO parezcan blogs hechos en cinco minutos.
Si eres webmaster te lo recomiendo totalmente, podrás darles a tus clientes el diseño que ellos quieren con una administración sencilla para que puedan agregar contenido sin ningún problema.
Palabras Finales
Espero que el artículo les haya ayudado un poco en la tarea de selección de un CMS para su sitio. Si tienen dudas en que CMS escoger, piensen en sus necesidades, pero lo más importante, piensen en el futuro. ¿Qué va a pasar cuándo tenga cientos de artículos?
Los invito a entrar al foro de Perl en Español para cualquier duda o si quieren alguna recomendación. ]]>
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.
É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:
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:
También podemos definirla primero, y después inicializarla:
Podemos asignar el valor de una variable a otra, por ejemplo:
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:
Como los arrays son listas de cosas, es diferente la manera en que los inicializamos:
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:
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:
¿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:
Para llamar el valor de una de nuestras llaves la sintáxis es:
Ahora, que pasa si hacemos lo siguiente:
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
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.
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.
Veamos unos ejemplos prácticos del uso de estos operadores:
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.
Las pre-operaciones primero cambian el valor del operando y después lo retornan, por ejemplo:
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.
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.
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
op1 | op2
-op1
op1 << op2
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
op1 != op2
op1 < op2
op1 <= op2
op1 > op2
El operador retornará verdadero si op1 es mayor a op2. Por ejemplo 6 > 5 es verdadero.
op1 >= op2
op1 <==> 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
op1 ne op2
op1 lt op2
op1 le op2
op1 gt op2
op1 ge op2
op1 cmp op2
Operador Ternario
El operador ternario es sumamente útil en Perl y realmente es una secuencia de operadores, su sintáxis es como sigue:
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:
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:
Pero aparte el operador es inteligente, entonces si hacemos algo así:
Ahora veamos que pasa si usamos letras:
Pongamos ahora en prueba a Perl, ¿te puedes imaginar los valores que resultarían de lo siguiente?:
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:
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:
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í:
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:
Si dijiste 1 estás en lo correcto.
Aquí está la lista de todos los operadores de asignación disponibles:
Muchas veces nos encontraremos usando varios operadores en una misma expresión.
Aquí va una tabla con los operadores más usados ordenados por precedencia:
Viendo la tabla ¿te podrías imaginar el resultado de la siguiente operación?:
Pero ¿qué pasa si queremos que se ejecute la suma primero? Para eso nos sirven los paréntesis que tienen la mayor precedencia:
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.
LAS VARIABLES
$variable
Muy bien, ahora veamos como podemos definir una variable e iniciarla con un valor:
my $numero = 10;
my $numero;
$numero = 10;
En ambos casos nuestra variable terminará con el valor "10".
En la línea 1 definimos e inicializamos la variable $variableA con el valor "Mi Variable".
1
2
3
4
5
6
7
my $variableA = "Mi Variable";
my $variableB = $variableA;
my $variableC;
$variableC = $variableA;
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.
my @array;
Vemos que debemos de usar el símbolo @ para definir nuestros arrays.
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.
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.
1
2
3
4
5
6
my @array = (
'Perro',
'Gato',
'Gallina',
'Pez'
);
$array[<num_elemento>];
En donde <num_elemento> es un número que corresponde al elemento que queremos tomar, veamos un ejemplo
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.
1
2
3
my @array = ('Perro','Gato','Gallina','Pez');
my $animal = $array[3];
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:
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.
1
2
3
Uno => One
Dos => Two
Tres => Three$hash{<nombre_llave>};
En donde $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:
Vemos como cada par llave-valor es separado por comas, ahora, dentro del par llave-valor se usa la siguiente sintáxis:
1
2
3
4
5
6
my %Animales = (
'Perro' => 'Dog',
'Gato' => 'Cat',
'Gallina' => 'Chicken',
'Pez' => 'Fish'
);
<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".
my $variable = $Animales{'Pez'};
¿Cuál será el valor de $variable?
$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.
OPERADORES DE PERL
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.
op1 + op2 Suma
op1 - op2 Resta
op1 * op2 Multiplicación
op1 ** op2 Exponenciación
op1 / op2 División
op1 % op2 Módulo
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.
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;
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.
+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
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.
1
2
3
my $var = 10;
my $var1 = $var++;
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.
1
2
3
op1 && op2 Operación AND
op1 || op2 Operación OR
!op1 Operación NOT
Operadores a Nível bit
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
Este operador AND compara dos bits y retorna un resultado de 1 si ambos bits son 1, de lo contrario regresa 0.
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.
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.
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.
Este operador retornará verdadero si ambos operadores son verdaderos. Por ejemplo, lo siguiente es verdadero: 7 == 7
La contraparte del operador anterior, esto regresará verdadero si los operadores no son iguales. Por ejemplo, lo siguiente retornará verdadero: 6 != 7
El operador retornará verdadero si op1 es menor a op2. Por ejemplo 2 < 6 es verdadero.
El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo 4 <= 4 y 4 <= 5 son verdaderos.
El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo 8 >= 8 y 8 >= 4 son verdaderos.
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.
El operador retornará verdadero si op1 es igual a op2. Por ejemplo "c" eq "c" es verdadero.
El operador retonará verdadero si op1 no es igual a op2. Por ejemplo "a" ne "b" es verdadero.
El operador retornará verdadero si op1 es menor a op2. Por ejemplo "a" lt "b" es verdadero.
El operador retornará verdadero si op1 es menor o igual a op2. Por ejemplo "a" le "b" y "a" le "a" son verdaderos.
El operador retornará verdadero si op1 es mayor a op2. Por ejemplo "z" gt "a" es verdadero.
El operador retornará verdadero si op1 es mayor o igual a op2. Por ejemplo "z" ge "y" y "z" ge "z" son verdaderos.
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.
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.
my @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
my @array = (1..10);
Ahora tendremos nuestro array con la lista de números del 1 al 10.
my @array = (01..10);
Nuestro array contendrá correctamente los valores 01,02,03,04,05,06,07,08,09,10.
my @array = ('a'..'e');
El resultado es justo como lo queremos a,b,c,d,e.
my @array = ('aa'..'af');
Los valores serían aa,ab,ac,ad,ae,af.
Como resultado nuestra variable $frase tendrá el valor "Hola me llamo Uriel". Pero, que pasa si combinamos números con cadenas:
1
2
3
4
my $saludo = "Hola me llamo ";
my $nombre = "Uriel";
my $frase = $saludo . $nombre;
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.
my $var = "A" x 6;
Esto genera el valor AAAAAA.
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.
1
2
3
4
my $var = 1;
my $num = 20;
$var = $var + $num;
$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.
my $num = 5;
$num -= 4;
¿Puedes suponer que valor tendrá $num?
Orden de Precedencia
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;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.
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.
(), [], {} 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ónmy $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.
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.
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.
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.
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 a