La descripción encontrada en wikipedia de “profiling”:

Un “profiler” es una herramienta de análisis de performance que mide el comportamiento del programa mientras este está corriendo, particularmente la frecuencia y duración de las llamadas a funciones. La salida es un rastro (stream) de eventos o un sumario estático de los eventos observados (un “profile”, perfil o reseña). Los profilers usan una amplia variedad de técnicas para recolectar datos, incluyendo interrupciones por hardware, instrumentos de código, ganchos (hooks) del sistema operativo.

El uso de profilers es usado en el proceso de ingeniería de performance. Un profile generalmente es realizado relacionado la posición del código fuente donde suceden los eventos y el tamaño de las medidas de los datos que es proporcional al tamaño del código del programa. En contraste, el tamaño de un rastro es proporcional al tiempo de ejecución de un programa, haciéndolo impracticable. Para programas secuenciales, un profile, es generalmente suficiente, pero los problemas de pefrormance en programas paralelos (que esperan mensajes o temas de sincronismo) generalmente depende del tiempo de relación de los eventos, de esta forma requieren la localización total para tener un entendimiento del problema

Para ello tenemos que instalar php5-xdebug:

sudo aptitude install php5-xdebug

Una vez instalado el módulo Xdebug tenemos que editar su fichero de configuración que encontraremos en:

/etc/php5/apache2/conf.d/xdebug.ini

En ese fichero agregaremos las siguientes lineas:

xdebug.profiler_enabled = 1
xdebug.profiler_output_dir = (path de salida) “/home/usuario/tmp/”
xdebug.profiler_output_name = cachegrind.out. %R

Tras reiniciar el apache comprobaremos en un fichero php el resultado de phpinfo() para comprobar que el modulo xdebug está operativo.

Más parámetros de configuración: xdebug profiler

Al poner %R en el nombre de salida conseguimos que si estamos analizando el domonio localhost guarde los ficheros como: cachegrind.out.localhost

Para conocer más opciones de parametrización de xdebug.profiler_output_name en: http://www.xdebug.org/docs/all_settings#trace_output_name

De esta manera conseguimos que se vayan creando los ficheros que después leeremos con KCachegrind.

Instalamos Kcachegrind:

sudo aptitude kcachegrind kcachegrind-converters

Ahora solo tendremos que lanzar el programa Kcachegrind y abrir el fichero cachegrind.out.localhost. En el mismo directorio encontraremos más ficheros pero tenemos que abrir el fichero principal que es el que no tiene concatenado a su nombre con un punto una secuencia numérica.

kcachegrindkde

El programa analizará los logs de xdebug y nos lo mostrará con una interfaz gráfica intuitiva y no muy complicada de entender:

De esta manera podremos analizar si nuestra aplicación web pierde mucho tiempo en algún proceso en el que no hayamos reparado con anterioridad, el uso de memoria y las llamadas que se realizan a funciones y/o métodos.

Esta configuración está pensada para probarla en la máquina local de desarrollo, en ese caso en el path de salida que hemos configurado en el xdebug.ini tenemos que asignarle los permisos necesarios para que el usuario de apache www-data pueda escribir los logs.

Una vez finalizado su uso, es recomendable desactivar el profile de xdebug para que no nos sature de logs a los que no vamos a hacer caso.

Aunque el pantallazo es de un entorno KDE esta configuración y software se ha realizado en: Ubuntu 9.04 Gnome.

Si tu entorno de desarrollo es Windows, también puedes activar el módulo php_xdebug.dll en tu php.ini y seguir los mismos parámetros de configuración en tu fichero php.ini. Como herramienta para examinar los logs del profile xdebug puedes utilizar WinCacheGrind.

Espero que os sea de utilidad, si conocéis alguna herramienta y/o utilidad que os facilite la tarea de realizar aplicaciones ligeras agradecería el comentario.

Leer entradas relacionadas:

Ciertamente a uno le cuesta un poco cambiar a lo desconocido, el miedo al cambio siempre está presente en todos a la hora de escoger software para utilizarlo. Desde que hace ya unos años me convertí en usuario 100% de Ubuntu arrastré el vicio de vmware para virtualizar. Cuando tuve una temporada que utilizaba un iBook y en la plataforma powerpcvirtualbox-logo me fue imposible utilizar vmware y estuve utilizando qemu pero no me acabó de convencer demasiado, tal vez la versión más actual de qemu tenga un interfaz de usuario más cómoda.

