lunes, 31 de marzo de 2008

Problema de audio con Wolfenstein ET en linux

Bueno para los que instalaron Wolfesntein Enemy Territory en linux (en mi caso la distribución Ubuntu) y el audio del juego no se escucha, pueden probar la solución que les dejo. Es la siguiente:
  • Como usuario root ejecutas la siguiente línea de comando:
    #: echo "et.x86 0 0 direct" >> /proc/asound/card0/pcm0p/oss
  • Si queremos guardar esos cambios, debemos ejecutar lo siguiente:
    #: nano /etc/rc.local y agregamos la línea echo "et.x86 0 0 direct" >> /proc/asound/card0/pcm0p/oss
Fuente: http://blogdrake.net/node/3047

Saludos ...

viernes, 14 de marzo de 2008

Desinstalar Aplicaciones compiladas en Linux

Normalmente utilizo apt para instalar mis aplicaciones en linux (en mi caso utilizo Ubuntu). Pero hay aplicaciones que no se encuentran en los repositorios de paquetes y por esto hay casos en los que debemos compilar código.

Normalmente la instalación de una aplicación sería:
  • ./configure
  • make
  • make install //Como usuario root
Para poder desinstalar debemos tener el código fuente con el que compilamos y seguir los siguientes pasos:
  • ./configure
  • make uninstall
Si no funcione verificar en el archivo Makefile si existe alguna directiva de Unistall.

Saludos ...

martes, 11 de marzo de 2008

Benchmark a tu sitios con ApacheBench en Linux

Si tu sitio u aplicación está alojada en un servidor que corre sobre apache, entonces podemos hacer un Benchmark para verificar el tiempo de respuesta de nuestra aplicación, gracias a la aplicación ApacheBench.

Este aplicación nos ayuda para hacer benchmark de aplicaciones hechas en php por ejemplo u otro tipo de aplicaciones, ya que podemos medir el tiempo de respuesta de nuestra app.

Ahora les coloco un ejemplo de su uso:
  • Entramos a la consola y colocamos:
    #: ab -c 10 -t 60 http://example.org/productos.php
  • Para llamar a la aplicación utilizamos el comando ab; explico los parámetros:
    • -c: este parámetro indica el número de clientes con el cual se va a llevar a cabo el test.
    • -t: indica el tiempo durante el cual se va a llevar a cabo el test. Este tiempo es en segundos.
Además de esos parámetros que pueden ser de utilidad para nuestras benchmark a servidores apache. Compruebe introduciendo ab man para obtener más información.

Espero puedan mejorar los procesos de sus aplicaciones utilizando esta herramienta para medir su rendimiento.

Saludos ...

jueves, 6 de marzo de 2008

Problemas con bindable y paginate en CakePHP

Últimamente tuve un poco de problemas con los binds y la función paginate de la nueva versión de el marco de trabajo cakephp, la 1.2.

Mi problema surgía cuando quería buscar todos los posts que estuvieran asociados a un tag específico, pero sólo quería traer la relación que el post tenía con Usuario y no la relación con Comentarios. Buscando por ahí me encuentra con una respuesta del Sr. Mariano Iglesias, que dice que la función paginate rehace las relaciones (por esta razón cualquiera unbindModel no funcionaría). En este enlace se puede encontrar información sobre el behavior Bindable. En mi caso la solución fue la siguiente:
  • Creo app_model.php y le agrego:
    var $actsAs = array('Bindable');
  • El método en el controlador post quedó así:
    function tag($id = null){
    if (!$id) {
    $this->Session->setFlash(__('Invalid Tag.', true));
    $this->redirect(array('action'=>'index'));
    }
    $this->layout = 'blog';
    // $this->Post->unbindModel(array('hasMany' => array('TrackPost', 'Comentario'), 'hasAndBelongsToMany' => array('Tag')));
    $this->Post->restrict(false, 'Usuario');
    /*$this->Post->bindModel(array('hasAndBelongsToMany' => array('Tag' => array(
    'joinTable' => 'posts_tags',
    'foreignKey' => 'post_id',
    'associationForeignKey' => 'tag_id',
    'unique' => false,
    'conditions' => 'Tag.id = '.$id)
    )
    ));*/
    $this->Post->Tag->recursive = 2;
    $this->set('existSession', $this->existSession());
    //$this->set('posts', $this->Post->Tag->find(array('Tag.id' => $id)));
    $this->set('posts', $this->paginate('Tag', array('Tag.id' => $id)));
    $this->Post->resetBindable(true);
    }
  • Lo interesante está en las siguientes líneas:
    • $this->Post->restrict(false, 'Usuario'); : esta línea restringe a que Post solo tengo relación con Usuario y el parámetro false hace que todos los cambios que haz hecho de relaciones sean permanentes.
    • $this->Post->resetBindable(true); : reseteo las relaciones para que funcionen como estaban.
Bueno con esto resolví mi problema. Saludos ...

lunes, 3 de marzo de 2008

Cakephp relación HBTM personalizada

Trabajando con CakePHP me encuentro en el manual el típico ejemplo de una relación de muchos a muchos (ejemplo de la relación de posts y tags).

Según la documentación se debe crear un campo select multiple para colocar los tags aquí. Este método no me gustó mucho y decidí hacerlo al estilo de el bloguer de Google, o sea, separar los tags por compas en un campo tipo text.

Mi solución consiste en buscar en la base de datos si los tags que el usuario introdujo existen, de no existir los inserto y obtengo su id. En el modelo post agregué el método beforeSave. Aquí les dejo el código:
public function beforeSave(){
if ($this->data['Tag']['tags'] != ''){ //Campo $form->input('Tag/tags')
$tags = explode(',', $this->data['Tag']['tags']);
foreach($tags as $tag){
$tag = trim($tag);
$tag_find = $this->Tag->findByTagname($tag);
if ($tag_find){
$tag_id = $tag_find['Tag']['id'];
}else{
$tag_ins = array('Tag' => array('tagname' => $tag));
$this->Tag->save($tag_ins);
$tag_id = $this->Tag->getLastInsertID();
}
$this->data['Tag']['Tag'][] = (string) $tag_id;
}
}
unset($this->data['Tag']['tags']);
return true;
}


Para el caso de la acción de editar, coloqué este código en el método:
if (empty($this->data)) {
$this->data = $this->Post->read(null, $id);
foreach($this->data['Tag'] as $tag){
$tags[] = $tag['tagname'];
}
$tags = implode(', ', $tags);
$this->set('tags', $tags);
}

Y en la vista
echo $form->input('Tag/tags', array('label' => 'Tags separados por coma', 'type' => 'text', 'value' => $tags));

Listo, de esta manera utilizamos la relación de muchos a muchos en cakephp, pero a nuestra manera.

Saludos ...