Otro de mis pequeños proyectos

Autor: tatai (Página 3 de 25)

PHPConference 2010

Y de nuevo este año me he venido el 29 y 30 de octubre a disfrutar de la PHPConference a Cornellà, Barcelona. Tras el muy buen sabor de boca del año pasado, era necesario repetir porque las conferencias no pintan nada mal. Quizás menos «grandes nombres» en el cartel, pero ni mucho menos parece que va a desmerecer.

En breve lo comprobaremos.

Mis reviews del año pasado:

Update: ya disponible el review del primer día

Update: y el del segundo

Update: y el listado de slides y datos de conferenciantes

Porque wordpress pide datos de conexión cuando actualizamos automáticamente

Me he encontrado al intentar actualizar unos plugins de un nuevo wordpress que al hacerlo me pedía los «datos de conexión», algo que me ha parecido raro porque generalmente no suele hacerlo.

Tras bucear un poco en el código me he dado cuenta que en la función get_filesystem_method() de wp-admin/includes/file.php (que se llama desde wp-admin/includes/plugin.php, encargada de actualizar el plugin cuando se lo pedimos) se comprueba que el fichero que se está ejecutando tiene el mismo identificador de usuario que el proceso que está ejecutando la petición.

Esto es así en la amplia mayoría de los casos y no dará problemas, sobre todo si trabajamos con un hosting preparado. Pero si esto ocurre, la opción más rápida sería cambiar el uid de usuario de todos los ficheros de vuestro wordpress al usuario con el que se ejecuta apache. Es decir, partiendo de que el usuario de apache es www-user y vuestro wordpress está en /var/www/wordpress, sería usar el comando:

chown -R www-user /var/www/wordpress

Problemas con Internet Explorer y hover (css)

La semana pasada uno de nuestros clientes nos puso un problema sobre la mesa que nos ha traído de cabeza unos días. El problema en cuestión era que diversas páginas de su web, que eran pesadas (incluso podemos decir que muy pesadas ya que algunas tenían 4 megas de HTML, pero otras 8, 13 y hasta 15), tenían un problema de rendimiento bastante grave.

Poniendo en contexto, una vez cargadas esas páginas, es decir, no teniendo en cuenta el tiempo que necesita el navegador para descargar la página ni el tiempo para renderizarla al completo, con su javascript, cuando navegamos por la página, Internet Explorer (7 y 8, con la 6 no tanto) empieza a cargar la máquina, subiendo el uso de CPU hasta el 100% durante varios segundos y haciendo imposible la navegación, hasta tal punto que no sólo afectaba al scroll sino que incluso cuando desplazamos el cursor por la página el simple hecho de ponernos encima de un enlace, llegaban a pasar segundos hasta que el cursor cambiaba desde la tradicional flecha al cursor:pointer característico en cada sistema operativo y navegador.

Por no hablar del tiempo de respuesta ante los scripts o cualquier evento. Inviable.

Detallar todo el proceso que seguimos nos daría para varios posts y varias páginas, pero bueno, habiendo descartando completamente que el problema fuese javascript o el framework que se usaba (en este caso jQuery), el problema parecía estar en el tamaño de página porque cuando se reducía su tamaño los problemas desaparecían y también en la hoja de estilos, porque al comentar algunas de las hojas, el efecto se atenuaba e incluso llegaba a desaparecer.

La primera impresión fue que es posible que al ser la página tan grande y tener muchos elementos que flotaban, alternando con elementos de bloque es posible que el navegador necesitase todo ese procesado, pero comprobamos como ese no era el problema (evidentemente, algo de se notó puesto que efectivamente el navegador tenía que pensar algo menos), pero no era la causa ya que la mejora no era aceptable.

Finalmente, probando más cosas surgió la idea de comentar todos los hover (también se probó con los float y otros atributos) y cuál fue nuestra sorpresa cuando el efecto desapareció. Centramos toda nuestra atención, esto no lo habíamos visto nunca.

Sólo había una cosa rara, en unas pocas líneas (4 ó 6) teníamos unas propiedades css similares a estas (no es el caso real, pero sí similar):

