Archive for 2008

php Captcha – de nuevo


Tenia que pasar. Tan bien que veniamos con la solucion del captcha personalizada, eventualmente los spambots evolucionaron lo suficiente como para romperla, y me empezo a llegar demasiado spam, desde formularios online con doble protección.

El paso siguiente: cambiar mi captcha generado con gd en nuestros servers por uno que, espero, vaya evolucionando mas rapido que los spambots, recaptcha, y de paso ayudamos a digitalizar libros. Ya veremos si mejora, por lo pronto yo creo que si.

Popularity: 7% [?]

Chau Uber

Hoy me llego esto:

Thank You.  Goodbye.  Uber will be turned off on Monday.
Thank You.That's the first thing that we wanted to say. We have some bad news.
The crisis in the economy has claimed Uber as its
latest victim. Our investors have decided to stop supporting Uber and
we have closed the doors. We would like to thank them too; it’s no
fault of theirs that this happened. On the contrary, without their
unflinching support we would never have made it this far, and they have
stood by us and tried desperately to help us realize our dreams.

The site will be inactive as of Monday September 29, 2008.

Mas allá de todo comentario sobre economia, politica y etica, me llamó la atencion la cantidad de personas que hicieron su sitio en uber, tan contentos e inocentes, lo promocionaron, se esforzaron, etc, etc, y ahora van a perder su sitio… Me da pena por mucha gente, espero que tengan alguna forma de hacer backup… y para la proxima un buen hosting a buen precio

Solo eso, aprovechando para reflotar el blog.

Popularity: 4% [?]

Como Habilitar Transparencias en pngs de forma automatica para IE6 – Reloaded

unitlogo.pngHey! estoy muy feliz con unitpngfix y quería compartirlo. Esta solución ahorra muchos de los problemas que produce el método de usar filtros en ie6 (que explicaba en un post anterior) y todo de una forma mucho mas simple y bonita.
Para que las imagenes y fondos png de tu sitio funcionen sin problemas en internet exploter 6, hay que seguir la siguiente receta:

  • Descargarse el script de unitpngfix y copiarlo en su sitio, en algun lugar accesible.
  • Agregar lo siguiente dentro del <head> del documento, es decir, cargar el script en ies menores que 7 (el cual parece que parcharon para que ande sin trabajo extra… bien ahi equipo de ie7!)
  • Copiar el archivo clear.gif a donde las imagenes deben ir.
  • Editar unitpngfix.js y cambiar la direccion del clear.gif en la primera linea.
    <!--[if lt IE 7]>
        <script type="text/javascript" src="unitpngfix.js"></script>
    <![endif]-->
  • Disfrutar.

Vio que facil doña? con esto anda de las mil maravillas, sin tocar css, sin escribir filtros, sin nada extra.
Excelente, y ahorra miles de millones de horas que los desarrolladores podemos usar para tomar mate, dedicarnos a ser felices, o jugar con javscript y el nuevo plugin de jquery que hace que la pagina se vea en 3d con los anteojitos rojos y azules.

Eso es todo por ahora, me quedo satisfecho de ayudar a hacer de este mundo, un lugar mejor.


Popularity: 4% [?]

Cakephp en Español

cake-logo22.pngEl grupo de cakephp en español se está moviendo a http://groups.google.com/group/cakephp-esp asi que para los que ya estaban recibiendo mails: actualicen sus libretas de contactos y filtros. Y para los nuevos que llegaron a este post porque buscan el grupo y alg una respuesta: estamos en http://groups.google.com/group/cakephp-esp.

Eso es todo por ahora.


Popularity: 7% [?]

Bazaar: Sistema de control de versiones

En la caja de herramientas de un desarrollador siempre podemos encontrar un sistema de control de versiones preferido. Mi experiencia personal me llevó primero a cvs y subVersion, el cual estoy utilizando actualmente. Este domingo de investigación me lleva a leer algo sobre Bazaar Version Control System, un sitema de control de versiones que promete ser “Version Control for Human Beings“. Veamos como es la experiencia de usuario.

Funcionamiento Básico

