Redirecciones de url en script perl

Es muy común que en lugar de devolver una página web, un script tenga que redirigir hacia otro lugar. Veamos cómo hacer una redirección de url (url redirection) en un script Perl

Imprimir directamente la cabecera Location

Para ciertas cosas Perl resulta mágico: sólo con una línea de código puede resolver el problema

#!/usr/bin/perl
print "Location: http://example.com/\n\n"; #Status code 302

Importante: la redirección tiene que ser lo primero que se envíe, dado que corresponde a las cabeceras HTTP de la respuesta. En el momento en que se imprimen los 2 saltos de línea (\n\n) explícitamente se indica la terminación de esas cabeceras. Todo lo que venga después será tratado como contenido y presentado por el navegador.

 

Usar el módulo CGI

Mediante la función redirect del módulo CGI se puede hacer la redirección también de una manera muy sencilla:

#!/usr/bin/perl
use CGI qw(:standard);
print redirect('http://example.com'); #Status code 302

De manera análoga, se puede crear una instancia de CGI y sobre la misma invocar el método redirect.

#!/usr/bin/perl
use CGI qw(:standard);
my $q = new CGI;
print $q->redirect('http://example.com'); #Status code 302

En ninguno de los casos, tal como en el ejemplo anterior, se debe imprimir otras cabeceras previamente.

Adicionamente, se soportan parámetros nombrados en la invocación:

print $q->redirect(
 -url => 'http://example.com',
 -status => '301 Moved Permanently'
);

Es a través del parámetro -status que se puede establecer el estado de la redirección. El estado por defecto en perl, si no es especificado, es 302.

 

Estados posibles para la redirección

HTTP define los siguientes códigos de estado para la redirección

  • 301 Moved Permanently
    • Esta petición y todas las siguientes se deben repetir con la url indicada
  • 302 Found
    • La petición debe repetirse con otra url. Futuras peticiones deben seguir utilizando la url original.
    • Este estado ha sido reemplazado por 303 y 307:
      • HTTP/1.0 requería que el cliente realizara una redirección temporal (la frase original de la descripción era “Moved Temporarily”) sin cambiar el método utilizado en la petición original. Pero muchos navegadores implementaron este código forzando el método de la nueva petición a GET, sin importar el utilizado en la petición original. Es un ejemplo de cuando la práctica de la industria termina contradiciendo el estándar.
      • HTTP/1.1 agregó nuevos códigos de estado a fin de distinguir ambos comportamientos: 303 para cambiar el método a GET y 307 para preservar el método originalmente usado.
      • Muchos frameworks y aplicaciones web lo siguen soportando para mantener la compatibilidad hacia atrás.
  • 303 See Other (desde HTTP/1.1)
    • La petición debe repetirse con otra url usando el método GET.
    • Cuando se recibe en respuesta a POST (o PUT/DELETE), el cliente debe asumir que el servidor ha recibido los datos y debe solicitar una petición GET a la url indicada
  • 307 Temporary Redirect (desde HTTP/1.1)
    • Esta petición debe repetirse con otra url. Futuras peticiones deben seguir utilizando la url original.
    • A diferencia de 302, no permite que cambie el método cuando se vuelve a realizar la petición.
  • 308 Permanent Redirect
    • Esta petición y todas las siguientes se deben repetir con la url indicada
    • A diferencia de 301, no permite que cambie el método cuando se vuelve a realizar la petición.

Si bien es posible utilizar cualquier código de estado diferente a los especificados, probablemente se rompa la redirección. Notar también que la frase a continuación del código se espera también como parte del mismo.

OBS: los códigos 304, 305 y 306 existen pero no se utilizan para la redirección.

Anuncios

Mostrar caracteres no imprimibles en un archivo de texto

A veces los archivos de texto contienen caracteres no imprimibles o espacios al final de línea que no siempre se notan claramente.

$ cat contenido.txt
texto 1
texto 2
texto   3

Invocando cat con la opción -A podemos verlos:

$ cat -A contenido.txt
texto 1 ^M$
texto 2^M$
texto^I3^M$
^M$

En este ejemplo podemos, se trata de un archivo en formato DOS por el fin de línea utilizado (^M$), en el cual:

  • la primer línea tiene un espacio luego de 1,
  • la tercera tiene un TAB (^I) entre texto y 3
  • la última es una línea vacía

