Monthly Archives: June 2008 - Page 2

Canción del día – Embraceable You – Nat King Cole

Letra:

Embrace me
My sweet embraceable you
Embrace me
My irreplaceable you
Just to look at you
My heart grows tipsy in me
You and you alone

Bring out the gypsy in me

I love all
The many charms about you
Above all
I want my arms about you
Dont be naughty baby
Come to me
Come to papa do
My sweet embraceable you

I love all
The many charms about you
Above all
I want my arms about you
Dont be naughty baby
Come to me
Come to papa do
My sweet embraceable you

Traducción:

Abrazame,
Mi dulce abrazable
Abrazame,
Mi irremplazable tu
Solo de mirarte,
Mi corazón se alegra
Tu y solo tú

Haz que me alegre

Amo todos
Esos encantos tuyos
Pero sobre todo
Quiero rodearte con mis brazos
No seas penosa
Ven a mi
Ven a mi
Mi dulce abrazable tu

La escuché por primera vez en el capítulo de los Simpsons donde Skinner se enamora de Krabappel y se encierran en la escuela; el jefe Gorgory los ataca con música.

Después lo escuché con Sinatra, Billie Holiday, pero me gustó esta interpretación de Nat King Cole Trio en uno de esos discos del “botadero” que venden en los supermercados.

Canción del Día: I Can’t Make You Love Me – Bonnie Raitt

Letra:
Turn down the lights, turn down the bed
Turn down these voices inside my head
Lay down with me, tell me no lies
Just hold me close, dont patronize – dont patronize me

Chorus: cause I cant make you love me if you dont
You cant make your heart feel something it wont
Here in the dark, in these lonely hours
I will lay down my heart and Ill feel the power
But you wont, no you wont
cause I cant make you love me, if you dont

Ill close my eyes, then I wont see
The love you dont feel when youre holding me
Morning will come and Ill do whats right
Just give me till then to give up this fight
And I will give up this fight
Chorus: cause I cant make you love me if you dont
You cant make your heart feel something it wont
Here in the dark, in these lonely hours
I will lay down my heart and Ill feel the power
But you wont, no you wont
cause I cant make you love me, if you dont

Traducción:

Apaga las luces, ven a la cama
Apaga esas voces en mi cabeza
Duerme a mi lado, no digas mentiras
Solo abrázame, no seas indulgente

Coro: Porque no puedo amarme si tu no lo haces,
No puedes hacer que tu corazón sienta algo que no existe
Aqui en la oscuridad, en estas oscuras horas
Apaciguaré mi corazón y sentiré el poder
Pero tu no; no, tu no
debido a que no puedo hacer que me ames, si no lo sientes

Cerrare mis ojos, entonces no lo veré
El amor que no sientes cuando me abrazas
La mañana llegará y haré lo correcto
Sólo dame ese tiempo para terminar esta batalla
Y terminaré la batalla

Descubierta por las 500 mejores canciones de la historia según la revista Rolling Stones.

Ejabberd y mod_archive

Hace algo de tiempo conocí ejabberd, es un servidor de Jabber de alto desempeño; inicialmente debo admitir que no me gustó mucho principalmente porque está escrito en Erlang y que tenía poca documentación, además de que cometer un error de configuración mostraba muchisimos datos sin sentido para programadores de Erlang y nada en lenguaje ‘humano’.
Ahora el proyecto ha madurado considerablemente y una de las ventajas por la que sigo utilizando Ejabberd es que es el único servidor Jabber open source en manejar clustering.

Recientemente me pidieron instalar un módulo para almacenar la historia de las conversaciones, algo que hace por ejemplo Google Talk (que está implementado en Jabber), este es el protocolo: XEP-0136 y utilizar la opción de guardar conversaciones automáticamente (sin intervención del usuario para solicitar que se almacene).
Hay diversos modulos para implementar esto en ejabberd, pero buscando me encontré que mod_archive es el mejor y el que se encuentra con desarrollo activo.
El problema es que prácticamente no existe documentación ni información de si por ejemplo funcionaría en Ejabberd 2 que es la versión del servidor que utilizo.

