Archive for febrero, 2008

Instalando cakephp 1.2

Hace bastante tiempo que estoy usando este framework, cakephp está inspirado en rails y plantea ser un framework de desarrollo rápido de aplicaciones web para php.

Me toca en este momento actualizar a la versión 1.2. La versión 1.1 es la versión estable desde hace tiempo, pero la nueva 1.2 es un beta que podría ser considerado “la versión oficial impuesta por el uso”. Muchos sitios están usando cake 1.2 y no es el objetivo de este post hablar de cake, sino documentar mi experiencia del paso de 1.1 a 1.2.

La versión 1.2 trae muchas características nuevas, incluyendo algunas que a veces son totalmente necesarias, como internacionalización (i18n) y localización (l10n).

Entre las más notables entonces tenemos:

  • Mejoras en la validación: se agregan reglas para validación automática como alfanumérica, email (brillaba por su ausencia), url (idem), y en definitiva se provee de métodos de validación mucho más completos (por ejemplo la validación “custom” que nos permite usar expresiones regulares. La lista es gigante, y puede encontrarse aqui.
  • Mejoras en el manejo de caché: cake 1.1 tiene un sistema básico de cache que es ampliado enormemente en la versión 1.2. Ahora podemos elegir entre distintos métodos de caching, e incluso cambiarlos dinámicamente.
  • Soporte para temas: ahora es muy fácil asignar distintos grupos de vistas y crear temas totalmente distintos.
  • Se agrega una consola cake, desde la cual ejecutamos el nuevo script bake, que está bastante mejorado.
  • Se incluye una suite de testing que en estos días es un requerimiento más para el desarrollo.
  • Facilidades para generación de rss y xml
  • paginación: directamente en el core de cake.
  • Mejoras en autenticación
  • Componente email: para generar emails facilmente y desde templates.
  • Mejoras en los helpers, se mueven funciónes para mejorar cohesión y se agrega funcionalidad a los helpers existentes.
  • Manual! si, cake 1.2 sale con un manual completito y bastante bueno cuya versión beta está temporalmente aca

Bueno, suficiente por ahora sobre lo nuevo. instalemos cake:

Primero lo primero, yo tengo la siguiente estructura de directorios:

~/cake_1.2 : aqui va la ultima version de cake 1.2
 ~/public_html : aqui crearemos el nuevo sitio.

entonces, estando en ~/cake_1.2/cake/console tenemos el nuevo script cake que es la consola de la que hablaba antes.

cd ~/cake_1.2/cake/console

lo ejecutamos, queremos especificar que vamos a usar el comando bake, y queremos crear un sitio en ~/public_html

./cake -app ~/public_html/demosite bake

Luego nos hace preguntas sobre nuestro sitio, y en general los defaults estan bien, asi que le damos enter, enter, y ya tenemos nuestro sitio. Y si vamos al browser (con apache instalado y userdirs andando) a http://localhost/~nuestro_login/demosite deberiamos ver la bienvenida de cake. Yo lo tengo configurado como subdominio, asi que entro como demosite.localhost. Como sea que tengamos nuestro servidor de desarrollo, al ir al sitio vemos la bienvenida de cake:

Sweet, “Demosite” got Baked by CakePHP!

Si todo está bien, vemos mensajes de confirmación sobre

  • el directorio tmp (Your tmp directory is writable.)
  • el cache (The FileEngine is being used for caching. To change the config edit APP/config/core.php)
  • la base de datos (Your database configuration file is NOT present.)

Claro que todavia no seteamos la base de datos, para esto, creamos la db y usuario con nuestra herramienta preferida, volvemos a la consola y tipeamos nuevamente:

./cake -app ~/public_html/demosite bake

Y nos pregunta sobre la base de datos (de forma más bonita que el 1.1), le ponemos
name: default,
driver: en mi caso mysql o postgres, el que usemos en el servidor de prueba.
persistent connection: lo que corresponda segun sus necesidades, yo le pongo no
database host: localhost o el servidor de bases de datos que corresponda
port: n usa el puerto default
user y password: lo que corresponda aqui.

Si todo sale bien, vemos un mensaje de confirmación y cuando refrescamos el sitio nos dice “Your database configuration file is present.” y “Cake is able to connect to the database.

En este momento tenemos el sitio básico de cake funcionando y conectado a la db. Es muy parecido a la version 1.1 pero a mi me resultó un poco más cómodo tener el CAKE_CORE_PATH bien configurado por bake :)