Lo primero que hago es ir al tutorial titulado “Bazaar in five minutes” que suena muy prometedor.
la parte de instalacion dice que probablemente el programa ya está en mi distribución y que la instalación deberia ser facil. Estoy algo malcriado por debian y normalmente asumo esas dos cosas, veamos.

#  aptitude install bazaar

Presto! Bazaar instalado. Tambien hay instrucciones para MacOS X y ese otro sistema que mucha gente usa.
Luego bazaar nos pide que nos presentemos!

# bzr whoami "Lucas Caro <mymail@example.com>"

Una vez presentados, chequeamos por las dudas

# bzr whoamiLucas Caro <mymail@example.com>

Parece que esta todo bien, creemos un proyecto entonces

# mkdir -p myproject/subdirectory && cd myproject && touch test{1,2,3}.txt subdirectory/test4.txt

e inicializamos bazaar:

# bzr init

Esto nos crea un directorio .bzr con muchos archivos dentro que guardan la informacion de bazaar. Paso siguiente, agregamos todos los arvhivos a bazaar con

#bzr add

Que sin argumentos agrega todo recursivamente (muy conveniente) al repositorio. Lo unico que falta es hacer commit del repositorio, pero, ¿Dónde está guardando bazaar el repositorio, las versiones, etc? Parece que en el .bzr tenemos un directorio branch que es donde se guarda todo, y al hacer commit estamos guardando un snapshot del código (o version) tal y como está ahora. Parecido a lo tradicional, pero con Bazaar el proyecto se guarda dentro del arbol de directorios.

# bzr commit -m "Initial Import"

Guarda los cambios con el respectivo mensaje. Hasta ahora, parece ser un sistema de control de versiones que no necesita que un administrador cree un repositorio, administre usuarios, etc. veremos como se las arregla.

Cuando queremos hacer un cambio o editamos un archivo, tenemos a nuestra disposición un comando para ver las diferencias entre nuestra copia de trabajo y el repositorio

# bzr diff

nos dice estas diferencias. y siempre podemos hacer commit para unificar nuestros cambios con el repositorio.

Flujos de Trabajo

Por lo que vimos hasta ahora, bazaar sirve muy bien al desarrollador solitario, pero ¿qué pasa con los equipos que trabajan juntos en un mismo proyecto? Veamos como publicar un proyecto de bazaar:
El trabajo en equipo se basa en tener un branch principal en un servidor y publicar o descargar de este repositorio.
Bazaar nos ofrece el comando push para exportar nuestro branch a un repositorio, usando

# bzr push --create-prefix sftp://your.name@example.com/~/public_html/myproject

podemos publicar a un servidor sftp y sera creado un branch que podemos usar de principal en dicho servidor. Y cualquiera con acceso al sftp puede descargarse el branch con:

# bzr branch http://www.example.com/myproject

Hasta ahora es muy cómodo el desarrollo, mantenimiento, publicación e importación de repositorios.

# bzr merge

Nos permite actualizar nuestro branch local con los cambios del branch principal (el ultimo usado con push o branch), podemos chequear los cambios con diff y si nos parece bien, con un commit los incorporamos a nuestro repositorio local.

Para publicar los cambios al repositorio oficial, si no es nuestro proyecto, podemos usar

$ bzr send -o mycode.patch

Para obtener un archivo patch con los cambios y luego enviarlo a quien corresponda para que los incorpore. Está bien, no es un proceso muy automatizado, pero es solo una forma, en la guia de usuario podemos ver los tipos de flujo de trabajo que podemos usar con bazaar. Básicamente son:

  • Solo: para el desarrollador solitario que necesita control de versiones y publica paquetes. Se tiene un control de versiones sin setup y con control de cambios muy fácil de utilizar.
  • Partner: Para trabajar al estilo peer-to-peer, con dos personas que trabajan en sus copias y hacen merge de los cambios de la otra persona cuando sea necesario.
  • Centralizado: Basicamente el mismo workflow que cvs o subversion, todos los desarrolladores trabajan en el mismo branch, hacen update y luego commit para guardar los cambios en el servidor.
  • Centralizado con commit local: Al trabajar de forma centralizada, se puede hacer un commit –local para guardar cambios en el repositorio local y luego enviar todo el set de cambios al repositorio centralizado.
  • Descentralizado con copia principal compartida: Cada desarrollador trabaja con su copia local y luego la envian a la copia principal cuando los cambios están listos.
  • Descentralizado con árbitro humano: Cada desarrollador tiene su propio branch y acceso de solo lectura al repositorio principal. Cuando un desarrollador quiere publicar sus cambios, le pide autorización al árbitro, quien debe revisar el código, y luego publica los cambios en el repositorio principal.
  • Descentralizado con árbitro automátizado: Como el anterior pero una vez enviado al árbitro, éste hace un merge, compila y corre el suite de test, y el código se publica en el servidor principal si y solo si pasa todos los tests. Muy bueno para proyectos grandes y para test driven development. Si los casos de test estan bien mantenidos, este workflow garantiza mayor estabilidad y robustez del código. Bazaar provee una herramienta para esto llamada Patch Queue Manager (PQM) para hacer el trabajo de árbitro automatizado.

