lunes, 28 de marzo de 2011

Eliminar un bloque de línea con sed saltándose unas líneas desde la línea que hace match

Por ejemplo tengo un fichero con el siguiente formato:

ficheroEntrada.txt:

aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...
aaaaaaaaa
una línea
primera línea q quiero eliminar
segunda línea q quiero eliminar
tercera línea q quiero eliminar
otra línea
...


Quiero/puedo encontrar las líneas con el patrón "aaaaaaaaa", y a partir de cada una, quiero eliminar el bloque de 3 líneas que se encuentran saltando 1 línea desde la línea que encajó con el patrón de búsqueda.

Para ello puedo ejecutar el siguiente script:

cat ficheroEntrada.txt | sed -e '/aaaaaaaaa/ {n;n;N;N;d}' > ficheroSalida.txt


Para cada línea que contiene el patŕon "aaaaaaaaa":

  • Con el primer n salta a la siguiente línea tras la línea que hizo match.

  • Con el segundo n alcanza la primera línea que nos interesa, desechando la anterior.

  • Avanza dos líneas más, pero esta vez agregándolas al pattern space. Por cada línea que agrega, mete delante de la línea el carácter salto de línea.

  • Una vez que hemos acumulado las 3 líneas que queríamos borrar en el pattern space, las borramos con el comando "d". Y aquí termina el ciclo de operaciones que se hace por cada línea "aaaaaaaaa" encontrada.

lunes, 21 de marzo de 2011

Jmeter - Variables compuestas con counter

Si queremos utilizar variables propias cuyo valor, o parte de éste esté en función de la variable counter, deberemos declarar nuestras variables, en vez de como "Config element -> User defined variables", como "Pre processors -> User parameters". Al parecer es debido a que las "user defined variables" se inicializan antes que el counter y probablemente una única vez por instanciación del hilo, mientras que las variables definidas en el pre processador, se generan cada vez (yo por ejemplo las puse como pre proceso de un controlador, así que se generan en cada invocación del controlador). Y como como el counter se inicializa antes que los pre-procesos, éstos ya pueden obtener el su valor correctamente. El counter, como elemento de configuración, se instancia antes que los pre-procesadores, aunque el elemento vaya colocado en el mismo nivel del árbol, detrás de los susodichos pre-procesadores.

Así podremos tener variables compuestas, definidas como MI_VARIABLE_${VAR_COUNTER}.

Yo por ejemplo, lo utilice para poder generar una batería de test para un conjunto de de nombres de usuario, uno distinto para cada iteración.

Ejemplo



Definí los posibles valores de usuarios en el nodo de "User Defined Variables". Para ello, todas las variables que quería recorrer con el controlador For, tienen el mismo prefijo, en este caso 'lolaUser' y tras el separador (también podría no haber usado el separador), números consecutivos.:

jmeter for controllerY luego en el For Controller, hago referencia a dichas variables, por el prefijo que comparten "lolaUser". Como he usado el separador, también he tenido que marcar la opción correspondiente. El valor para cada iteración se guarda en la variable especificada en el controlador FOR, en el registro "output variable name", en éste caso la llamé PROFILE, a la que posteriormente podré acceder dentro de los distintos nodos dentro del bucle con ${PROFILE}:

jmeter for controller

jueves, 17 de marzo de 2011

Información del procesador en ubuntu

Para comprobar las características del procesador en ubuntu podemos invocar lo siguiente en la consola:


cat /proc/cpuinfo


Para comprobar si el procesador es de 64bits ejecutar:


grep --color=always -iw lm /proc/cpuinfo


Con lo que se busca el flag lm (lm -> long mode), que indica que el procesador es capaz de direccionar 64bits.

En vez de lm se puede buscar el flag rm (rm -> real mode) para comprobar si el procesador es de 16bits o el flag pm (pm -> protected mode) si el procesador es de 32 bits.

jueves, 10 de marzo de 2011

JMeter - trucos del regular expression extractor

Al usar el "Regular Expression Extractor":

