Texto en PostgreSQL

Lunes, 29 Junio, 2009 by abato

En la lista de correos de PostgreSQL en español Álvaro Herrera da estos consejos que me parece interesante tener en cuenta:

1. nunca uses CHAR
2. usa VARCHAR(n) cuando tengas alguna razón para especificar el largo máximo
3. de lo contrario usa TEXT

Ordenación natural en postgresql

Domingo, 8 Febrero, 2009 by abato

Continuando el post de ordenación natural añado un enlace al sitio oficial de PostgreSQL en el que un comentarista indica la forma de ordenar de forma natural las secuencias de caracteres que incluyen números. Y por si alguna vez desapareciese dicho comentario, copio las funciones aquí abajo.

CREATE FUNCTION btrsort_nextunit(text) RETURNS text AS $$
SELECT CASE WHEN $1 ~ ‘[^0-9]+’ THEN
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[^0-9]+’))+1 ),
” )
ELSE
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[0-9]+’))+1 ),
” )
END
$$ LANGUAGE SQL;

CREATE FUNCTION btrsort(text, integer) RETURNS text AS $$
SELECT CASE WHEN $2-1>0
THEN
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ”), 1, 12), 12, ‘ ‘) ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ”), 1, 12), 12, 0) || btrsort(btrsort_nextunit(btrsort_nextunit($1)), $2-1)
ELSE
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ”), 1, 12), 12, ‘ ‘) ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ”), 1, 12), 12, 0)
END
;

$$ LANGUAGE SQL;

CREATE FUNCTION btrsort(text) RETURNS text AS $$
SELECT btrsort($1, 10);
$$ LANGUAGE SQL;

La forma de usarlas es la siguiente. Primero vemos la ordenación que no tiene en cuenta los números (se observa que devuelve 10 como si fuese menor que 8):

SELECT room_number FROM rooms ORDER BY room_number;
room_number
———–
10
8
9
9a

Para ordenar de forma natural:

SELECT room_number
FROM (SELECT room_number, btrsort(room_number) AS room_sort
FROM rooms
ORDER BY room_sort) AS foo

Lo que devuelve:
room_number
———–
8
9
9a
10

Quiero agradecerle al autor original de estas funciones porque me resolvió un verdadero problema en el trabajo. Gracias Ryan Hughes.

El enlace al sitio oficial con el comentario de Ryan.

Efectos hover con CSS

Domingo, 26 Octubre, 2008 by abato

Efectos interesantes cuando pasas el puntero del ratón sobre un elemento HTML usando CSS:

http://phoenity.com/newtedge/element_hover/

¿Qué versión de linux tienes instalada?

Sábado, 18 Octubre, 2008 by abato

Para averiguar cuál es la versión de linux que tiene un ordenador hay que mirar el contenido de un archivo que depende a su vez de la versión. Generalmente está en /etc, por ejemplo:

cat /etc/debian-version
cat /etc/slackware-version
cat /etc/SuSE-release

Otra información interesante sobre el SO y la máquina se pude obtener mediante el comando uname.

jcarlosn ha escrito en los comentarios un método más estándar y por tanto más cómodo de averiguar la versión del sistema operativo válido para cualquier distribución de linux (¡muchas gracias!):

cat /etc/issue

En mi portátil devuelve algo así:

Welcome to openSUSE 10.3 (X86-64) – Kernel \r (\l).

Caracteres españoles en javascript

Viernes, 5 Septiembre, 2008 by abato

Una expresión regular para reconocer un texto formado sólo por letras, números, guiones bajos y los caracteres específicos del español (ñ, Ñ, ç, Ç, vocales acentuadas y úes con diéresis):

/^[\w\u00f1\u00d1\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00c7\u00e7\u00dc\u00fc]+$/

Los códigos unicode usados son:

00f1 -> ñ
00d1 -> Ñ
00e1 -> á
00e9 -> é
00ed -> í
00f3 -> ó
00fa -> ú
00c1 -> Á
00c9 -> É
00cd -> Í
00d3 -> Ó
00da -> Ú
00c7 -> Ç
00e7 -> ç
00dc -> Ü
00fc -> ü

Samba en OpenSUSE 10.3

Miércoles, 19 Marzo, 2008 by abato

Sí, todos sabemos que configurar Samba es sencillísimo… En Ubuntu he visto hacerlo con un puñadito de clicks. Pero en OpenSUSE ha sido un infierno. Lástima que sigue sin gustarme Gnome…

Dejo aquí enlazado el manual que he seguido para lograrlo. No sea que lo necesite en el futuro y pierda más valiosísisimas horas en el desesperante proceso probar/errar.

Ordenación alfabética respetando las secuencias numéricas

Sábado, 15 Diciembre, 2007 by abato

En Microsiervos comentan el problema de ordenar cadenas de caracteres que incluyen números. Lo habitual es que las cifras del número se tomen como simples caracteres y se comparen de una en una en vez de tener en cuenta el valor real del número completo.

A lo que me refiero es a que para un lenguaje de programación “nombre2.txt” normalmente se considera que viene después de “nombre10.txt” mientras que para cualquier persona el orden es el contrario.

En el artículo enlazado hay imágenes que muestran el problema y enlaces a posibles soluciones.

Obtener el estilo CSS de un elemento HTML

Sábado, 15 Diciembre, 2007 by abato

elem.style devuelve el estilo inline, id est, el que se incluye como atributo dentro de la etiqueta HTML correspondiente, y por tanto no permite obtener el estilo definido en una hoja de estilos CSS. Para esto hay que usar el método
var estilo= window.getComputedStyle(elem, null)


Así, por ejemplo, para obtener el ancho del elemento:

  • elem.style.width devolverá el ancho si se definió de forma inline o la cadena vacía si no se hizo así
  • estilo.width devolverá el ancho de elem especificado en una hoja de estilo

Hay que tener en cuenta que el método getComputedStyle es ineficiente (pues recorre toda la jerarquía CSS y crea un documento que puede ser bastante grande). También es importante tener en cuenta que el objeto devuelto por getComputedStyle es de sólo lectura y modificar sus atributos no modificará ni el elemento original ni el documento CSS correspondiente.

En IE se puede tener la misma funcionalidad a través de la propiedad no estándar currentStyle de cada objeto HTMLElement.

Anotaciones sobre CSS

Sábado, 15 Diciembre, 2007 by abato

No todos los navegadores respetan el atributo z-index cuando se aplica a elementos <iframe> y <select>.

Es más, los navegadores de cuarta generación pueden llegar a mostrar todos los elementos de un formulario por encima de todos los demás.

El ancho/alto de un elemento se refiere al contenido disponible, por tanto se ignora el borde y el padding. Por ejemplo, un div con un borde de un píxel, un padding de 5 y un ancho de 30 medirá en total 36 píxel de ancho. Los navegadores IE desde el 4 hasta el 5.5 (pero no el 5 para Mac), sin embargo, calculan mal estas dimensiones y sí incluyen el borde y el padding en el cómputo total.

IE 6 tiene dos modos de funcionamiento: estándar, que calcula bien las dimensiones, y compatibilidad, que lo hace como las versiones previas. La forma de activar un modo u otro es mediante el document-type del documento html:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0//EN”>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Strict//EN”>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>