Otro de mis pequeños proyectos

Categoría: trucos (Página 2 de 2)

Crear un DOMDocument de un DOMNode en PHP5

Tengo que reconocer que DOMDocument (del Document Object Model de PHP) me gusta muy muy poco. Lo he usado por necesidad un par de veces en versiones tempranas de PHP5 donde SimpleXML todaví­a no tení­a tanta potencia y con el problema de no poder usar por ejemplo YAML u otro tipo de formatos que no me daban la potencia y flexibilidad de XML para ciertos casos.

Bueno, una de los últimos problemas que me he encontrado ha sido cómo obtener un DOMDocument de un DOMNode ya que querí­a usar XPath a partir de dicho DOMNode, algo que no es posible si no es DOMDocument.

La verdad es que no he encontrado mucha información ni algo bonito para presentar. Sólo tengo esto, que por lo menos me ha servido (he preferido no pararme a medir el consumo de memoria o de proceso por miedo a querer descartar la idea y perder todaví­a más tiempo, jeje):

$doc = new DOMDocument();
$doc->loadXML($node->ownerDocument->saveXML($node))

El «truco» es tan sencillo como como crear un nuevo DOMDocument en el que importamos (ví­a método loadXML) el nodo a través del código XML que genera. Este código se obtiene con la propiedad ownerDocument del DOMNode (que nos retorna el DOMDocument) y sobre el que podemos llamar a saveXML, método que expulsa el XML del elemento que le indiquemos, en este caso, nuestro DOMNode.

Buscando ejecutables en el path

No es la primera vez que me encuentro con una cara de alegrí­a cuando enseño uno de estos comandos con lo que lo voy a dejar por aquí­ escrito, por si puedo alegrar unas cuantas caras más.

Básicamente consiste en sacar el path completo donde se encuentra un ejecutable en nuestro sistema. Si queremos, por ejemplo, buscar donde está el comando ls, escribimos:

$ which ls

o bien

$ whereis ls

El resultado de ambos es muy parecido: /bin/ls

¿Dónde está la diferencia? Pues which acepta por ejemplo el parámetro -a con el que se muestran todas las coincidencias (no únicamente la primera) o el parámetro -p que retorna 1 si ha encontrado el ejecutable o 0 si no (útil para scripts).

Mucho ojo, estos dos comandos únicamente buscan en aquellos paths definidos en $PATH. Si necesitas buscar fuera de los paths las dos opciones más comunes son:

$ locate ls

O más «a lo bruto»:

$ find / -name 'ls' -type f

Hay que tener en cuenta que locate requiere que se haya indexado el contenido en el disco duro. Por esto, es posible que alguna vez os haya ocurrido que el ejecutable no aparecí­a, quizás ejecutásteis el comando demasiado pronto.

Trabajar con ficheros a partir de una fecha y hora

Al hilo del post de ayer sobre date, hace poco tuve que realizar un sencillo script que borrase todos aquellos ficheros más viejos que una determinada fecha (en particular, ayer a las 6.30h).

Seguramente habrás pensado que la mejor opción es un find con -atime (o -mtime o -amin o -cmin, etc) y posteriormente con un -exec. Bien, es una buena idea aunque yo querí­a que fuese a partir de un determinado momento exactamente, sin calcular. Para esto, también usé find, pero me apoyé en date y en touch y quedó algo así­:

#!/bin/bash
# La fecha y hora de ayer a las 6.30h
FECHA=$( date +-d "06:30 yesterday" +"%Y/%m/%d %H:%M:%S" )
# Fichero temporal
POINT=$( tempfile -p "point" )
# Cambiamos la fecha del fichero temporal
touch -d "${FECHA}" ${POINT}
# Buscamos ficheros más viejos que ${POINT} y los borramos
find /path/al/destino -not -newer ${POINT} -exec rm {} \;
# Borramos basura
rm ${POINT}