Para almacenar en la variable "kk" todos los matches, poner en "Match No." -1. De ésta forma, si tenemos 3 matches, cada uno se guardará en la variable "kk_1", "kk_2", "kk_3". Si hubiera N matches para el patrón que hayamos especificado, entonces se guardarían todos en "kk_1", "kk_2", ... "kk_N".
La variable "kk_matchNr" contendrá el número de matches (coincidencias) que se han obtenido/guardado.

Para ver todas estas cosas, añadiríamos "Debug Sampler" y el listener "View results tree", donde en la pestaña "Response data" de la ejecución de cada "Debug sampler" se puede ver el contenido de todas las variables de jmeter (y si lo indicamos en el debug sampler, también podemos ver las propiedades y las variables de sistema) existentes.

viernes, 5 de noviembre de 2010

Referencias a tokens de expresiones regulares en Notepad++

En vez de $1 hay que poner \1.

$1,$2,... es el formato estándar para hacer referencia a un token de la expresión regular con el que se ha encontrado la coincidencia.

Pero en el editor notepad++, si queremos buscar/reemplazar, usando expresiones regulares, debemos usar el formato \1,\2,... en vez de $1,$2,...

Por ejemplo, tengo las siguientes cadenas:

aaa342
bbb545

y me quiero quedar sólo con la parte de los números de cada cadena.
Entonces invoco el menú buscar/reemplazar de notepad++ (ctrl+h directamente, o bien, ctrl+f y pestaña 'reemplazar' o 'replace'):

buscar: [a-z]*([0-9]*)
reemplazar: \1

Y obtengo:

342
545

Al coincidir la expresión regular, las partes rodeadas por (), se pueden referenciar por identificadores, cuyo índice va en el orden de ocurrencia de dichos bloques, de izquierda a derecha y en los anidamientos de fuera hacia dentro.

Buenas herramientas para probar expresiones regulares online y offline.

Online:

(Aplicaciones web)

Offline:

(Aplicaciones para descargar)

jueves, 16 de septiembre de 2010

Widget "archivos" de Wordpress mostrando títulos de entradas

Problema: Quiero que el widget "archivos" de Wordpress (3.0.1) muestre la lista con los títulos de todas las entradas, en vez de una lista de meses y números de entradas en cada mes.


Como es un widget básico incluido en el núcleo de wordpress, la llamada a la función (wp_get_archives) que obtiene el listado final que muestra este widget, se encuentra en el fichero:


DirectorioSitioWordpress\wp-includes\default-widgets.php



Como vemos ahí.. a la función que obtiene el listado que muestra el widget Archivo, que es wp_get_archives, se le pasa el resultado de aplicar filtros suscritos al tópico "widget_archives_args".


wp_get_archives(apply_filters('widget_archives_args', array('type' => 'monthly', 'show_post_count' => $c)));


Esto nos permite enganchar un filtro (ni más ni menos que una función) que se encargará de modificar el parámetro "type" del array que recibe como argumento la función "wp_get_archives", de "monthly", que es el valor que tiene aquí por defecto, al valor que nosotros queramos. En este caso concreto, "postbypost", para que se muestren los títulos de todas las entradas obtenidas. Además, esa función interceptora, la vamos a colocar en el fichero functions.php del tema que tenemos activado. De esta forma, aunque se actualice la base de wordpress, como no se toca nuestro tema, nuestra modificación seguirá funcionando.

Así que, no tocamos nada en el fichero "default-widgets.php" y añadimos al fichero rutaDeNuestroTema/functions.php de nuestro tema el siguiente fragmento de código.:



/**
* Archive widget showing post names instead of monthly links.
*
*/

add_filter('widget_archives_args','showArchivePostByPost', 1, 1);



function showArchivePostByPost($wp_get_archives_args){
$wp_get_archives_args['type'] = 'postbypost';
return $wp_get_archives_args;
}


Lo ideal es que nuestro tema tambien sea una extensión de uno existente, de esta forma, las actualizaciones de temas tampoco nos afectarán negativamente.


Otros parámetros para obtener otros tipos de listado se pueden consultar en la página de documentación de la función wp_get_archives.

