Sigueme en Twitter

Archivo de artículos en la categoría "Software Libre"

Ir al inicio

Una cita de Richard Stallman

2/07/2008

Al preguntarle si ha pensado en tener hijos:

La idea de unirse con otro en amor para crear una mezcla es muy romántica, pero las consecuencias son muchas molestias. Por ejemplo, las peleas arruinan el mismo amor, y hay que dedicar la vida al ganar dinero.

El crecimiento de población es también muy malo para el mundo. La población actual parece más que la tierra puede soportar. Estamos estropeando nuestro mundo. El no tener hijos es un acto muy importante para protegerlo.

Siempre polémico.

7 Comentarios

Ignorando archivos en Subversion

5/06/2008

Una propiedad de Subversion que viene bien cuando tienes muchos archivos ajenos a tu repositorio mezclados con tu código, es el svn:ignore.

Al hacer un svn status en lugar de tener un resultado con un montón de archivos inservibles ..

$ svn status calc
 M     calc/button.c
?      calc/calculator
?      calc/data.c
?      calc/debug_log
?      calc/debug_log.1
?      calc/debug_log.2.gz
?      calc/debug_log.3.gz

.. puedes tener un resultado con solo los archivos que te interesan filtrando los indeseados, solo tenemos que agregar la propiedad ignore al directorio calc ..

svn propedit svn:ignore calc

.. esto te abrirá un editor donde agregas un patrón (ojo, no es una expresión regular) que en nuestro ejemplo ignorara a todo menos a archivo data.c

calculator
debug_log*

Y listo, ahora el resultado de svn status solo es lo que nos importa.

$ svn status
 M     calc
 M     calc/button.c
?      calc/data.c

Enlace | SVN Book

Sin Comentarios

¿Para que usar el X-JSON de Prototype?

15/05/2008

En un canal de IRC, hoy una persona me hizo recordar un problema que tuvimos hace un par de semanas en la oficina porque los datos en JSON que regresaba una web, mágicamente desaparecían aun cuando antes estaba funcionando.

En ambos casos fue el mismo error, no se tenia contemplado que los datos enviados fueran a crecer demasiado eventualmente, y como X-JSON utiliza los headers de HTTP, tiene un tamaño limitado.

Yo realmente no le veo el punto de su existencia, ¿enviar estados de una página? ¿mensajes cortos? Para eso mejor utilizar headers correctos de HTTP y cualquier tipo de datos por el cuerpo de la página como fue pensado desde el principio, la confusión que puede crear es mayor que el beneficio.

Si lo dejas a mi opinión: No lo uses, evítalo.

1 Comentario

Firebug y Firefox 3 beta 5

27/04/2008

No entiendo porque con la actualización de Hardy nos obligaron a utilizar la Beta de Firefox, que en realidad no es mala (a mi me va mucho, mucho mas rápido) pero la gran mayoría de extensiones no funciona en ella aún.

En mi caso Firebug es indispensable para trabajar y la versión beta de su sitio no sirve para nada, por lo que uso una versión que compartió un usuario de los foros de ubuntu. Solo descargalo y arrastralo hacia la ventana de addons y listo.

firebug-1.2.0a20X.xpi

12 Comentarios

Elements en Helpers de CakePHP

19/04/2008

Tanto como no se debe de usar un Model dentro de un Component, tampoco se debe de usar un Element dentro de un Helper, aun así, si tienes una situación especial donde debes de hacerlo, lo puedes lograr de la siguiente manera.

1
2
$vista = ClassRegistry::getObject('view');
$vista->renderElement('nombre_elemento');

CakePHP te pone las reglas (y para tu propia sanidad, deberías de seguirlas), pero no te limita a ellas.

Sin Comentarios

Escuchando en diferentes puertos con Lighttpd

1/04/2008

Tip del día.