Ya tenemos un vistazo más general de las cosas que se pueden hacer con bazaar y parece ser una herramienta muy completa y que da muchas opciones para desarrollo. Me gustó mucho lo del PQM y la automatización de tests. Además parece flexible y configurable y promete ser una herramienta muy útil y sobre todo, facil de usar y configurar y con una gran cantidad de plugins y mucho potencial.


Popularity: 2% [?]

Sistema de Módulos Para CakePHP (Parte 2) – Scripts de instalación

El objetivo de los scripts de instalación para el sistema de módulos para cakephp es automatizar el proceso de descarga, instalación, actualización y desinstalación de módulos en cakePHP.

Antes de seguir, veamos a que llamamos módulo.

Un módulo es un grupo de funcionalidades, agrupadas por alguna razón en especial. La idea es tener módulos para tareas que siempre usamos y queremos “tirar” dentro de un nuevo proyecto. Un módulo podría ser un sistema básico de usuarios, la expansión del mismo a un sistema de grupos y permisos más elaborado, una lista de email, páginas cms, etc, etc. Básicamente un paquete de funcionalidad que queremos agregar a un sitio.

Por que no usar plugins? Bueno, los módulos podrían ser plugins, ya que hasta ahora no hemos hablado de la estructura del módulo en si, podemos decir que el módulo, aparte de los archivos mencionados en el post anterior, puede contener cualquier archivo que necesite ser instalado en nuestro directorio APP. Con esto podemos tener módulos con controllers, models, views, y también con helpers, behaviors, components, vendors, imágenes, css, scripts, y casi cualquier cosa que nos imaginemos, sin el problema que representa copiar archivos de un proyecto a otro.

Teniendo en cuenta que la instalación, mantenimiento y desinstalación serán automáticas, el único problema que nos queda es que los archivos de distintos módulos no se solapen. A esto lo podemos lograr al tener ciudado y ser metódicos a la hora de crear los módulos, pero nuestro sistema también deberia avisarnos si un módulo que estemos por instalar sobreescribirá un archivo de otro módulo ya instalado, o cualquier archivo ya existente.

Resumiendo el proceso de instalación tenemos:

  1. Descargar la versión requerida del repositorio (Pedir usuario, password y versión de ser necesario)
  2. Chequear que el módulo sea instalable (Tenga los archivos necesarios y se cumplan las dependencias)
  3. Si el módulo ya se encuentra instalado, se pregunta al usuario que curso de acción tomar.
  4. Ejecutar script pre_install del módulo.
  5. Guardar copias de los archivos existentes si son del mismo módulo.
  6. Informar si existe un archivo que no corresponde a otra version del modulo y será reemplazado.
  7. Instalar archivos nuevos.
  8. Guardar en la DB de modulos los datos del nuevo módulo con estado “instalando”
  9. Procesar el archivo schema.sql del módulo.
  10. Ejecutar script de post_install
  11. Registrar el módulo como instalado.

Esta es la linea general a seguir por el script de instalación del módulo. Aspiramos a un script que se pueda usar de la siguiente forma

module-get install|update|uninstall <module-name> [version]

Y creo que en sin querer bautizé a mi script. La idea es usar el mismo script para las tres tareas, instalar, actualizar y desinstalar un módulo. El parámetro de versión seria opcional y si no está presente, el script instalará la ultima versión del módulo especificado.