jueves, 9 de septiembre de 2010

URL legibles - Permanent Links in WordPress 3.0.1

Esta entrada pretende aclarar y guiar, un poco, la configuración necesaria para activar la generación y uso de enlaces permanentes (comprensibles para el ser humano y más aprovechables para ser indexados por los motores de búsqueda de los buscadores) en Wordpress 3.0.1:


Un enlace permanente es por ejemplo "www.miblog.com/inicio/", en vez de "www.miblog.com/?p=1".


Configuración en Wordpress


En el gestor del blog vamos a "Ajustes"->"Enlaces permanentes".


Elegimos "Estructura personalizada" y definimos la estructura de los enlaces permanentes, por ejemplo como:


/%year%/%monthnum%/%postname%/


En el sitio construido con Wordpress, podemos tener páginas estáticas y páginas que albergan las entradas del blog. Para cada uno de esos tipos de páginas, la regla de reescritura para generar el enlace permanente es distinta.


Páginas estáticas


En el menú de "enlaces permanentes", si seleccionamos cualquier opción distinta de "predeterminado", las páginas estáticas tomarán la URI de la siguiente forma: "http://www.miblog.com/titulo_pagina/". Si la página está anidada dentro de otra, por ejemplo la página 2 tiene como superior a la página 1, la URI refleja este anidamiento:


http://www.miblog.com/titulo_pagina1/titulo_pagina2/


Páginas de una entrada del blog


Y las páginas que contienen entradas concretas del blog, tomarán el patrón definido en el menú "Enlaces permanentes", del apartado "Ajustes", del gestor del sitio de Wordpress. Supongamos que en la página 3 es donde se muestra el listado de las entradas(posts) del blog. Y a su vez la página 3, está anidada en la página 1, que no tiene a ninugna por encima (es por ejemplo la de inicio). Y supongamos que tenemos una entrada con el título "hoy no me puedo levantar", y la fecha de esa entrada es 30-02-2010. Para la entrada anterior se generaría la siguiente URI:


http://www.miblog.com/2010/02/hoy-no-me-puedo-levantar/


Como se puede apreciar, se ha aplicado el patrón de renombrado ("/%year%/%monthnum%/%postname%/") definido en el menú de "Enlaces permanentes" y no se ha tenido, para nada, en cuenta la página donde se muestra el listado de las entradas.


Algunas reglas y sugerencias para los patrones de renombrado


Hay que asegurarse de que cada enlace persistente apunta a una única entrada, para se debe terminar la estructura con %post_id% (identificador de la entrada) o %postname% (titulo de la entrada).


Por razones de rendimiento, para que a Wordpress le cueste menos diferenciar la URI de una página de la de una entrada(post), es preferible no iniciar la estructura del patrón para enlaces permanentes con campos %category%, %tag%, %author% o %postname%.


Lo común es iniciarlo con algún campo relativo a fecha. Por ejemplo:


/%year%/%monthnum%/%day%/%postname%/


Configuraciones necesarias en Apache


Si usamos Apache como servidor web, debemos activar la carga del módulo de escritura. Para ello, en el fichero de configuración del servidor "httpd.conf", debemos descomentar la línea:


#LoadModule rewrite_module modules/mod_rewrite.so


Descomentar, es borrar en este caso, el símbol "#", dejandolo así:


LoadModule rewrite_module modules/mod_rewrite.so


Reiniciamos el servidor para que se cargue el módulo y voilá, ya tenemos enlaces permanentes para las páginas de nuestra web construida con Wordpress.

domingo, 30 de mayo de 2010

Hack CSS exclusivo del IE8

Con éste hack, o truco, conseguimos que la propiedad de estilo sólo se aplique en el internet explorer 8. Ni Firefox, ni versiones inferiores de explorer detectarán las propiedades definidas de esta manera.

selector {propiedad: valor\0/;}

La clave del truco es "\0/", que se pone tras el valor de la propiedad del estilo.

Un ejemplo:

<!-- Definición del estilo en alguna parte -->

<style type="text/css">