Con esto terminamos la instalación básica de cakephp 1.2 que no es mucho más que hacerlo con la 1.1 y ya podemos empezar a crear nuestro sitio.

Como conclusión, no es muy distinto de instalar cake 1.1 solo que el nuevo bake es más inteligente.

Popularity: 4% [?]

Truquito png semitransparente con css version 2.0

Estuve usando mi código el código que encontré por ahí para habilitar las transparencias en ie6 y he hecho un par de mejoras. A saber:

Incluyo el css con comentarios condicionales solo para ie6:

<!--[if lte IE 6]>

    <?php echo $html->css('fix_ie');?>

<![endif]-->

Como hago esto, no hace falta poner el * html antes de cada selector.

Además, tengo dos bloques de código distintos, uno es para imágenes sin repetir (no-repeat) y el otro para imágenes como sombras, bordes, etc. Que si bien son repeat-y o repeat-x, a mi me da lo mismo si se repiten o se estiran.

El problema con este método es que no encontré forma de hacer que la imágen se repita. Pero como para lo único que necesito imágenes repetidas es para hcer sombras, con una imágen de 1px, me da lo mismo si repite o estira, por ende puedo usar el otro modo.

El codigo entonces me queda con una base de dos bloques (dentro de fix_ie.css):

img, .png-no-repeat{
    behavior: expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(
    this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
    this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "', sizingMethod='image')",
    this.src="transparent.gif"):(this.origBg = this.origBg? this.origBg
    :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
    this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',
    sizingMethod='image')",
    this.runtimeStyle.backgroundImage = "none")),this.pngSet=true));
}

y para los que deben “repetirse”:

.png-repeat {
    behavior: expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(
    this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
    this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "', sizingMethod='image')",
    this.src="transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
    this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "', sizingMethod='scale')",
    this.runtimeStyle.backgroundImage = "none")),this.pngSet=true));
}

Nótese donde dice sizingMethod=’scale’ que es la parte que hace la magia.
Agregando esto en nuestro html, ahora podemos hacer que cualquiera de nuestros pngs cargue la transparencia, tanto para no-repeat como para los repeat-x o repeat-y.

Un problema con el que me topé es que a veces, ie6 hace desaparecer el fondo cuando le pongo la opcion scale o repeat, la solucion a esto ha sido siempre especificar explícitamente el ancho en píxels del div en cuestión. Parece que ie tiene problemas para calcular tamaños.

Otra solución para el div que desaparece cuando le pongo transparencia es darle position:absolute; al div.

Leí por ahí que a algunas personas les desaparecen los links dentro de un div con fondo semitransparente. Y leí tambien que la solución a eso es poner position:relative; a todos los links dentro del div.

Hablando de Hackers….

Popularity: 3% [?]

Sueño Polifasico

Y si… me entere de que la gente puede dormir solo 2 horas por dia y me puse a analizar en que gasto mi tiempo.
Definitivamente puedo usar un par de horitas extra, verdad?

La idea básica es dormir de a pedazos, hay distintos cronogramas que uno puede seguir, siendo los mas conocidos (por mi) el llamado Uberman y el de Buckminister Fuller conocido como sueño Dymaxion. El primero es 20 minutos cada 4 horas y el segundo es de 30 minutos cada 6 horas.

Al principio mi idea era usar el cronograma Uberman, porque encontré más gente en la web contando experiencias y mas referencias en general, pero todos, invariablemente, dejan el sueño polifásico por incompatibilidad con el resto de la sociedad. Justamente por eso, estoy siguiendo el cronograma de Buckminister Fuller, que me da un poco más de tiempo despierto de un solo tirón y es mas compatible con cualquier actividad que tome más de 3 horas.

Bueno, la cuestión es que hoy empecé con esto (después de mucho
planear). Cuando tenga un tiempito (los planes son tener mucho tiempo
libre a partir de ahora) ahondo más en el tema. pero por ahora todo
bien.

Sigue aca

Popularity: 3% [?]