La variable $SERVER['socket'] en Lighttpd es la onda, te permite poner a escuchar el servidor en otros puertos ademas del que la variable server.port especifica, en mi caso permitió poner a escuchar al servidor en diferentes puertos y dependiendo del puerto cambiar el directorio por default, pero obviamente dentro de su condicional puedes hacer lo que desees.

1
2
3
$SERVER["socket"] == ":81" {
    server.document-root = "/path/to/anything"
}

Ignoro si funciona con host virtuales, pero no esta de mas probar.

Sin Comentarios

Dolores de cabeza con los espacios blancos

1/04/2008

En CakePHP, una situación muy común es que se te vaya una linea en blanco después de que has cerrado los tags de PHP en prácticamente cualquier archivo que este incluido en el framework, ya sea un helper, view, controller, component.. lo que sea.

Normalmente esto no trae problemas, pero cuando necesitas que lo que imprimes en pantalla sea absolutamente lo primero, como las declaraciones de un feed XML o un header para imprimir una imagen, si que afecta y es un dolor de cabeza buscar de archivo por archivo donde esta el espacio en blanco si tu proyecto a crecido demasiado.

Por ahi en la lista de cake, alguien público una expresión regular con sed que recursivamente busca por cualquier archivo de PHP con lineas vacías al final y las elimina:

find -name “*.php” | xargs sed -i -e :a -e ‘/^\n*$/{$d;N;ba’ -e ‘}’

Recomendaría que solo la utilizaras si tu código esta en un repositorio, para que te des cuenta de cuales archivos a modificado y donde exactamente.

4 Comentarios

Utilizando Prototype correctamente

11/03/2008

Leyendo Quest’s Blog, me encontré un par de artículos de Perfection Kills, que dan unos tips acerca del uso básico de Prototype.

El primero en especial me parece muy útil, a pesar de que son cosas muy simples son errores que todos cometemos al principio, ¿Seamos sinceros, que tantos se chutan toda la documentación antes de empezar a programar?

Me servirá de recordatorio así que me he tomado la libertad de publicarlo:

Errores comunes con Prototype

1.

Modo Incorrecto

1
document.getElementById('foo')

Modo Correcto

1
$('foo')

El operador $ es lo mas esencial de Prototype, de ahí viene toda su magia, utilizalo!

2.

Modo Incorrecto

1
2
var woot = document.getElementById('bar').value
var woot = $('bar').value

Modo Correcto

1
var woot = $F('bar')

El operador $F es un gran atajo para obtener valores de elementos.

3.

Modo Incorrecto

1
2
$('footer').style.height = '100px';
$('footer').style.background = '#ffc';

Modo Correcto

1
2
3
4
5
6
$('footer').setStyle(
  {
      height: '100px',
      background: '#ffc'
  }
)

Olvidate de problemas de bugs sobre diferentes navegadores si utilizas el metodo setStyle()

4.

Modo Incorrecto

1
$('tusuperelemento').innerHTML = 'algun contenido'

Modo Correcto

1
$('tusuperelemento').update('algun contenido')

Podras decir que es casi la misma, pero no opinaras lo mismo cuando necesites concatenar funciones.

5.

Modo Incorrecto

1
new Ajax.Request('ninja.php?weapon1=foo&weapon2=bar')

Modo Correcto

1
2
3
4
5
6
7
8
9
new Ajax.Request('ninja.php',
  {
    parameters:
      {
        weapon1: 'foo',
        weapon2: 'bar'
      }
  }
)

Escribe código limpio, tu cerebro te lo agradecerá.

6.

Modo Incorrecto

1
2
3
4
5
6
7
8
new Ajax.Request('blah.php',
  {
    method: 'POST',
    asynchronous: true,
    contentType: 'application/x-www-form-urlencoded',
    encoding: 'UTF-8',
  }
)

Modo Correcto

1
new Ajax.Request('blah.php')

Todos esos parámetros ya son defaults, ¿Para que repetirlos?.

7.

Modo Incorrecto

1
Event.observe('myContainer', 'click', doSomeMagic)