Para terminar (por ahora), cabe aclarar que las operaciones de instalar, actualizar y desinstalar deberían ser “lo más atómicas posible”, es decir que si algo nos impide seguir con la instalación, este script debería poder dejar las cosas tal y como estaban antes de que comienze a hacer cambios (tanto en archivos como en db).


Popularity: 7% [?]

Sistema de Módulos Para CakePHP (Parte 1)

Hace bastante que vengo trabajando con cake, y una de sus mejores ventajas es la reusabilidad del código que uno hace. El único punto débil en este aspecto es la ausencia de un sistema bien organizado y modular.
Lo que planteo en este artículo es definir un sistema de módulos y una serie de scripts que instalen, configuren, y desinstalen automáticamente.


Antes de continuar, cabe aclarar que este post no plantea ser una solución definitiva, sino una idea que puede evolucionar con el tiempo en algo muy útil.Dicho sistema debe ser de fácil mantenimiento y actualización. Inspirado en el sistema de paquetes de Debian, los módulos deben tener dependencias,scripts de pre y post instalación/desinstalación, auto configuración de la base de datos, y un sistema de registro que nos diga qué módulos están instalados y cuáles no.

Usaremos una base de datos sqlite, que se integrará al sistema cake sin problemas y podremos mantener la información de todos los módulos instalados.

La primera tabla que necesitamos es modules (hare todo en inglés para mantener la consistencia con el resto del sistema) cuya estructura es (o podría ser) la siguiente:
modules(id,codename,name,version,description,status)
Con esto podemos guardar datos sobre los módulos instalados o a medio instalar.

El directorio APP/conf me parece el lugar ideal para guardar los datos de los módulos, así, tendremos todo en APP/conf/modules, un archivo sqlite (modules.sqli) y subdirectorios con el nombre de cada módulo instalado.

Dentro de cada directorio de módulo tendríamos los siguientes archivos:

  • module_specs.php
  • db_schema.sql
  • install_scripts.php

El primero (module_specs.php) es el que indicará a nuestro script de instalación los detalles del módulo. Debe contener valores para las variables:

  • $name: opcional, el nombre del módulo. El default es el nombre del directorio.
  • $description: opcional, la descripción del módulo.
  • $depends: un array de nombres de módulo de los que éste depende.

El archivo db_schema.sql contiene las ordenes sql para crear la(s) tabla(s) necesaria(s) para el módulo. También puede contener datos iniciales para las mismas.

Este sería el esquema básico para el sistema de módulos para cakephp (hasta ahora podría usarse independientemente del framework).
En el próximo post describiré el proceso de instalación de módulos.


Popularity: 8% [?]

ScribeFire Cada Vez Mejor

logo.png

Estoy usando la nueva versión (1.4.7) de esta fantástica herramienta para bloggers, y la verdad que se pasaron con los agregados. Hace no mucho les pedí que agregaran un par de facilidades para la escritura, y la verdad que los desarrolladores han sido más que receptivos a la hora de escuchar mis sugerencias, y ya tengo version nueva con todo lo que había pedido y más!

Entre las mejoras que destaco están la de poder agregar elementos HTML personalizados, muy útil para mi

código

asi como la posibilidad de agregar tags, aparte de categorías a un post en particular.

Estas dos características más la posibilidad de especificar ping urls personalizadas hacen de este release algo realmente útil, completo y cómodo para los bloggers.

Recomendado 100%.

Popularity: 3% [?]

Nuevo Sitio de Cadena 3

Está online el muy anunciado nuevo sitio de una gran gran radio de Córdoba cadena3.com. Lamentablemente, es horrible en todos los sentidos.

Podés leer más en el gato de grandes botas, ele-zeta y el rallador.

Un gran salto hacia atrás en el diseño web cordobés.

Popularity: 4% [?]

Acabemos con las patentes de software!

Genial iniciativa, End Software Patents, nos cuenta desde distintos puntos de vista, por qué estan tan mal las patentes de software. Felicitaciónes a ellos por el nuevo sitio.

Popularity: 4% [?]

Página siguiente »