Basado en:

http://systemadmin.es/2015/03/ver-caracteres-no-imprimibles-con-cat

Ejecutar procesos indicando la prioridad en Windows

Si bien se puede Cambiar la prioridad de un proceso en Windows una vez iniciado, es posible que al lanzarlo desde la línea de comandos querramos indicar su prioridad:

start <prioridad> <comando>

donde <prioridad> es alguno de los siguientes valores:

  • /REALTIME: Tiempo real
  • /HIGH: Alta
  • /ABOVENORMAL: Por encima de lo normal
  • /NORMAL: Normal 😉
  • /BELOWNORMAL: Por debajo de lo normal
  • /LOW: Baja

Ejemplo

start /high /b backup.bat

Se ejecuta el archivo batch con la prioridad alta, sin crear una nueva ventana (/b)

También podés Ejecutar procesos indicando la prioridad en Linux

Volver la dirección del texto de izquierda a derecha en Firefox

Me ha sucedido en múltiples ocasiones que cuando estaba escribiendo en un campo de texto de un sitio web en Firefox, al presionar una combinación de teclas, que no me daba cuenta cuál era, el puntero y todo el texto escrito se alineaban a la derecha, y lo que escribía se iba mostrando hacia la izquierda.

Siempre terminar reiniciando el navegador, no sin antes copiar el texto para no perderlo…

La combinación en cuestión es

Ctrl+Shift+X

la cual cambia la dirección del texto. Volviendo a ejecutarla, se vuelve a la dirección normal.

Atajo para acceder a las Propiedades del sistema en Windows 7

Cada tanto tengo que acceder a las Propiedades del sistema en Windows. Agregar Variables de entorno es lo más común y en algunos casos mas remotos, configurar la posibilidad de Restaurar sistema o la configuración de Escritorio remoto.

Siempre sigo los mismos pasos:

  1. Acceder a “Sistema”
    • Sobre el icono de Equipo en el escritorio, presionar el botón derecho y elegir Propiedades.
      • Se puede hacer lo mismo sobre el vínculo Equipo dentro del menú Inicio
    • Acceder a Panel de Control > Sistema desde el menú Inicio
    • Abrir Equipo y en los comandos en la barra superior elegir “Propiedades del sistema” (*)
    • Presionar Tecla Win + Pausa
  2. Presionar sobre “Configuración avanzada del sistema” a la izquierda.

(*) Lo cual es raro porque accede a “Sistema”… Si elegimos “Propiedades” entre los comandos, se presentan las propiedades de la unidad de disco seleccionada dentro del Equipo.

El atajo para acceder de manera inmediata es:

Presionar Win + R (Ejecutar…) y tipear “sysdm.cpl

Tratamiento de mayúsculas y minúsculas en MySQL

Según Wikipedia, la sensibilidad a mayúsculas y minúsculas, se explica de la siguiente manera:

Que algo sea sensible a las mayúsculas y minúsculas, abreviado a veces como sensible a mayúsculas,​ y dicho también directamente en inglés case sensitive, es una expresión usada en informática que se aplica a los textos en los que tiene alguna relevancia escribir un carácter en mayúsculas o minúsculas.

Lo contrario se denomina insensible a las mayúsculas y minúsculas, abreviado a veces como insensible a mayúsculas​ y dicho también directamente en inglés case insensitive.

 

Por defecto, MySQL hace un tratamiento diferente para las mayúsculas en los nombres de las bases de datos y tablas según el sistema operativo como veremos a continuación.

Lo más sencillo y recomendable para facilitar el uso, la portabilidad y evitar problemas es adoptar una convención consistente: crear y consultar bases de datos y tablas usando nombres en minúsculas.

Muchas veces no se puede aplicar esta recomendación “de palabra”, por lo que se debe recurrir a una variable de configuración.

 

Variable lower_case_table_names

