November 19th, 2008 Category: Zend Framework
No Comments »

Un grupo de gente se puso en campaña para traducir la documentacion de Zend Framework, entre ellos yo, aportando algo aunque sea minimo (mi ingles no es el mejor). Cualquier puede participar de este proyecto de traduccion, a continuacion voy a transcribir un extracto de la gente de codigolinea que son los promoteres de este proyecto.

La documentación oficial en español ha estado estancado por mucho tiempo, las causas pueden ser diversas, pero el mayor problema es el trámite un poco tedioso con Zend, ya que se tiene que firmar un documento llamado CLA “Contributor License Agreement” para poder hacer contribuciones y esperar que Zend lo apruebe, luego de eso solicitar acceso al SVN (que también es un poco complicado) para poder enviar los documentos traducidos, lo cual ha desanimado ha muchos.

Como miembro del grupo de traductores del manual de ZF y viendo esta problemática instale un wiki http://www.zfdes.com/ para que todos puedan colaborar y así podamos avanzar con la traducción del manual, después de ser traducidos y revisados estos documentos serán enviados a Zend.

He empezado a enviar algunos avances a Zend, pueden verlo aquí

¿Y como ayudar?
Puedes ayudar de la siguiente manera:

- Traduciendo los documentos publicados
- Verificando las traducciones
- Corrigendo errores y/o reportándolos en el foro del wiki http://foro.zfdes.com/
- Comunicando a otros para que nos ayuden en la traducción

Así que ya no hay mas excusas para no poder ayudar, esperamos tu apoyo!

Enlaces:
wiki: http://zfdes.com/
SVN: http://framework.zend.com/svn/framework/standard/trunk/documentation/manual/es

Seguir leyendo

November 19th, 2008 Category: Zend Framework
11 Comments »








El concepto de cachear contenido es simple. Cada vez que generamos una pagina con contenido dinamicamente con PHP, lo que hacemos desde el lado del servidor es procesar los .php, estos generalmente tienen cierta logica, para generar el contenido que vamos a mostrar, como buscar en la base datos, llamar algun webservice, y depende el sistema mas o menos cosas. Con Zend_Cache nos evitamos de estos pasos.

Lo que hacemos con Zend_Cache, es generar el html(xml, json, etc) final, y almacenarlo en el file system. De esta manera cada vez que hagamos llamen a nuestra web vamos a llamar a nuestro html final, y no volver a generar el html que generamos en peticiones anteriores. Esto sirve para web donde el contenido no cambia constantemente.

Por ejemplo si tuvieramos un diario, como www.clarin.com.ar donde acceden millones de personas mensualmente, pero sabemos que el unico momento donde se cambia la portada es cuando aparece una nueva nota, aunque las paginas internas siguen siendo las mismas.

Para este caso es ideal algo como Zend_Cache, podemos Cachear toda portada, y cada una de las paginas internas, si desde la administracion se carga una nueva nota, se borra el cache anterior y se genera uno nuevo muy facilmente.

Pero hasta ahora solo vimos la teoria.

Manos a la obra

Lo primero que tenemos que hacer antes de cachear nuestras paginas es configurar como queremos que funcione Zend_Cache. En este ejemplo le vamos a dar un tiempo de vida determinado, vamos a indicarle donde queremos que almacene las paginas cacheadas, y vamos a decirle que actions y vistas queremos que cachee. Este codigo podemos ponerlo en nuestro bootstrap.

 7200,
   'debug_header' => true, // for debugging
   'regexps' => array(
       // cache the whole IndexController
       '^/$' => array('cache' => true),

       // cache the whole IndexController
       '^/index' => array('cache' => true),

       '^/home' => array('cache' => true),
       // we don't cache the ArticleController...

       // we don't cache the ArticleController...
       '^/news' => array('cache' => true),

       // we don't cache the ArticleController...

       // ... but we cache the "view" action of this ArticleController
       '^/news/list/view' => array(
           'cache' => true
       )
   ),
   'default_options' => array(
   		   'make_id_with_post_variables' => true,
           'make_id_with_cookie_variables' => true,
           'cache_with_cookie_variables' => true
    )

);

$backendOptions = array(
    'cache_dir' => '/tmp/zend_cache'
);