p.textoRojoEnIE8 {color: #ff0000\0/;}

</style>

...

<!-- Código html dentro del tag body -->

<p class="textoRojoEnIE8">

El texto de éste párrafo se verá rojo, sólo en Internet Explorer 8.

</p>

<!-- O definiendo el estilo directamente en el tag. -->

<p style="color: #ff0000\0/;">

Éste párrafo también se verá en rojo, sólo en IE8.

</p>

Fuente: Internet Explorer 8 only CSS hack

miércoles, 25 de noviembre de 2009

El Vectorcito Rojo y la Matriz Feroz

Érase una vez un vectorcito que vivía con su familia generadora en su
casita, V. Era un vectorcito muy joven, pues apenas acababa de cumplir un
módulo. Tenía el sobrenombre de Vectorcito Rojo por ser una ferviente
admiradora de Lindeloff, famoso comunista de la época.

Cierto día, su mamá la llamó:

-"¡Eh, Vectorcito Rojo, ven aquí!. Quiero que lleves estas coordenadas a la
casa W de tu abuelita, pues la pobre está muy sola desde que se ha
restringido a un espacio de dimensión 1, pero ten cuidado cuando vayas por
el bosque Hom(V,W), pues hace tiempo que acecha una matriz muy, muy feroz."

-"Sí, mamá.", dijo Vectorcito Rojo.

Entonces su mamá cogió un 2-cubo abierto de "papé arbá", puso las
coordenadas y estiró y retorció (pero sin romper ni pegar) el 2-cubo hasta
convertirlo en una esfera menos un punto. Después se la dió a Vectorcito.

-"¡Ah!, y sobre todo no te entretengas cogiendo grafos por el camino, ya
sabes que hay que cuidar el entorno."

-"No te preocupes, mamá.", y dicho esto, se orientó hacia la casa de su
abuelita.

Vectorcito Rojo se movía alegremente a través del bosque Hom(V,W), pues
pensaba que la matriz debía de rondar muy lejos, por lo menos en el quinto
isomorfismo, cuando de repente, algo saltó detrás de una función y se plantó
delante de Vectorcito Rojo. Vectorcito le reconoció: era la matriz de la que
la había hablado su mamá. Parecía muy, muy fuerte (coloquialmente hablando,
la matriz estaba cuadrada) y la miraba con maldad.

-"¿Donde vas, Vectorcito Rojo?."

-"Voy a llevarle estas coordenadas a mi abuelita.", dijo ella muerta de
miedo.

-"¿Me dejas probar alguna? Hace tiempo que no como nada desde que me echaron
de GL(n,k) por degenerado."

-"No," dijo Vectorcito, "son para, y solo para, mi abuelita."

-"Hagamos una cosa." dijo la matriz, "Te echo una carrera hasta la casa de
tu abuelita, y si llego antes que tú tendrás que darme al menos una."

Vectorcito Rojo vaciló: su familia vivía en un espacio de clase media (más
concretamente C¹) y además de dimensión finita, así que no podía ir por ahí
tirando una coordenada como si estuviera en un espacio proyectivo.

-"No," dijo Vectorcito Rojo, "tengo como norma no entretenerme y coger
siempre el camino más corto" (esta norma, de uso tan extendido, es tambien
conocida como norma euclídea).

-"Te doy ventaja: contaré hasta omega antes de empezar a correr.", dijo la
matriz.

Vectorcito Rojo pareció cambiar de opinión: la matriz parecía sincera, al
menos en casi todo. Vectorcito Rojo asintió, y empezó a correr.

Pero he aquí que la matriz, al ser degenerada, era muy tramposa, y como tal
contó hasta omega, pero usando el axioma de elección, con lo que tardó muy
poco. Entonces empezó a correr a través del bosque adquiriendo una velocidad
extraordinaria (no en vano era una matriz 4x4) y llegando a casa de la
abuelita un tiempo t antes que Vectorcito Rojo.

Una vez que llegó la matriz a casa de la abuelita, llamó a la puerta, que
estaba cerrada. La verdad es que la abuelita era una persona muy discreta
pues toda su casa siempre estaba cerrada (y abierta a quien la abuelita
quisiera).