Ahora no solo por utilizar software libre, si no que el rendimiento de virtualbox comparándolo con vmware workstation en ubuntu 9.04 con la misma máquina virtualizada, tiene un rendimiento más efectivo. No me preguntéis el porqué… no me he puesto a indagar, pero la máquina virtualizada con virtualbox es más rápida. Es decir, no solo el arranque y el uso de la máquina virtual, si no que me consume menos recursos del sistema.

En su día, cuando probé VirtualBox no lo hice muy afondo y ahora parece más sencillo de utilizar. Tal vez porque le he dedicado tiempo o han cambiado a una versión pensada más en el usuario final.

Por ahora, no tienes la comodidad de arrastrar una carpeta o archivo dentro de la máquina virtual como podía hacer con vmware workstation, pero si tiene la opción de carpetas compartidas. Estas carpeta no es más que un path que tienes en tu equipo linux en donde puedes intercambiar información entre tu equipo y la máquina virtualizada. Si la máquina virtualizada es un Windows, es tan sencillo mapear la unidad de red, explorarando tu entorno de red y “conectar a unidad de red” :-)

Ciertamente, ya no uso Windows pero en casa no sólo yo utilizo el ordenador sobremesa y todavía hay dependencia de algunas aplicaciones de Windows :-) tendré que ir evangelizando poco a poco a que se utilice más software libre y no se dependa de windows. Será un trabajo duro :-)

Leer entradas relacionadas:

Tarde o temprano en el desarrollo de aplicaciones web nos enfrentamos a algún desarrollo que requiere internacionalizar la aplicación. El primer punto que creo que todos nos tenemos que preguntar a la hora de abordar una aplicación web es si el contenido tiene que ser multi-idioma o la aplicación será multi-idioma.

Si leemos rápido esa última frase puede parecer lo mismo… Si queremos hacer una aplicación multi-idioma simplemente significa que la interface de usuario tiene que estar disponible en más de un idioma, pero no por ello el contenido que se genere tiene que ser multi-idioma. Evidentemente si la aplicación tiene contenido multi-idioma estará acompañado de interface multi-idioma.

Esto hay que tener en cuenta a la hora de diseñar el modelo de datos para que se adapte a nuestras necesidades.

Este artículo está enfocado principalmente a crear una interface multi-idioma y sistemas de traducción por lo que no entraré en como realizar un modelo de datos para soportar contenido multi-idioma.

Podemos reinventar la rueda, que en algunos casos puede ser nuestra rueda preferida en la que nos sintamos cómodos o aplicar estándares para internacionalizar una aplicación web. Si desconocemos la existencia de estos estándares es muy probable que recurramos a la creación de un array asociativo por idioma, ya que realizar una función que nos encuentre la traducción no supondría una grán complicación. Lo malo, es que no siempre pensamos en la explotación de la aplicación y en que la persona que tenga que mantener las traducciones no tiene porqué tener conocimientos técnicos.

Si utilizamos aplicaciones open source es muy probable que nos encontremos el uso de GETTEXT. Este sistema de traducción utiliza ficheros .po y .mo. Los ficheros .po son los ficheros que contienen las traducciones en formato texto:

msgid “Texto original”
msgstr “Texto traducido”

eclipse_gettext

Lo que me gustó es que para poder editar un fichero .po no lo tienes porque realizar con un editor de texto convencional, si no que existen editores multi-plataforma para este formato de ficheros, lo que el mantenimiento de traducciones se hace más práctico. El que me pareció de mayor utilidad a la hora de desarrollar fue gted, un plugin (más) que se integra en eclipse.

En mi opinión es más cómodo trabajar con “pestañas” que con ventanas, y estoy seguro que más de uno compartiréis conmigo esta misma opinión.

Teniendo en cuenta el inconveniente del mantenimiento conocí el formato estándar para traducción de documentos, XLIFF. Es un formato basado en XML que fue normalizado por la organización OASIS en el 2002.

Este formato para la internacionalización de documentos no es para utilizarlo exclusivamente en aplicaciones web, al igual que tampoco lo es el GETTEXT. En la especificación de la versión 1.2 podemos encontrarnos como tiene que ser la extructura de un fichero XLIFF.