// getting a Zend_Cache_Frontend_Page object
$cache = Zend_Cache::factory('Page',
                             'File',
                             $frontendOptions,
                             $backendOptions);
$cache->start();
?>

En este ejemplo estamos cacheando los controller news, home, index. Ademas le indicamos que el directorio para los files es /tmp/zend_cache (hay que crearlo!!)

Los tiempos que se reducen dependen de la cantidad de datos que busquemos en la base de datos, webservice, o que dependa de cierta logica.

Para un blog, o un portal con muchos hits diarios esto es indispensable al menos que tengamos hardware de sobra. En este blog yo uso WP-Cache de Ricardo Galli que hace lo mismo que Zend_Cache.

Seguir leyendo

November 18th, 2008 Category: varios
No Comments »

El sabado lei que para el lunes google Maps iba a mostrar las calles de Buenos Aires, pero a la hora que yo me fije no habia nada todavia. Hoy despues de leer una nota de Critica de la Argentina donde confirman que google maps ya soporta Buenos Aires decidi chequear nuevamente y con la la satisafaccion de poder ver esto.

Al parecer todavia no estan habilitados los servicios extras, pero ya anunciaron que se iran habilitando. Como el servicio para el Iphone tan esperado.

Seguir leyendo

November 17th, 2008 Category: Zend Framework
2 Comments »

Cada vez que instanciamos un Zend_Db_Table, ZF hace un describe de la/las tablas que vamos a usar en nuestros query, recolectar esta info consume tiempo y recurso. ZF nos da la posibilidad de Cachear estos datos, usando Zend_Cache. Esto si bien podria estar como default, para reducir bastante los tiempos, no lo esta debido a que si cambiamos el nombre o datos de nuestra tabla, deberiamos limpiar el cache, y para evitar problemas que pueda llegar a generar esto no viene activo por default.

Si queremos hacerlo en nuestro sistema usando Sqllite la forma es muy simple. Basta habilitar sqllite en nuestro php.ini y crear una carpeta para que guarde este cache, podemos elegir la misma ruta que usamos para guardar nuestras paginas con Zend_Cache, todo esto es totalmente personalizable.

El codigo para que guarde la metada lo tenemos que aplicar antes de instanciar cualquier modelo, esto lo podemos hacer desde el bootstrap, pero tambien hay otras formas, cada uno puede implementar la forma que mas le convenga.

Los datos a continuacion tenemos que guardarlos en nuestro archivo de configuracion, yo uso los .ini en el ejemplo
config.ini
[metadata_cache]
frontend.automatic_serialization = true
frontend.lifetime = 3600
; Lugar donde vamos a guardar el cache
backend.cache_db_complete_path= “/tmp/zend_cache_db”

Y este es el codigo que deberia ir en nuestro bootstrap

bootstrap.php

frontend, $config->metadata_cache->backend );
$cache->clean( Zend_Cache::CLEANING_MODE_ALL );
Zend_Db_Table_Abstract::setDefaultMetadataCache( $cache );
?>

Enlaces

Documentacion oficial de Zend_Db_Table
Documentacion de webinar sobre acceso a la base de datos con Zend Db

Seguir leyendo

November 14th, 2008 Category: Open source
1 Comment »

Hoy me pasaron un video de un interesante proyecto open source, llamado Open Croquet, y me puse a investigar un poco mas, y llegue a varios articulos interesantes.

Basicamente es crear un entorno de usuario 3D aprovechando las redes Peer to peer (P2P). El proyecto es open source.

Voy a copiar un texto sacado de www.amphibia.com.ar que cuenta un par de cosas sobre este proyecto.

“Por decirlo en pocas palabras: los usuarios de Croquet pueden modificar el entorno, que no habitan en soledad sino que lo comparten con otros usuarios, y que está online permanentemente, incluso con aplicaciones compartidas. Los participantes del Croquet tienen la capacidad de crear y de modificar el espacio informacional y de crear conexiones completamente dinámicas a otros espacios o recursos de la red. Se trata de un entorno donde cualquier cosa puede ser creada o ser representada; donde todo puede ser modificado. El entorno de Croquet pierde sentido si lo pensamos como un espacio privado, porque se trata de una arquitectura abierta, de interacción física y cognitiva, donde esa interacción no se da tanto con la interfaz como directamente con la información y con los usuarios de la red.”