-"¿Quién es?.", preguntó la abuelita.

-"Soy yo abuelita, tu querida nietecita."

-"No conozco tu voz, querida."

-"Es que estoy mal de la garganta, por culpa del gradiente de la mañana."

-"No te creo, dime, ¿qué te regalé cuando cumpliste 1/2 módulo?."

-"Un juego de polígonos constructibles con regla y compás."

-"Es cierto que eres mi nietecita, entra querida mía."

Y nada más entrar, la malvada matriz engulló a la abuelita, sin darle tiempo
a decir ni pi, entonces se disfrazó como ella, se metió en la cama, y
esperó.

Y nosotros nos preguntamos: ¿cómo sabía la matriz el regalo de la abuelita?.
Pues resulta que la malvada matriz vió un día a la abuelita comprar este
regalo en Gauss`r`us, la tienda de juguetes maximal de X, de ahí que conozca
el regalo, pero eso es otra historia.

Al cabo de un rato llegó Vectorcito Rojo. Se retrasó un poco por culpa de
las obras de parametrización de la nueva carretera.

Llamó a la puerta.

-"¿Se puede abuelita?."

-"Entra hija, y cierra la puerta que entra mucho flujo.", respondió la
malvada matriz.

-"Abuelita, abuelita, qué filas más grandes tienes."

-"Son para reducirme mejor.", dijo la matriz.

-"Abuelita, abuelita, y qué ceros más grande tienes. "

-"Son para rodar mejor.", dijo la matriz.

-"Abuelita, abuelita, y qué unos más grandes tienes."

-"¡¡Son para comerte mejor!!." gritó la matriz.

Y dicho esto la matriz se abalanzó sobre Vectorcito y se la comió.

Una vez en el interior de la matriz, Vectorcito se encontró con su abuelita.

-"¡Socorro, socorro, quiero salir de aquí!."

-"No podemos, hija" dijo la abuelita, "la matriz está cerrada
hermíticamente."

La matriz salió de casa de la abuelita. Estaba traspuesta por el festín que
se había dado y se disponía a dormir cuando apareció Jordan, el leñador, que
había presenciado todo aquello. Jordan cogió su hacha, y armado de valor y
autovalor se acercó y...¡zas! de un solo tajo diagonalizó la matriz
expulsando a la abuelita y a Vectorcito entre los restos de su polinomio
característico (el cual por cierto había quedado intacto por la acción de
Jordan).

Entonces Jordan cogió los restos de la matriz y las guardó en una caja 2x2 y
dos cajas 1x1, las ató con una n-cadena y las mandó a un cuerpo
algebraicamente cerrado, donde no podría salir por muchos polinomios que
tomara.

Una vez hecho esto, Vectorcito Rojo le dió las gracias al leñador Jordan y
al cabo de un tiempo se casaron, y fueron felices, y redujeron matrices.

Y colorín, corolario colorado,
este cuento se ha terminado.

domingo, 30 de agosto de 2009

Instalar php 5.3 en Windows Vista como Administrador

1 - Descargar el fichero del instalador (extensión .msi)
(Previamente a instalar de esta forma el PHP hay que instalar el servidor web, por ejemplo el apache).

2 - Como Vista no permite ejecutar "como Administrador" los ficheros .msi, crear un fichero .bat con la siguiente línea, y ejecutarlo para arrancar el instalador:

msiexec /i {ruta de la carpeta con el fichero .msi}\php-5.3.0-Win32-VC6-x86.msi

Por ejemplo, si tengo el fichero instalador en el directorio: d:\php, en el fichero .bat pondré:

msiexec /i d:\php\php-5.3.0-Win32-VC6-x86.msi


3 - Seguir las instrucciones del instalador de PHP para finalizar correctamente la instalación. Entre otras cosas preguntará por la carpeta con los ficheros de configuración del servidor web, por eso era importante instalarlo antes.

(Si no se ejecuta como Administrador, al final del proceso de instalación aparece un error diciendo que un script no puede ser ejecutado y por tanto la instalación no puede finalizar correctamente).