<xliff version=’1.2′ xmlns=’urn:oasis:names:tc:xliff:document:1.2′>
<file original=’hello.txt’ source-language=’en’ target-language=’es’
datatype=’plaintext’>
<body>
<trans-unit id=’0′>
<source>Hello world</source>
<target>Hola Mundo</target>
</trans-unit>
</body>
</file>
</xliff>

Donde a parte de este sencillo ejemplo se pueden complementar con mucha más información según la especificación.

La ventaja que encontré al utilizar este sistema de internacionalización es que las empresas que ofrecen servicios de traducción soportan este formato, y al igual que en GETTEXT, XLIFF también tiene editores estándar y en muchos casos multi-plataforma para el mantenimiento de las traducciones.

A diferencia de GETTEXT, XLIFF trabaja sobre el mismo fichero, sin tener que crear una versión compilada. Esto es una ventaja para comprobar si falta alguna traducción y para poder agregar nuevas traducciones en la fase de desarrollo.

En la busca de editores para XLIFF me encontré que muchos de los que decian cumplir con el estándar realmente no lo hacían, como Open Languaje Tools, y otros estaban desactualizados en especificaciones “antiguas”. Open Source y multi-plataforma no encontré ningún editor actualizado, pero sí un editor de pago. Hearstome Translation Studio, un editor profesional para la internacionalización de documentos. Aunque podemos encontrarnos en la Red proyectos web interesantes como este editor en flash lo que nos permitiría dar acceso a las personas que tengan que realizar las traduciones en nuestras aplicaciones.

Escojamos el sistema que escojamos para internacionalizar nuestras aplicaciones, si estamos hablando de entornos Web, es interesante el utilizar un parser de nuestras plantillas/templates para el mantenimiento de la traducción de nuestra interface, de esta manera simplemente generaríamos el archivo origen donde cualquier persona pudiera traducir.

Tiendo en cuenta que has leído “todo el tocho”  :-) ¿Como internacionalizas tus aplicaciones/páginas web?

Leer entradas relacionadas:

Claro, como si ya no os hubierais dado cuenta de que me acabo de comprar el HTC Magic, ¿os lo he dicho? :-) La he podido comprar esta mañana y en un máximo de 10 días podré disfrutar de tan esperado juguete. Por el momento estamos preparando la bienvenida y antes de indagar como hacer sincronización del equipo con Ubuntu, lo primero que he hecho en cuanto he cogido el ordenador en casa ha sido descargarme el SDK y el ADT para Eclipse Ganimede.

La instalación ha sido sencilla:

  1. Descargar SDK
  2. Descomprimir archivo zip.
  3. Mover carpeta del sdk a la home
  4. Incluir el export del path de la carpeta tool que está en la carpeta del SDK
  5. Descargar el ADT
  6. Instalar software desde un archivo en eclipse
  7. Mi primera aplicación “Hola Mundo!”

Así en 7 pasos hasta parece rapidito :-) la verdad es que tampoco se pierde mucho tiempo en hacerlo. Utilicé este manual que ofrece muchas pistas a base de pantallazos que te va explicando paso a paso lo que tienes que ir haciendo y los pasos para la instalación funcionan a la perfección.

En el último paso del manual te explica tambien como hacer tu “Hola Mundo!” en Android. Para poder ejecutar el programa tenemos que crear un AVD “Android Virtual Device” que si tenemos bien el path podemos escribir en la consola tranquilamente:

android create avd -n magic -t 2

Y listo, ya tenemos la primera toma de contacto con el entorno de desarrollo!!

Después de todo esto tendré que averiguar como realizar sincronización de contactos con Evolutión y tenemos partida nueva.

Leer entradas relacionadas:

date –set “YYYY-MM-DD HH:mm”

Leer entradas relacionadas:

Un usuario me ha informado de un problema de acceso a uno de los repositorios de subversion. No había visto el problema ya que utilizo como cliente subeclipse, un plugin de eclipse. Con este cliente de subversion no hay ningún problema de acceso y se puede descargar y commitar si tienes acceso.

Lo malo es que si intentamos hacer un checkout del repositorio:

svn co http://svn.pensandoenred.com/webexp .

Nos alerta con el siguiente error:

svn: El repositorio se movió permanente a ‘%’s; use ‘relocate’ por favor

