jun. 18
2013
Para eso Phing incluye algunas tareas que permiten separar los archivos de proyectos, para luego llamarlos con diversos métodos. Aquí comento tres métodos, que tienen diferencias de matiz, pero puedes utilizar sin grandes diferencias.
En algunos de estos casos se deseará compartir el contexto de ejecución, para así utilizar las propiedades inicializadas en el target padre. Para estos casos, se puede añadir el argumento inheritAll y asignarle el valor "true":
En este caso, el único parámetro es target. Y como en el caso de la tarea phing puede enviar propiedades a la tarea llamada:
Por ejemplo, si limpiar_codigo.xml tiene como nombre de proyecto "limpiar_codigo", incluye la tarea tabtospaces, y el proyecto principal también tiene ese mismo nombre de tarea, puedes llamar a la tarea hija con una phingcall cuyo atributo target sea limpiar_codigo.tabtospaces.
Otro detalle clave en las importaciones es que un target importado utilizará las variables de entorno de su nuevo contexto de ejecución. Por ejemplo, su ruta será la del proyecto padre, y las rutas relativas (por ejemplo para cargar archivos de propiedades) también tendrán ese comportamiento.
Read more »
jun. 12
2013
</pre>
Lo anterior genera el archivo /tmp/sopadebits. Si se utiliza el segundo formato, se establecen los permisos de acceso (chmod) de ese directorio. El valor es octal y utiliza la misma estructura que el comando de consola chmod.</p>Para absolutizar un path relativo:
Nos devuelve la ruta completa hasta el archivo test.txt.Si lo que queremos es cambiar los permisos o el propietario/grupo de un archivo o directorio, tenemos las tareas chmod y chown:
y:
Aunque pueda aparentar lo contrario, el atributo file permite tanto archivos como directorios.
En el primer caso establecemos los permisos de lectura y ejecución para todos los usuarios para el archivo test.txt, mientras que en el segundo lo hacemos sobre un directorio y solicitamos que la ejecución del comando muestre más detalles de la operación (verbose).Manipulación de archivos
Para el caso, se puede resumir con los comandos Copy, Delete, Move, LoadFile, FileHash y Touch... Uno por uno funcionan de la siguiente manera:
Copia el archivo al directorio /tmp/sopadebits/, y lo sobreescribe si existe.
Lo primero borra el archivo que habíamos copiado con la tarea. Lo segundo borraría el directorio /tmp/sopadebits al completo. Como en casos anteriores, hemos añadido la opción verbose para que nos facilite detalles de la operación. Sin embargo, en este caso solicitamos que, en caso de error, la ejecución de la tarea finalice. Esto puede ser útil para evitar estropicios o tareas inútiles que requieran de este borrado.
En este caso Phing mueve el archivo test.txt al directorio temporal, sobreescribiendo la copia antigua si ésta existe.
Calcula el hash SHA1 de test.txt. Si no indicara hashtype, o indicara el valor 0, se calcularía el MD5. El valor de este hash se puede guardar en una variable, si se especifica el atributo propertyName:
En este caso, podré utilizar la varialbe ${myhash} para indicar el resultado de esta operación. Pero lo cierto es que no es necesario indicar un nombre de variable. Por defecto, puedes utilizar la variable ${filehashvalue}, que es la variable donde se guarda este valor por defecto.
Y finalmente, operación touch, que permite modificar algunos atributos del archivo o directorio sin modificar le contenido:
Lo primero establece la fecha de modificación en base a los milisegundos transcurridos desde el Unix Epoch (1/1/1970 00:00:00). En el segundo caso establece la fecha de una forma más amigable.Filesize:
Mide el tamaño de un archivo. Podemos indicar una variable que guarde ese dato indicando el atributo propertyname, pero por defecto se guarda en la variable ${filesize}.Y hasta aquí las operaciones más habituales con ficheros que puedes hacer utilizando Phing. No son todas, ni mucho menos. Puedes continuar la lectura en la página de documentación de Phing.
Read more »
jun. 10
2013
Las operaciones de carga de contenidos y de gestión de servidores por SSH es imprescindible. La operativa implica el conocimiento de las claves de acceso, y cuando se llega a un determinado número de servidores distintos, cada uno con sus propias claves, la memoria empieza a fallar, se empiezan a apuntar las contraseñas en sitios no siempre seguros (al menos no tanto como nuestra memoria), y ni siquiera así las recordamos todas.
Así que, quizá, podríamos disponer de una sola clave para todas estas autenticaciones. O quizá ninguna clave, sólo un elemento que nos identifique en el servidor.
Lo cierto es que con la clave pública puedes utilizar unas pocas contraseñas (o una sola, eso depende de ti) para todas las claves públicas de acceso, y por ello ya no deberás que recordarlas. Pero entre eso y prescindir completamente de contraseñas, mejor usa unas pocas con criterio.
Bueno y ahora, basta de cháchara, vamos al grano.
~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mario/.ssh/id_dsa): mynewpubkey
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in mynewpubkey.
Your public key has been saved in mynewpubkey.pub.
The key fingerprint is: 60:d6:96:ba:40:11:72:78:f0:c4:xx:xx:xx:xx:xx:xx user@host
The key's randomart image is:
+--[ RSA 1024]----+
| o+=o . |
| .=o.+. . |
| .oo+++ |
| .+oE+ |
| .=. S |
| .... |
| .. |
| |
| |
+-----------------+
~$ cd /home/myuser/.ssh
# si ya existe, no es necesario crear el archivo
~$ touch authorized_keys
~$ cat mypubkey.pub >> authorized_keys
Después de cargar la clave, podemos conectarnos vía SSH. La contraseña que se nos pedirá es la de la clave SSH y no la del servidor, si es que hemos indicado contraseña de la clave.
Finalmente estamos dentro, y ya tenemos una contraseña menos que recordar ;-).
Read more »
jun. 8
2013
Desde luego es una pequeña curiosidad visual. A veces intentar relacionar lo aplastante de los teoremas con la simple realidad es una tarea compleja, y muy preciada en estadística.
Por eso se agradece encontrar ejemplos tan sencillos y evidentes como éste, demostrando que la caída de bolas acaba formando una campana de Gauss
jun. 7
2013
Los if's y else's no son muy diferentes en Phing que en el resto de lenguajes. Sí cambia el formato en el que se presentan, debido a la propia estructura del XML. Y en algunos casos es necesario atender a los detalles.
a = b
a = b
a != b
a = b
a = c
a != b
...
...
...
Al final, no resulta tan difícil, ¿verdad?
jun. 5
2013
Con el proceso anterior, ya teníamos las URIs, y nos faltaba añadir el host y el protocolo para tener una URL completa. Esto se puede conseguir echando mano del comando sed:
~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g'
Con lo anterior, nos sale una lista de URLs completas. Cambiando lo anterior, a punto para ser usadas con siege. Sólo falta guardarlas en un archivo de texto. Así que el proceso completo sería:
~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g' > urls.txt
~$ siege -c {concurrencia} -f ./urls.txt
~$ grep -vE "\.(js|css|gif|png|kml)"
~$ cat {archivo-de-log} | awk '{print $7}' | grep -vE "\.(js|css|gif|png)" | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g' > urls.txt
jun. 3
2013
Siege es una herramienta de pruebas de carga, que permite simular el comportamiento de una web bajo condiciones extremas (el asedio del servidor).
Un número de peticiones altas, fuerte nivel de concurrencia, etc., son circunstancias a las que se enfrentará una web con una audiencia elevada, o a puntas de consultas, como por ejemplo debido a campañas publicitarias, eventos específicos, salida a la venta de nuevos productos, y otros.
Así que nos encontramos en esa situación, y decidimos que la herramienta es siege. ¿qué más hay que hacer?
En ubuntu/debian, la instalación es sencilla, desde una terminal:
~$ sudo apt-get install siege
~$ siege http://{host}/
~$ siege -c 30 http://{host}/
Donde {host} es el nombre del dominio que se quiere probar. Obvia decir que esta prueba debe realizarse en un entorno controlado y bajo nuestra propia responsabilidad, y que en ningún caso se debe ejecutar sobre servidores y webs ajenas. Las consecuencias de ese uso impropio quedan bajo la responsabilidad del usuario.
Y ¿de dónde sacamos esas URLs? Una de las opciones es un archivo de logs de Apache. Si dispones de un log de apache con datos de navegación real, o se puede generar uno visitando la web. Por ejemplo, se puede programar un crawler sencillo, tal como Httrack o similar. Lo que interesa no es la descarga de contenidos, sino que se navegue por la web para generar logs de Apache.
189.147.178.214 - - [19/May/2013:06:41:18 +0200] "GET /wp-content/themes/retina/style.css HTTP/1.1" 200 5213 "http://www.sopadebits.com/patrones-organizativos-gestion-informacion" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"
¿Cómo extraeremos esa URL? Con awk. Esto permite extraer los contenidos separándolos por espacios (entre infinidad de otras posibilidades, vale la pena echarle un ojo). En nuestro caso, la instrucción en consola puede ser:
~$ cat {archivo-de-log} | awk '{print $7}'
~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq
~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g'
may. 31
2013
En el último artículo de Phing nos habíamos quedado en la introducción de datos, y con la posibilidad de definir las opciones que tiene el usuario. Vamos a ver dos funcionalidades más de Phing.
Valor de variable1
El contexto de las variables es el mismo que el de su creación: es decir, una variable creada en un target sólo estará disponible en su propio target. Si se crea en el contexto
...Variable1 has value ${var1}
...
Así que ahora ya puedes generar y utilizar variables en los builds.
El contenido de un archivo de propiedades al que, por ejemplo, puede tener un archivo INI. Es decir, un conjunto de claves y valores, pero sin apartados [separados por títulos con claves].
# Los archivos de propiedades contienen pares clave/valor
# Los valores de propiedades pueden contener:
# 1. caracteres alfanuméricos
# 2. y puntos
# Pero no pueden contener caracteres especiales
# Aprovecha para crear "namespaces" de variables
myapp.cache.enable=1
myapp.cache.ttl=500
myapp.session.save=1
......
Propiedad | Contenido |
---|---|
application.startdir | Directorio actual de ejecución |
env.* | Variables de entorno extraídas de $_SERVER. |
host.arch | Arquitectura del sistema, ej. i586. No disponible en equipos Windows |
host.domain | Nombre del dominio, ej. php.net. No disponible en equipos Windows |
host.fstype | Tipo de sistema de archivos. Los valores posibles son UNIX, WINNT y WIN32 |
host.name | Nombre de host del sistema operativo, según lo retorna la función posix_uname(). No disponible en equipos Windows. |
host.os | Descripción del sistema operativo, proporcionada por la variable PHP_OS |
host.os.release | Número de entrega del sistema operativo. No disponible en equipos Windows. |
host.os.version | Versión del sistema operativo i.e. #4 Tue Jul 20 17:01:36 MEST 1999. No disponible en equipos Windows |
line.separator | Caracter(es) que marcan el final de línea, "\n" para Linux, "\r\n" para Windows, "\r" para Macintosh. |
os.name | Descripción del sistema operativo, proporcionada por la variable PHP_OS |
phing.file | Ruta completa hasta el archivo build. |
phing.dir | Ruta que contiene el buildfile actual. |
phing.home | Directorio de instalación de Phing, no indicado en las instalaciones desde PEAR. |
phing.version | Versión actual de Phing. |
phing.project.name | Nombre del proyecto que se procesa en este momento. |
php.classpath | Valor de la variable de entorno PHP_CLASSPATH. |
php.version | Versión del intérprete PHP. El mismo que la constante PHP_VERSION. |
project.basedir | El directorio base actual. |
user.home | Valor de la variable de entorno HOME. |
Por ejemplo, uno muy sencillito: obtener el nombre del usuario que está ejecutando el script:
El comando whoami nos devuelve el nombre de usuario que está autenticado en la consola. Puedes ejecutarlo directamente en una consola y verificar que retorna los mismos valores.
Con esta opción tan sencilla, tendremos una variable llamada username que tendrá el nombre del usuario. Y podremos ejecutar algo así como:
El usuario ${username} está ejecutando el script
El comando
may. 29
2013
En un artículo anterior, Phing quedó instalado y listo para probar. Así que ahora toca ponerlo en marcha, manos a la obra. Crearemos un directorio llamado "phingtest", donde crearemos un archivo llamado build.xml. Introduciremos el siguiente contenido en el XML:
Esto es un primer comentario
¿Te ha gustado?
Tu respuesta es '${like}'
~$ phing
Cuyo resultado es:
[echo] Esto es un primer comentario
[input] ¿Te ha gustado? Sí
[echo] Tu respuesta es 'Sí'
El tag project contiene dos atributos:
Pero el caso es que, y esto es lo importante, las tareas son clases PHP, y lo que hace Phing es ahorrarnos la programación a medida para situaciones que no requieren de tal complejidad.
Eso siempre con el permiso de la sintaxis XML. Pero es relativamente fácil acostumbrarse, para el esfuerzo que te ahorras ;-).
En el ejemplo inicial todo es muy simple: dos echos y la entrada de texto. Pero vamos a mejorarlo un poco. Vamos a establecer un valor por defecto al input. Abrimos el archivo y lo editamos para que quede así:
Esto es un primer comentario</echo>
¿Te ha gustado?
Tu respuesta es '${like}'
Así que ya tenemos un valor por defecto. Si lo ejecutas, verás que aparece entre corchetes el texto que hemos indicado. Pero en realidad queremos que el usuario sólo pueda escoger entre dos opciones: Sí o No. ¿Podemos? Sí, y resulta bastante fácil. Sólo hay que añadir lo siguiente:
Esto es un primer comentario</echo>
¿Te ha gustado?
Tu respuesta es '${like}'
Si el usuario ahora intenta introducir un valor distinto a los dos indicados, no podrá seguir. Si deja el valor vacío, se asumirá el valor por defecto (Sí).
Es probable que con estas dos opciones ya empieces a ver cómo se simplifican ciertas tareas. En este caso es la validación de la introducción de datos. Pero hay más, en ejemplos posteriores lo iremos viendo.
may. 27
2013
Phing es una herramienta desarrollada en PHP que permite la automatización de tareas. Si has oído hablar de Apache Ant, Phing es la herramienta análoga para el PHP. Phing permite, mediante la generación de archivos XML (que a pesar del formato, son programas simples), facilitar la automatización de tareas.
~$ sudo apt-get install php-pear
~$ sudo pear channel-discover pear.phing.info
Y después ya puedes instalarlo:
~$ sudo pear install --alldeps phing/phing
~$ sudo pear config-set preferred_state alpha
~$ sudo pear install --alldeps phing/phing
~$ sudo pear config-set preferred_state stable
Con este proceso, ya puedes empezar a utilizar Phing. Comentaré algunos ejemplos en artículos posteriores. Puedes echar un vistazo a esta presentación en Slideshare, que introduce los conceptos básicos de los componentes de Phing:
[slideshare id=11755071&doc=phingphpuk2012-120226083028-phpapp02]
Read more »© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.