Web programming stuff. Tutoriales, noticias, curiosidades de todo lo que me encuentre relacionado con programación web: frameworks, php, javascript, html, css, aplicaciones web y programación en general. Quality Assurance. Automatización de pruebas (Selenium, JUnit,...).
jueves, 10 de marzo de 2011
JMeter - trucos del 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++
$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:
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'):
reemplazar: \1
Y obtengo:
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)- gskinner.com (aplicación Flash)
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
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
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
(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).
lunes, 6 de julio de 2009
Escapar apóstrofe en los mensajes de los resource de Spring Framework
\'' algo {0} '\' --> tras resolverse el mensaje --> ' algo valor_param_0 '
Error.Code Mi mensaje de error para el objeto "{0}" <div class=""><img src="img/t2.gif" id="{1}_triangle"/> <a onclick="javascript:void toggleDisplay(''{1}_triggerId'', ''{1}_triangle'', ''Mostrar algo'', ''Ocultar algo'', ''{1}_divContainer'')" style="cursor: pointer; text-decoration: underline;" target="_blank" id="{1}_triggerId">Mostrar algo</a></div><div id="{1}_divContainer" style="display: none;" class="propertyRow">{2}</div>
Con esto se consigue tanto escapar los apóstrofes, como sustituir todos los parámetros correctamente.
Como argumentos este mensaje espera esto:
- (0) Una cadena con el nombre del objeto al que va destinado el mensaje.
- (1) El índice que quiero asignar a ese mensaje para que sus bloques que se van a mostrar y ocultar sean independientes de los de los demás mensajes.
- (2) El mensaje que aparecerá en el bloque que se oculta y muestra
Una vez resuelto el mensaje, dará lugar al siguiente código HTML cuando se imprima el mensaje de error por el jsp correspondiente:
(Para los argumentos: (0) fishka, (1) 33, (2) Mensaje oculto )
Mi mensaje de error para el objeto "fishka" <div class=""><img src="img/t2.gif" id="33_triangle"/> <a onclick="javascript:void toggleDisplay(''33_triggerId'', ''33_triangle'', ''Mostrar algo'', ''Ocultar algo'', ''33_divContainer'')" style="cursor: pointer; text-decoration: underline;" target="_blank" id="33_triggerId">Mostrar algo</a></div><div id="33_divContainer" style="display: none;" class="propertyRow">Mensaje oculto</div>
sábado, 16 de mayo de 2009
Play rumba
sábado, 17 de enero de 2009
Truco CSS - fijar ancho mínimo del elemento body
Vía un artículo de script&style me entero de un hack útil que no conocía: fijar el ancho mínimo del elemento body. Hice la prueba únicamente en FF3 (firefox 3) y funciona.
Problema:
Si tenemos una imagen de fondo de, supongamos, ~2000 px, centrada dentro del elemento body, al redimensionar estrechando la ventana del navegador, el elemento body tambien se estrechará redimensionando su imagen de fondo, con lo que es posible que por debajo de un ancho determinado se desencaje el diseño. Nos gustaría fijar un ancho mínimo, por debajo del cual el elemento body no siga estrechándose. Si probamos a asignar únicamente la regla min-width al elemento body, ésta parece no aplicarse.
body{min-width:958px;}
Si no se utiliza la regla color en el elemento html, la imagen de fondo se redimensiona, desencajando el diseño.El hack:
Para que la regla min-width surta efecto, es necesario añadir (no me preguntéis porque, pero funciona) una regla color, asignando el valor a, por ejemplo, blanco, al elemento html.
body{min-width:958px;}
Si se utiliza, la regla min-width del elemento body hace efecto, fijando el ancho mínimo por debajo del cual la imagen de fondo deja de redimensionarse.