Demo del producto

Video presentacion del proyecto.

Link del proyecto

Otro Articulo interesante

Seguir leyendo

November 13th, 2008 Category: Oracle
2 Comments »

No voy a meterme mucho en el tema de los triggers, pero hoy necesitaba que se si se actualiza un registro de mi tabla se actualize un campo de esta misma tabla con la fecha de modificacion.

Aca va la magia.

CREATE OR REPLACE TRIGGER nombre_trigger
    before insert or update on nombre_tabla
        for each row
    begin
        :new.nombre_campo_a_actualizar  := sysdate;
    end;

Tambien podemos especificar que hacer algo dependiendo si inserta preguntando if inserting, y obviamente podemos hacer mil cosas mas, este es solo un pequeño aporte.

Seguir leyendo

November 12th, 2008 Category: Open source
No Comments »

Gracias a tux info 11, me entero de este largometraje completamente realizado con software libre ( Blender ). En la voz de uno de los pajarracos, me parecio reconocer a Guido Kazka, no encontre la lista de autores para confirmarlo.

El proyecto esta bastante bueno, no solo porque apoya al software libre, sino porque ademas esta hecho en Argentina y es un producto de alta calidad.

Mis felicitaciones a este producto con sabor a Asado.

Sitio Oficial

Seguir leyendo


November 8th, 2008 Category: Programacion
4 Comments »

Agregar repositorios externos

Cuando trabajamos con sistemas un poco mas grande que lo normal puede ser que usemos librerias o partes de otros sistemas. Esas otras partes pueden ya estar dentro de un control de versiones y no necesitamos agregarlas dentro de nuestro repositorio. Pero si necesitamos enlazarlas.

La idea es simple, yo tengo un sistema conjunto con otro proyecto donde trabajan otras personas, pero tambien necesito subir y obtener las actualizaciones.

El ejemplo mas facil es usar la libreria Zend Framework, la forma comun es bajarse Zend Framework, y copiarlo dentro de nuestro proyecto, y agregarlo al control de versiones, pero ZF ya tiene su propio repositorio, al cual nosotros podemos acceder, y si agregamos ese repositorio a nuestro proyecto de forma externa, cada vez que hagamos un svn up, va a controlar si en el repositorio de ZF se genero algun cambio, y en ese caso, nos va a traer los cambios nuevos, solo haciendo svn up, dentro de nuestro repositorio.

Por ejemplo, yo tengo un repositorio con librerias propias, en http://pablo-morales.com/svn/PM/trunk, y ademas tengo la lib de ZF en http://framework.zend.com/svn/framework/standard/trunk/library/Zend, y un proyecto en el que estoy trabajando llamado svntest, y lo tengo en http://pablo-morales.com/svn/svntest/trunk

Cuando hago un checkout del repositorio svntest, me crea una carpeta llamada library, esta carpeta esta vacia. Aca voy a poner mis repositorios externos y lo voy a hacer de la siguiente forma

Creo un archivo llamado externals.

$ vi externals

Dentro este archivo, voy a ingresar 2 lineas con dos columnas, la primera va a tener el nombre de la carpeta que quiero que se guarde los archivos, y la segunda la url del repositorio.

Siguiendo con el ejemplo anterior, la forma correcta de generar nuestro archivo externals seria la siguiente.

El proximo paso es decirle que traiga los repositorios externos que tengo en el archivo externals

$ svn propset svn:externals -F externals .

si este comando nos devuelve property ‘svn:externals’ set on ‘externals’ es que todo salio bien.

Y por ultimo paso  hacemos

$ svn up

Los repositorios externos los marca con una X

Ignorando archivos del control de versiones

Si queremos que un grupo de archivos de nuestro proyecto no sean incluidos dentro del control de versiones. Por ejemplo las imagenes, los swf, o cualquier otro archivo que no va a sufrir modificaciones podemos usar las property de Subversion para ignorar estos archivos. Por ejemplo si queremos que todos los archivos .jpg de un directorio sean ignorados.
$ svn propset svn:ignore “*.jpg” /path_de_la_carpeta

Tambien podemos hacer
$ svn propedit svn:ignore -F .svnignore

Y dentro del archivo .svnignore el listado de archivos a ignorar.

Seguir leyendo