Es posible que sea algo más lioso, pero sin tener que calcular nada (por ejemplo la diferencia de tiempo entre cuando ejecutemos el fichero y nuestra hora objetivo), hacemos el trabajo rápidamente. Y también podemos cambiar la hora de una forma muy cómoda.

Más info

Este «más info» va a ser un claro RTFM 😉

  • man find
  • man date
  • man touch

Ir a una fecha mediante texto

Seguramente os habrá pasado alguna vez que os interesa cierta fecha, digamos por ejemplo «ahora mismo pero hace 3 dí­as» y queréis usarlo en un comando de consola. Pues bien, esto es realmente sencillo gracias a date.

Antes de entrar en detalle, un par de comentarios sobre el comando date. Lo primero es que si escribimos directamente date tendremos algo parecido a esto:
$> date
Sat Jan 2 22:47:41 CET 2010

Ahora bien, si queremos que muestre la fecha y hora en formato numérico (con guiones y dos puntos), tenemos:

$> date +"%Y-%m-%d %H:%M:%S"
2010-01-02 22:50:06

La otra opción interesante, que es la central de este post, es la opción -d. Con esta opción podemos definir el momento que queremos que date muestre y que sea distinto de ‘ahora’. Lo que seguramente no sabí­as es que se puede definir este momento en «modo texto» (en inglés, claro está).

Por ejemplo, si queremos la hora actual, pero hace tres dí­as usaremos:

$> date -d "3 days ago"
Wed Dec 30 22:54:44 CET 2009

¿Y si queremos las 6.30h de la mañana de hace 5 dí­as? Fácil:

$> date -d "06:00:00 3 days ago"
Wed Dec 30 06:00:00 CET 2009

Venga, juguemos un poco más!

¿Qué dí­a de la semana fue hace 1 año, 2 meses y 23 dí­as?

$> date +%a -d "1 year ago 2 months ago 23 days ago"
Fri

¿Es el mismo que hace 449 dí­as?

$> date -d "449 days ago"
Fri

Pues sí­ xDD

¿Las 7.30h de la mañana del pasado lunes?

$> date -d "07:30:00 last monday"
Mon Dec 28 07:30:00 CET 2009

También funciona para fechas futuras.Las 8.00h de la mañana de dentro de dos lunes (cuando se acaban las vacaciones :p):

$> date -d "08:00:00 2 monday"
Mon Jan 11 08:00:00 CET 2010

¿Qué dí­a de la semana será hoy el año que viene?

$> date +%a -d "year 2011"
Sun

En fin, ahora es sólo cuestión de echarle imaginación y tirar de manual y de timespec. ¡ínimo y suerte!

Eliminar entradas en el autocompletado de formularios en Firefox

Seguro que os ha pasado alguna vez que por error habéis metido un texto en un campo de un formulario web que no debí­a estar ahí­. Por ejemplo, la contraseña (o parte de ella) en el campo destinado para el nombre del usuario. Y luego es un problema porque cada vez que escribimos algo en ese campo, aparece ese texto que no queremos como posibilidad (ayuda de autocompletado).

Pues bien, en Firefox es muy fácil de solucionar.

Tan sólo tienes que estar en ese formulario y hacer que aparezcan las opciones, incluí­da la que no quieres. Entonces te pones encima de la opción que quieres borrar con el ratón (sin hacer click) y pulsas la combinación de teclas Shift + Supr (suprimir, tecla que generalmente está encima de los cursores, a la izquierda del teclado numérico).

Por ejemplo, aquí­ vemos el login de Twitter y queremos eliminar la segunda entrada, que está mal.

Debemos ponernos encima con el ratón, pero sin hacer click y entonces pulsar Shift + Supr

Debemos ponernos encima con el ratón, pero sin hacer click y entonces pulsar Shift + Supr

Tras esto, la opción desaparecerá y no tendrás que preocuparte más (hasta que metamos la pata de nuevo, jeje)

Entradas siguientes »