Esta variable se define dentro del archivo de configuración my.cnf (Linux) o my.ini (Windows). Determina cómo MySQL almacena en disco y consulta los nombres de bases de datos y tablas. El almacenamiento en disco se refiere al proceso de creación, con las instrucciones CREATE DATABASE y CREATE TABLE, respectivamente.

  • lower_case_table_names=0 (case sensitive en la creación y consulta)
    • los nombres se guardarán en disco tal y como se han especificado en la creación
    • los nombres en las consultas deben respetar las mayúsculas
    • NO de se debería establecer en sistemas operativos que sean case-insensitive! (Windows u OS X)
  • lower_case_table_names=1 (case insensitive en la creación y consulta)
    • los nombres se guardarán en disco siempre en minúsculas, independientemente de como se escriban
    • los nombres en las consultas son convertidos a minúsculas (también aplica a los aliases)
  • lower_case_table_names=2 (case sensitive en la creación – case insensitive en la consulta)
    • los nombres se guardarán en disco tal y como se han especificado en la creación
    • los nombres en las consultas son convertidos a minúsculas (también aplica a los aliases)
    • Solo funciona en sistemas operativos que no sean case-sensitive!
    • Los nombres de tablas InnoDB son una excepción y se almacenan en minúsculas, como en el caso de lower_case_table_names=1

A continuación, los valores por defecto para cada sistema operativo:

  • Linux: lower_case_table_names=0
  • Windows: lower_case_table_names=1
  • OS X: lower_case_table_names=2

 

¿Qué valor de lower_case_table_names usar?

En el caso de usar MySQL en un solo tipo de sistema operativo, se puede mantener el valor por defecto de lower_case_table_names.

Los conflictos aparecen al empezar a transferir tablas hacia otros sistemas que difieran en la sensibilidad a mayúsculas:

En Linux podrían existir las siguientes tablas: usuarios, USUARIOS y Usuarios.

Al importar un dump que las contuviera en Windows, la primera se crea sin problemas, pero la siguiente genera un error indicando que la tabla ya existe. Esto sucede porque para Windows las 3 tienen el mismo nombre.

A fin de evitar este tipo de problemas se puede optar por:

  1. Usar lower_case_table_names=1 en todos los sistemas (mi recomendación)
    • La “desventaja” es que no se verán listados con sus nombres originales, si los mismos estaban especificados con mayúsculas en la creación
  2. Usar lower_case_table_names=0 en Linux y lower_case_table_names=2 en Windows.
    • Esta alternativa es propensa a fallar cuando se hagan consultas que funcionan en Windows porque los nombres se pasan a minúsculas automáticamente, pero en Linux generan errores porque no se utilizaron las mayúsculas tal cual se especificaron en la creación.
    • Si se usan tablas InnoDB no queda más remedio que usar la opción 1.

 

Basado en:

http://rm-rf.es/mayusculas-y-minusculas-en-mysql/

Concatenar cadenas de caracteres en MySQL

La función más común para juntar un conjunto de cadenas de caracteres en MySQL es CONCAT(cadena1, cadena2, …)

Algunas consideraciones:

  • Si los argumentos que recibe son “no binarios”, la cadena resultante es no binaria
  • Si al menos uno de los argumentos es una cadena binaria, la salida es binaria.
  • Un número se convierte a su forma de texto no binaria
  • Si alguno de los argumentos es NULL, retorna NULL

mysql> SELECT CONCAT('Lalo', ' ' , 'Landa');
-> 'Lalo Landa'

mysql> SELECT CONCAT('Lalo', NULL , 'Landa');
-> NULL

El uso más común es para unir nombre de campos de las tablas incluidas en la consulta:

mysql> SELECT CONCAT(apellido, ', ' , nombre) FROM usuarios;
-> 'Gómez, Mario'

Cuando es necesario indicar un separador para unir más de 2 cadenas, lo recomendable es usar la función CONCAT_WS(separador, cadena1, cadena2, …)

Es una forma especial de CONCAT(). El WS al final proviene de  “With Separator”, lo que en conjunto sería “Conctatenar con Separador”. El primer argumento que recibe es el separador que se agregará entre cada una de las cadenas indicadas a continuación.

Algunas consideraciones:

  • Si el separador es NULL, el resultado es NULL
  • Si alguno de las cadenas es NULL, la misma se omite

mysql> SELECT CONCAT_WS(' ', 'Lalo' , 'Landa');
-> 'Lalo Landa'

mysql> SELECT CONCAT_WS(' ', 'Lalo', NULL , 'Landa');
-> 'Lalo Landa'

Concatenando múltiples campos:

mysql> SELECT CONCAT(' ', titulo, nombre, apellido) FROM usuarios;
-> 'Ing. Sergio Morales'