Por lo que he podido indagar en internet se utiliza el relocate cuando el proyecto cambia de repositorio pero no es el caso.

En cuanto me sea posible solucionaré el problema, perdonar las molestias.

Leer entradas relacionadas:

El amigo ZiTaL ha escrito un how to detallado de como poder utilizar conexiones oracle en debian en los desarrollos en PHP el cual “fusilo”

Muy importante: Antes de empezar a instalar tendremos que tener como mínimo 1024 MB de SWAP (área de intercambio) libre, por lo que aconsejo que tengas como mínimo 1,5 GB de SWAP (área de intercambio).

PRE-INSTALACIÓN: Necesitamos el paquete libaio1.

apt-get install libaio1

Para empezar tenemos que conseguir los siguientes RPM’s de la página de Oracle:

Oracle instantclient basic
Oracle instantclient devel
Oracle instantclient sqlplus

Que los podemos descargar de aquí:

http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html

Si quereis los he pasado a deb con alien y los podeis descargar aquí:

http://zital.no-ip.org/debian/oracle/

Y descargamos los ficheros.

Si no os fiais de mi, pues simplemete habrá que pasarlos de rpm a deb con alien:

apt-get install alien
alien oracle-instantclient-basic_11.1.0.1-2_i386.rpm
alien oracle-instantclient-devel_11.1.0.1-2_i386.rpm
alien oracle-instantclient-sqlplus_11.1.0.1-2_i386.rpm

y ya tendremos los deb correspondientes.

los instalamos:

dpkg -i oracle-instantclient-basic_11.1.0.1-2_i386.deb
dpkg -i oracle-instantclient-devel_11.1.0.1-2_i386.deb
dpkg -i oracle-instantclient-sqlplus_11.1.0.1-2_i386.deb

Ahora creamos la carpeta /etc/oracle:

mkdir /etc/oracle

Y crearemos dentro de esta carpeta el archivo tnsnames.ora

nano /etc/oracle/tnsnames.ora

Y tendremos que crear un fichero del estilo:

NOMBRE_MAQUINA.DOMINIO.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)
...

Cambiar NOMBRE_MAQUINA, DOMINIO.COM, HOST y PORT por sus respectivos valores.

Según cuantos servidores Oracle tengamos ;)

Si no sabeis rellenar este fichero, CREO que lo podremos encontrar en el servidor donde este alojado el servidor de base de datos de Oracle.

Ahora tendremos que editar el .bashrc del root y le añadiremos las siguientes lineas:

nano /root/.bashrc
export TNS_ADMIN=/etc/oracle
export SQLPATH=/usr/lib/oracle/11.1.0.1/client/bin
export LD_LIBRARY_PATH=/usr/lib/oracle/11.1.0.1/client/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$SQLPATH


Para que los cambios del .bashrc surjan efecto tendremos que volvernos a logear.

Ya hemos terminado de instalar el cliente de Oracle.

Instalacion de Apache2.2 con PHP5:

Si ya lo tienes instalado omite este paso ;)

apt-get install apache2.2-common libapache2-mod-php5 php5

Instalacion del oci8 para php:

apt-get install php-pear php5-dev
pecl install oci8

Al instalar el oci8 nos aparecera un prompt del tipo:

1-1, 'all', 'abort', or Enter to continue:

Pulsamos 1 y ENTER

y escribimos lo siquiente en el prompt:

shared,instantclient,/usr/lib/oracle/11.1.0.1/client/lib/

y pulsamos ENTER para confirmarlo y otra vez ENTER para que empiece la instalación

el sistema empezará a compilar el módulo y si todo ha ido bien nos pondrá algo como:

Build process completed successfully
Installing '/usr/lib/php5/20060613+lfs/oci8.so'
install ok: channel://pecl.php.net/oci8-1.2.5
configuration option "php_ini" is not set to php.ini location
You should add "extension=oci8.so" to php.ini

solamente nos quedará añadir las correspondientes lineas en el php.ini:

echo extension=oci8.so >> /etc/php5/apache2/php.ini

y reiniciar el apache:

/etc/init.d/apache2 reload

Espero que os sirva de ayuda ;)

Fuente original: esdebian.org

Leer entradas relacionadas:


© 2007 Pensando en Red | iKon Wordpress Theme | Powered by Wordpress