A prueba y error y con algunos pequeños documentos que me encontré descubrí que si funciona en la versión 2.0, a continuación vienen los pasos para hacerlo funcionar con MySQL:

  • Compilar ejabberd para que acepte odbc
    ./configure --enable-odbc
  • Descargar los módulos de ejabberd
    svn co http://svn.process-one.net/ejabberd-modules
  • Compilar el módulo interno de MySQL de los módulos descargados de ejabberd
    cd mysql/trunk
    ./build.sh
    cp ebin/*.beam /directorio_ejabberd/var/lib/ejabberd/ebin/
  • Compilar el módulo de archivo (mod_archive)
    cd mod_archive/trunk
    ./build.sh
    cp ebin/*.beam /directorio_ejabberd/var/lib/ejabberd/ebin/
  • Editar el archivo de configuración de Ejabberd para habilitar odbc
    {odbc_server, {mysql, "direccion_servidor", "base_de_datos", "usuario", "contraseña"}}.
  • Editar el archivo para agregar mod_archive (parte de {modules,…)
    {mod_archive_odbc,  [{database_type, "mysql"},
    {default_auto_save, true},
    {enforce_default_auto_save, false},
    {default_expire, infinity},
    {enforce_min_expire, 0},
    {enforce_max_expire, infinity},
    {replication_expire, 31536000},
    {session_duration, 1800},
    {wipeout_interval, 86400}
    ]},
  • Crear la base de datos utilizando el archivo: ejabberd-modules/mod_archive/trunk/src/mod_archive_odbc_mysql.sql

Hay que hacer notar que el archivo sql es para MySQL 5 y posteriores (para utilizarlo con una versión anterior hay que eliminar la parte de triggers), además el archivo crea una base de datos llamada ejabberd, si se necesita otro nombre editarlo para ya sea eliminar la parte de crear o cambiar el nombre de la base de datos que será creada; utiliza el prefijo archive_ para sus tablas.

Iniciar (o reiniciar) el servicio de ejabberd y a partir de ahora todas las conversaciones serán guardadas en mysql.

Manejo de Sonido en Flex

En Flex podemos manejar el audio de dos formas; obteniendo información acerca del espectro de sonido o cambiando la configuración. En este tutorial veremos estas dos formas.

Alterando el sonido

Flex (de hecho Flash) tiene métodos muy básicos para alterar el sonido, solamente podemos alterar el volumen y el Pan (desplazamiento entre bocinas derecha e izquierda). No existen métodos para por ejemplo aplicarle un filtro y cambiar la equalización del sonido en tiempo real. Para cambiar las propiedades del sonido debemos hacerlo mediante los componentes que tengan como propiedad soundTransform que es un objeto de tipo SoundTransform, aunque podemos utilizar las propiedades de este objeto para cambiar el volumen o panning no se observará ningún cambio puesto que hay que asignar un nuevo SoundTranform de la siguiente manera:

var st:SoundTransform = new SoundTransform(volumen, pan);
mi_componente.soundTransform = st;

De esta manera se observará el cambio; el parámetro volumen es un número entre 0 (silencio total) y 1 (volumen total), mientras que pan es un número entre -1 (volumen solamente en bocinas izquierdas) y 1 (volumen solamente en bocinas derechas) siendo 0 el equilibro entre las dos bocinas (y por defecto). Los componentes que utilizamos para sonido son:

  • VideoDisplay (para reproducir Video de Flash)
  • SoundChannel (cuando se reproduce Audio)
  • NetStream (cuando se reproduce directamente audio/video sin utilizar lo anterior)

En el ejemplo la primera parte tiene que ver con sliders que cambian automáticamente el SoundTransform del clip de sonido (SoundChannel) tanto en Volumen como en Pan.

Obtener información de Sonido

Flex nos permite obtener información del Audio que se está reproduciendo actualmente; el problema es que como no está asociado a un componente si tenemos en otra pestaña del navegador el mismo documento de Flash (u otro al que tengamos permiso) aunque no estemos reproduciendo nada en nuestro primer documento si mostrará información del otro documento ya que toma la información del entorno; también si reducimos el volumen mostrará un escalamiento en los valores proporcional al volumen, igual sucede con el pan donde veremos como desaparecen valores de las regiones. Para obtener la información del sonido es muy sencillo, utilizamos la función estática: SoundMixer.computeSpectrum Esta función acepta tres parámetros, el primero que es el único requerido es un ByteArray donde almacenará los valores; estos serán 512 valores flotantes donde los primeros 256 valores corresponden a la bocina izquierda y los restantes a la bocina derecha. El segundo parámetro es si utilizar una transformada de Fourier a los valores; el valor por defecto es falso, en esta forma tendremos la onda correspondiente al sonido y los valores irán de -1 a 1. Si asignamos el valor verdadero entonces obtendremos valores correspondientes al espectro de frecuencias, donde los valores bajos están a la derecha y los altos a la izquierda (bajos y agudos respectivamente); en este caso los valores irán de 0.0 a 2.0. El tercer parámetro nos permite cambiar el sonido a un diferente sampleo, por defecto es de 44.1Khz, si se asigna 1 entonces se reduce a la mitad (22.05Khz) y así sucesivamente. Debido a restricciones de seguridad no siempre podremos acceder a información del sonido, aunque la clase estática SoundMixer tiene un método llamado: areSoundsInaccessible que nos permite saber si podemos acceder a información del sonido no siempre funciona de manera adecuada; por lo que es mejor al momento de llamar a computeSpectrum incluirlo en un catch con SecurityError para aquellos casos donde no podamos acceder a la información. En el ejemplo tenemos dos tipos de visualización, la Normal y la de Fourier; el sistema básicamente grafica en cada componente la información del sonido actual en dos componentes: VisualizacionNormal y VisualizacionFourier.

Ejemplo

Descargar Código:
FangitSoundHandling.zip

CentOS y PHP DOM

Hace mucho tiempo que no utilizaba una versión de Redhat; ya que sólo utilizaba Redhat cuando comence a aprender Linux, luego conocí Debian y no he necesitado otra distribución.

Pero ahora en el trabajo me han pedido configurar algunos servicios en un servidor CentOS y la verdad es que prácticamente a mi gusto Yum está muy atrasado respecto a apt-get pero lo peor que me encontré en CentOS es que la parte de DOM (lo que antes era DomXML) de PHP5 no está compilado!!, y eso que a diferencia de PHP4 la parte de DOM no necesita librerías externas por lo que no se sinceramente porqué esta parte fue omitida.

Para sanar hay dos opciones: instalar una versión recompilada de PHP incluyendo DOM, o compilar el módulo por separado de DOM e instalarlo a la versión actual; yo preferí utilizar esta última.

Para compilar solo el módulo, necesitas descargar la misma versión de PHP que tengas instalada, puedes buscar en internet por: php-VERSION.tar.bz2; por ejemplo: php-5.1.6.tar.bz2

Esta liga tiene varias versiones de PHP: http://museum.php.net/php5/

Después de descargar, simplemente debes hacer:
./configure --enable-dom=shared --enable-xmlreader=shared

Hacer el clásico make y esperar a que compile, una vez terminado verás en la carpeta modules/ dos archivos: dom.so y xmlreader.so, estos se deben copiar al directorio de modulos de php; en CentOS: /usr/lib/php/modules/

Después editar tu /etc/php.ini e incluir lo siguiente:

extension=xmlreader.so
extension=dom.so

Reiniciar apache:
/etc/init.d/httpd restart

Ahora deberás tener PHP5 con DOM funcionando.