.listados .visual {color:#777;}
.listados .visual:hover {color:#000;}

Para un HTML como este:

<div class="listados">
<p><a href="#" class="visual">Texto</a></p>
<p><a href="#">Texto</a></p>
<p><a href="#">Texto</a></p>
<p><a href="#" class="visual">Texto</a></p>
</div>

Es decir, resumiendo, las propiedades css hacen que los enlaces con class visual se pongan de color negro cuando el ratón se pone por encima.

Esto supone un gran problema para Internet Explorer. Pese a que la propiedad hover está puesta para un enlace, no poner explícitamente en los estilos que es para un enlace (tag <a>) provoca que esté constantemente recalculando y «pensando», y aquí la raíz de todo el problema.

Es decir, las líneas css deben ser:

.listados .visual {color:#777;}
.listados a.visual:hover {color:#000;}

Lo más correcto sería incluir también el a en la primera línea, para tener más coherencia, aunque no es necesario y no cambia la solución del problema.

Pero bueno, la guerra contra el IE ha terminado… y hemos ganado 🙂

Juega al trivial con Twitter y Caja Navarra

Una nueva y curiosa iniciativa ha nacido en Caja Navarra: jugar al trivial mediante Twitter! Es posible inscribirse a partir de hoy mismo hasta el 3 de octubre ya que el próximo lunes 4 de octubre comenzará el juego. Cuenta con unos jugosos premios:

  • 1er premio: iPad 16GB Wi-FI 3G
  • 2º premio: Iphone 4 16Gb libre
  • 3º 4º 5º premio: Kindle Wireless Reading Device, Wi-Fi, pantalla de 6 pulgadas
  • Para todo el que pase a la segunda fase, 100 euros en metálico y si estás entre los 50 primeros, una tarjeta Civic Sampling con 10 euros

Toda la info la tienen colgada aquí: http://www.cajanavarra.es/es/juego-trivial/premios-trwivial.htm pero se tratará de responder a preguntas, al estilo del tradicional trivial, pero todo usando Twitter como único canal. Se creará un ranking con las puntuaciones durante las dos fases de las que consta el juego hasta el 22 de octubre que es cuando se conocerán los ganadores definitivos.

Seguiremos de cerca la iniciativa que tiene muy buena pinta porque #twitterengancha 😉

Equation y Matrix, mis últimos desarrollos en PHP

Para recuperar un poco el blog, que últimamente está muy mustio, voy a hablar de un par de desarrollos que he hecho y publicado en PHP. Los he llamado con el original nombre de Equation y Matrix.

Los tenía desde hace bastante tiempo, pero aprovechando que le estoy dando a TDD y a los testeos unitarios, los he adecentado y completado hasta ponerlos decentes para publicarlos y este es el resultado.

Equation

Es una sencilla clase que nos permite trabajar con una ecuación polinomial de grado n-ésimo mediante un objeto, facilitando el acceso a cada uno de los coeficientes así como una sencilla evaluación de la misma (basada en el método Horner).

Además, permite mostrar la ecuación renderizada al formato indicado de una forma muy sencilla. Actualmente en el paquete existe la opción de mostrarlo en formato HTML, cuyo resultado final sería algo del estilo: y = x3 + 7x2 + 10

El código completo, incluyendo ejemplos y test unitarios está publicado en github. También lo he publicado en phpclasses (sin test unitarios por lo engorroso que es subir cada fichero de forma individual).

Matrix

Este paquete consta de varias clases, la principal es Matrix que permite representar en un objeto una matriz matemática. Podemos además realizar distintas operaciones que a día de hoy son:

  • suma de dos matrices
  • resta de dos matrices
  • multiplicación de dos matrices
  • multiplicación de una matriz por un escalar
  • multiplicación de una fila por un valor
  • multiplicación de una columna por un valor
  • cambiar dos filas
  • cambiar dos columnas
  • inversa de una matriz
  • unir dos matrices compatibles
  • trasponer una matriz
  • eliminación de Gauss-Jordan (con el que poder obtener, por ejemplo, ajustes polinómicos de cualquier grado o inversas)

Las clases, con sus correspondientes test unitarios, están publicada en github.

Enlaces

Update 2010.08.01: PHPClasses acaba de avisarme que Equation está nominada al Innovation Award July 2010 🙂 A ver si hay suerte

Update 2010.09.01: Olé! Equation ha quedado 4ª en el Innovation Award July 2010 de PHPClasses

Cambiar el nombre y el email en el log de git

Seguro que no es la primera vez que, usando git, inicializas el repositorio, haces unos cuantos commit y para cuando te das cuenta, ya tienes varios Usuario <tatai@localhost> en el log de cambios. Evidentemente, usas git config para cambiar el user.name y el user.email pero el texto sigue ahí cuando pones git log.

Antes de ponerlo en un repositorio público como por ejemplo github, hay que cambiar esto y lo haremos de una forma muy sencilla usando git filter-branch. Este comando nos permite hacer multitud de diferentes cambios sobre todas las ramas en el proyecto y, entre otras cosas, cambiar estos dos datos que nos hacen falta.

Supongamos que los datos que queremos poner son:

  • Usuario: Tatai
  • E-mail: tatai@example.com

Entonces, el comando que tenemos que usar es:

git filter-branch --env-filter 'export GIT_AUTHOR_NAME="Tatai";GIT_AUTHOR_EMAIL="tatai@example.com"'

Tras ejecutar el comando, veremos como se reescriben todos los commits.

En caso de querer cambiar únicamente ciertos commits y no todos, podemos añadir al final del comando el intervalo, por ejemplo, para los 10 últimos commits: HEAD~10..HEAD

Múltiples cuentas en github.com

Al hilo del último post sobre cómo «tunear» un poco nuestro ssh, podemos usarlo por ejemplo si tenemos varias cuentas en github.com. Cuando ocurre esto, por cada cuenta que tienes en github, tienes que añadir una clave pública; esto no es ningún problema ya que podemos crear tantas claves como queramos, pero lo que no es tan fácil es cambiar la cuenta ssh con la que debe conectarse el cliente de git a github. No es muy común, pero te puede ocurrir como a mi, que tienes tu cuenta personal y la del trabajo.

Para poder conseguir esto, supongamos que tienes estos datos:

  • Cuenta personal
    • Usuario: usuario_casa
    • Fichero de clave: ~/.ssh/casa
  • Cuenta trabajo
    • Usuario: usuario_trabajo
    • Fichero de clave: ~/.ssh/trabajo

Lo que habría que hacer es tener un fichero de configuración ssh (recordemos que está en ~/.ssh/config) de la siguiente forma:

Host github
    HostName github.com
    User usuario_casa
    IdentityFile ~/.ssh/casa

Host github-trabajo
    HostName github.com
    User usuario_trabajo
    IdentityFile ~/.ssh/trabajo

La diferencia es sutil: cambia el valor que ponemos en Host (los espacios o tabulaciones son opcionales, yo los uso para dar un poco más de orden).

Con esto, tenemos que cambiar la dirección con la que nos conectaremos con la cuenta de trabajo. Si por ejemplo, para añadir el repositorio remoto usamos:

git remote add origin git@github.com:usuario_trabajo/proyecto.git

Ahora deberemos poner:

git remote add origin git@github-trabajo:usuario_trabajo/proyecto.git

Es decir, ssh se encargará automáticamente de hacer el cambio por nosotros y, de esta forma, no tendremos problemas decidiendo con qué usuario debe conectar o no, está todo en el fichero de configuración 😉

«Tunear» un poco nuestro ssh

Este es un sencillo truco que a mi me descubrió hace ya un tiempo mi buen amigo Iñigo, que os abrirá (si no lo ha hecho ya) una puerta hacía una mayor rapidez con el comando ssh. Empezaré directamente poniendo un ejemplo: supongamos que para acceder a un servidor con los siguientes parámetros (lo sé, están un poco exagerados, pero creo que se entenderá el ejemplo):

  • Dirección: punto.de.entrada.al.servidor.com
  • Usuario: miusuario
  • Puerto 12345
  • Fichero de clave: /home/user/.ssh/fichero.clave

El chorizo comando que nos hace falta es:

ssh punto.de.entrada.al.servidor.com -l miusuario -p 12345 -i /home/user/.ssh/fichero.clave

Casi nada

Bien, hay una forma de acortarlo un poco. El truco está en configurar todos estos parámetros en un fichero. Este fichero lo podemos encontrar en nuestra cuenta de usuario, concretamente en ~/.ssh/config. Este fichero por defecto viene vacío pero, siguiendo con el ejemplo escribimos estas líneas en su interior:


Host     miservidor
HostName punto.de.entrada.al.servidor.com
User     miusuario
Port     1234
IdentityFile /home/user/.ssh/fichero.clave

Con este simple gesto, ahora podemos cambiar el comando ssh anterior por:

ssh miservidor

Casi nada la diferencia 🙂

Si investigas un poco el man de ssh_config seguro que encuentras muchas cosas de utilidad. Más adelante daré otro truco relacionado con este.

P. P: y como bien te recomendaría un administrador de sistemas, si encima añades el hostname a tu /etc/hosts, irá «volado»! Se ahorrará la resolución DNS

Enlaces:

Creando un «export» con git

Si estás trabajando con git, seguro que alguna vez has querido hacer un «export» (usando terminología de subversion: un svn export), es decir, obtener todos los ficheros sin los datos de #git. La opción más fácil sería copiar todos los datos y borrar la carpeta .git, pero si quieres evitarte crear el script, aquí tienes una sencilla solución, usar checkout-index. El comando sería más o menos así:

git checkout-index -a -f --prefix=/path/export/

Importante: no olvides la última barra (slash).

Y ahora la breve explicación. checkout-index crea una copia de los fichero en el index a donde le indiques, pero sin sobreescribir, algo que evitaremos con la opción -f. Con la opción -a le indicamos que copie todos los ficheros en el index y con –prefix indicamos un prefijo que queremos que añada a todos los ficheros que extraiga (es decir, poniendo un path, es un truco para decirle que lo extraiga en otro lugar y con el mismo nombre, de aquí que tengamos que poner la última barra).

Es una forma sencilla y necesitas de tu copia local en el mismo servidor, algo que me gustaría evitar, pero de momento, tiraremos con esta opción.

« Entradas anteriores Entradas siguientes »