Modo Correcto

1
$('myContainer').observe('click', doSomeMagic)

Es mas fácil concatenar si escoges el segundo, pero aquí es cuestión de gustos, escoge el sabor que mas te guste.

8.

Modo Incorrecto

1
2
3
4
5
$$('div.hidden').each(function(el)
  {
    el.show();
  }
)

Modo Correcto

1
$$('div.hidden').invoke('show')

Invoke es muy útil, piensa en el como en un atajo cuando necesitas asignar valores iguales a todos tus elementos sin necesidad de iterar sobre ellos.

9.

Modo Incorrecto

1
2
3
4
5
$$('div.collapsed').each(function(el)
  {
    el.observe('click', expand);
  }
)

Modo Correcto

1
$$('div.collapsed').invoke('observe', 'click', expand)

Y también puede ser usado para manejo de eventos, muy practico!

10.

Modo Incorrecto

1
2
$$('input.date').invoke('observe', 'focus', onFocus);
$$('input.date').invoke('observe', 'blur', onBlur);

Modo Correcto

1
2
3
$$('input.date')
  .invoke('observe', 'focus', onFocus)
    .invoke('observe', 'blur', onBlur)

¿Para que abusar del operador $$ dos veces si podemos concatenar?

11.

Modo Incorrecto

1
2
3
4
5
6
$('productTable').innerHTML = 
  $('productTable').innerHTML + 
  '<tr><td>' + productId + ' '
  + productName + '</td></tr><tr><td>' 
  + productId + ' ' + productPrice + 
  '</td></tr>'

Modo Correcto

1
2
3
4
5
6
7
8
9
10
11
var rowTemplate = new Template('<tr><td>#{id} #{name}</td></tr><tr><td>#{id} #{price}</td></tr>');
  $('productTable').insert(
    rowTemplate.evaluate(
      {
        id: productId,
        name: productName,
        price: productPrice
      }
    )
  )
)

Este tip en especial es una joya, con Prototype podemos hacer templates, evitando de esta manera enormes plastas de código. Me confieso culpable de no haber utilizado esto antes.

Enlace | How well do you know prototype

5 Comentarios

Usando funciones de MySQL en CakePHP

11/03/2008

Algo que me atraso en la madrugada era que CakePHP escapa todas las condicionales que le mandas en una consulta SQL, y si la condicional de casualidad esta formada con una funcion de MySQL, esta obviamente no se ejecuta.

Por ejemplo, esto no funcionara: (busca que el campo created sea mas reciente que hace 1 día)

1
2
3
4
5
$conditions = array
    (
        "created" => "> date_sub( curdate(), interval 1 day)"
    );
$this->Model->findAll( $conditions, null, "depart_date ASC");

Para evitar esto CakePHP implementa un operador mágico “-!” que le indica no escapar esa sentencia y nuestra consulta se ejecute como pretendemos.

1
2
3
4
5
$conditions = array
    (
        "created" => "> -!date_sub( curdate(), interval 1 day)"
    );
$this->Model->findAll( $conditions, null, "depart_date ASC");

Voilà!

3 Comentarios

Editando imágenes por lote en linux

25/02/2008

Si tienes montones de imágenes a las cuales tener que editarles algo, lo que sea, como recortarlas, ponerles un texto, aplicarles contorno redondeado, rotarlas y similares, estarás de acuerdo que es un dolor de cabeza hacerlo de una por una con programas de edición como gimp o photoshop.

En linux como para casi todo, hay mil maneras de solucionar esto (scripts para el mismo nautilus, plugins para gimp, etc) y una muy buena es usando Phatch (Photo Batch), que te permite hacer eso y muchos tipos de ediciones mas.

Un gran punto a favor es el poder agregar cada tipo de edición como una acción y poder combinarlas entre si para lograr diferentes resultados, ademas de poder guardar tus listas de acciones por si realizas lo mismo seguido.

Phatch

Enlace: Phatch

2 Comentarios