Mostrando entradas con la etiqueta problemas. Mostrar todas las entradas
Mostrando entradas con la etiqueta problemas. Mostrar todas las entradas

2008/02/14

Expresiones reguleras

El otro día un conocido tenía un problemilla con las expresiones regulares y me ofrecí a ayudar. Lo dejo por aquí para no olvidarlo (que es lo que tienen estas cosas, que uno se olvida de ellas frecuentemente).

Las expresiones regulares son un mecanismo la mar de potente para buscar texto. Es tanta la potencia que tienen que normalmente no usamos más que lo básico y al necesitar algo más avanzado podemos perdernos (por eso existen algunas herramientas para hacer y comprobar las expresiones regulares, aunque personalmente yo para eso uso el editor Vim). Como introducciones a las expresiones regulares hay en Internet a miles, no me extenderé en eso y paso al problema en cuestión, que consistía en buscar con PHP algunas agujas de texto en un pajar de HTML.

En el pajar se reconocen 3 tipos de agujas que nos interesa encontrar:

<!-- textoA textoB-->
<!-- textoA textoB str1-->
<!-- textoA textoB str1 str2-->

De ahí interesa diferenciar los 3 casos y extraer str1 y str2 en los 2 últimos casos. El código PHP con las expresiones regulares que había al principio era más o menos este (pongo sólo las funciones preg_*, que es lo interesante):

preg_match("/<!-- textoA textoB-->/", $pajar);
preg_match_all("/<!-- textoA textoB (.+)-->/", $pajar, $arr);
preg_match_all("/<!-- textoA textoB (.+) (.+)-->/", $pajar, $arr);

El problema aquí es que la segunda expresión encuentra las 2 últimas agujas, por lo que la tercera expresión no servía de nada (por que estaba en un else que dependía de la segunda). Una vez resuelto puede parecer evidente, pero a simple vista tampoco se me ocurrió a mi lo que estaba pasando.

El problema es el punto: el punto hace coincidir cualquier carácter, y el espacio en blanco también es un caracter, por lo tanto es normal que aparezcan casos de la tercera aguja cuando sólo nos interesa la segunda. La solución pasa por buscar cualquier carácter excepto el espacio que tiene que haber entre str1 y str2 (asumí que ni str1 ni str2 van a contener ningún espacio, pero es una presunción peligrosa). La forma de decir esto mediante expresiones regulares es mediante un conjunto de exclusión (que es igual que el resto de conjuntos pero el primer carácter debe ser un acento circunflejo '^'). Las expresiones quedan así:

preg_match("/<!-- textoA textoB-->/", $pajar);
preg_match_all("/<!-- textoA textoB ([^ ]+)-->/", $pajar, $arr);
preg_match_all("/<!-- textoA textoB ([^ ]+) ([^ ]+)-->/", $pajar, $arr);

Como he comentado antes, si por algún casual la str1 o la str2 que nos interesan tuviesen espacios, ni la segunda ni la tercera expresión regular encontrarían nada, lo que puede ser un problema; pero nada que no se arregle con unos cuantos modificadores en las expresiones :)

Y esto ha sido todo en la entrada de San Valentin (es lo que tiene amar a las expresiones regulares) XD

2007/11/02

Compiz fuuuuusion

Hace unos días salió la última versión de Ubuntu, y tengo un PC algo viejuno (AMD K7 1000Mhz) que la estaba esperando.

Tras unos problemillas (que me veía venir por culpa del automatix), conseguí completar la instalación de Ubuntu 7.10 Gutsy Gibbon, y pensé: "Hey, aunque la tarjeta sea una GeForce2 chusta del año de la picor, algunos jueguecillos 3D (el planet penguin racer, el gltron, etc...) tiraban bastante bien, ¿y si activo los efectos?". Y eso intenté. No fue dificil, pero tampoco fue todo lo fácil que podría haber sido. Paso a comentar la experiencia por aquello de dejar constancia por si a algún otro le sucede lo mismo.

Para empezar, como ya he dicho, la tarjeta es una GeForce2 MX/MX400, según la información del hardware que proporciona la Ubuntu, con unos 32Mb si no recuerdo mal.

Bueno, de primeras Ubuntu no acepta activar los efectos, así que me di una vuelta por la procelosa red y encontré el siguiente comando para probar:

SKIP_CHECKS=yes compiz

Lo ejecuto en un terminal y escupe algunas cosillas sin importancia, pero parece que funciona parcialmente, el caso es que no hay barra de título ni bordes en las ventanas (lo que se conoce como decoradores de la ventana), y luego algunas ventanas y menús aparecen negras/os sin motivo aparente.

Bueno, en realidad uno de los mensajes es que compiz no encuentra el servidor gráfico xserver-xgl, pero tras arrancar el comando puedo incluso poner los efectos al máximo (máximo según ubuntu), así que me anoto mentalmente instalar el servidor xgl. Aplico <ctrl+c> en el terminal para matar a compiz y reinicio la sesión con <ctrl+alt+backspace>. Me doy otra vuelta por cubierta y encuentro que algunas tarjetas nVidia necesitan el siguiente comando:

sudo nvidia-xconfig --add-argb-glx-visuals -d 24

Y despues de lanzarlo instalo el servidor xserver-xgl que me pedía compiz:

sudo apt-get install xserver-xgl

Reinicio y tras decirle al nuevo servidor qué monitor tengo y qué drivers voy a usar (al parecer no los coge del servidor Xorg), ya ni siquiera necesito el comando con el SKIP_CHECKS, y Ubuntu me deja activar los efectos perfectamente.

Linkografía:

PD: Como nota adicional, también hice una prueba con emerald (window decorator alternativo: más bonito y con más opciones que el de casa), pero que no se por qué motivo se me va ralentizando hasta ser inusable, así que como con el de casa (gtk-window-decorator) funciona y ya está todo suficientemente bonito, desinstalé emerald y me entretuve un rato haciendo temblar las ventanas XD qué diversión XD.

2007/10/11

No está muy católica mi conexión últimamente.

Desde hace unos días, la conexión no va muy fina por las noches que digamos. Estoy necesitando refrescar unas cuantas veces para abrir casi cualquier página, sobre todo a partir de las 20:00h (aprox.).

Es curioso que esto me venga sucediendo casi desde que se anunció la compra de Tele2 por parte de Vodafone.

Aunque de momento el bittorrent me ha funcionado como siempre. A ver si se le pasa pronto.