<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>El rincon de palangano</title>
	<link>http://palangano.com.ar</link>
	<description>Un blog con tagline</description>
	<pubDate>Mon, 07 Apr 2008 14:50:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<item>
		<title>Bazaar: Sistema de control de versiones</title>
		<link>http://palangano.com.ar/2008/04/06/bazaar-sistema-de-control-de-versiones/</link>
		<comments>http://palangano.com.ar/2008/04/06/bazaar-sistema-de-control-de-versiones/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 01:08:26 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Utilidades y Herramientas]]></category>

		<category><![CDATA[alternativa cvs]]></category>

		<category><![CDATA[bazaar]]></category>

		<category><![CDATA[control de versiones]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/04/06/bazaar-sistema-de-control-de-versiones/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><img src="http://palangano.com.ar/wp-content/uploads/2008/04/logotext.png" style="max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px" />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 <a href="http://www.cvshome.org">cvs</a> y <a href="http://subversion.tigris.org">subVersion</a>, el cual estoy utilizando actualmente. Este domingo de investigación me lleva a leer algo sobre <a href="http://bazaar-vcs.org/">Bazaar Version Control System</a>, un sitema de control de versiones que promete ser &#8220;<em>Version Control for Human Beings</em>&#8220;. Veamos como es la experiencia de usuario.</p>
<h2>Funcionamiento Básico</h2>
<p>Lo primero que hago es ir al tutorial titulado &#8220;<a href="http://doc.bazaar-vcs.org/latest/en/mini-tutorial/index.html">Bazaar in five minutes</a>&#8221; que suena muy prometedor.<br />
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.</p>
<pre>#  aptitude install bazaar</pre>
<p>Presto! Bazaar instalado. Tambien hay instrucciones para MacOS X y ese otro sistema que mucha gente usa.<br />
Luego bazaar nos pide que nos presentemos!</p>
<pre># bzr whoami "Lucas Caro &lt;lucas@triplesmart.com&gt;"</pre>
<p>Una vez presentados, chequeamos por las dudas</p>
<pre># bzr whoamiLucas Caro &lt;lucas@triplesmart.com&gt;</pre>
<p>Parece que esta todo bien, creemos un proyecto entonces</p>
<pre># mkdir -p myproject/subdirectory &amp;&amp; cd myproject &amp;&amp; touch test{1,2,3}.txt subdirectory/test4.txt</pre>
<p>e inicializamos bazaar:</p>
<pre># bzr init</pre>
<p>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</p>
<pre>#bzr add</pre>
<p>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.</p>
<pre># bzr commit -m "Initial Import"</pre>
<p>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.</p>
<p>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</p>
<pre># bzr diff</pre>
<p>nos dice estas diferencias. y siempre podemos hacer commit para unificar nuestros cambios con el repositorio.</p>
<h2>Flujos de Trabajo</h2>
<p>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:<br />
El trabajo en equipo se basa en tener un branch principal en un servidor y publicar o descargar de este repositorio.<br />
Bazaar nos ofrece el comando push para exportar nuestro branch a un repositorio, usando</p>
<pre># bzr push --create-prefix sftp://your.name@example.com/~/public_html/myproject</pre>
<p>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:</p>
<pre># bzr branch http://www.example.com/myproject</pre>
<p>Hasta ahora es muy cómodo el desarrollo, mantenimiento, publicación e importación de repositorios.</p>
<pre># bzr merge</pre>
<p>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.</p>
<p>Para publicar los cambios al repositorio oficial, si no es nuestro proyecto, podemos usar</p>
<pre class="literal-block">$ bzr send -o mycode.patch</pre>
<p>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 <a href="http://doc.bazaar-vcs.org/latest/en/user-guide/index.html#core-concepts">guia de usuario</a> podemos ver los tipos de flujo de trabajo que podemos usar con bazaar. Básicamente son:</p>
<ul>
<li><span style="font-weight: bold">Solo</span>: 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.</li>
<li><span style="font-weight: bold">Partner</span>: 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.</li>
<li><span style="font-weight: bold">Centralizado</span>: 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.</li>
<li><span style="font-weight: bold">Centralizado con commit local:</span> Al trabajar de forma centralizada, se puede hacer un commit &#8211;local para guardar cambios en el repositorio local y luego enviar todo el set de cambios al repositorio centralizado.</li>
<li><span style="font-weight: bold">Descentralizado con copia principal compartida</span>: Cada desarrollador trabaja con su copia local y luego la envian a la copia principal cuando los cambios están listos.</li>
<li><span style="font-weight: bold">Descentralizado con árbitro humano</span>: 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.</li>
<li><span style="font-weight: bold">Descentralizado con árbitro automátizado</span>: 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.</li>
</ul>
<p>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 <a href="http://bazaar-vcs.org/BzrPlugins">plugins</a> y mucho potencial.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/04/06/bazaar-sistema-de-control-de-versiones/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sistema de Módulos Para CakePHP (Parte 2) - Scripts de instalación</title>
		<link>http://palangano.com.ar/2008/03/16/sistema-de-modulos-para-cakephp-parte-2-scripts-de-instalacion/</link>
		<comments>http://palangano.com.ar/2008/03/16/sistema-de-modulos-para-cakephp-parte-2-scripts-de-instalacion/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 14:51:23 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Diseño Web]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[instalacion]]></category>

		<category><![CDATA[modulos]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/16/sistema-de-modulos-para-cakephp-parte-2-scripts-de-instalacion/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><img src="http://palangano.com.ar/wp-content/uploads/2008/03/modules.gif" style="max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px" />El objetivo de los scripts de instalación para el <a href="http://palangano.com.ar/2008/03/15/sistema-de-modulos-para-cakephp-parte-1-2/">sistema de módulos para cakephp</a> es automatizar el proceso de descarga, instalación, actualización y desinstalación de módulos en cakePHP.</p>
<p>Antes de seguir, veamos a que llamamos módulo.</p>
<p>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 &#8220;tirar&#8221; 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.</p>
<p>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.</p>
<p>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.</p>
<p>Resumiendo el proceso de instalación tenemos:</p>
<ol>
<li>Descargar la versión requerida del repositorio (Pedir usuario, password y versión de ser necesario)</li>
<li>Chequear que el módulo sea instalable (Tenga los archivos necesarios y se cumplan las dependencias)</li>
<li>Si el módulo ya se encuentra instalado, se pregunta al usuario que curso de acción tomar.</li>
<li>Ejecutar script pre_install del módulo.</li>
<li>Guardar copias de los archivos existentes si son del mismo módulo.</li>
<li>Informar si existe un archivo que no corresponde a otra version del modulo y será reemplazado.</li>
<li>Instalar archivos nuevos.</li>
<li>Guardar en la DB de modulos los datos del nuevo módulo con estado &#8220;instalando&#8221;</li>
<li>Procesar el archivo schema.sql del módulo.</li>
<li>Ejecutar script de post_install</li>
<li>Registrar el módulo como instalado.</li>
</ol>
<p>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</p>
<pre>module-get install|update|uninstall &lt;module-name&gt; [version]</pre>
<p>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.</p>
<p>Para terminar (por ahora), cabe aclarar que las operaciones de instalar, actualizar y desinstalar deberían ser &#8220;lo más atómicas posible&#8221;, 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).</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/16/sistema-de-modulos-para-cakephp-parte-2-scripts-de-instalacion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sistema de Módulos Para CakePHP (Parte 1)</title>
		<link>http://palangano.com.ar/2008/03/15/sistema-de-modulos-para-cakephp-parte-1-2/</link>
		<comments>http://palangano.com.ar/2008/03/15/sistema-de-modulos-para-cakephp-parte-1-2/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 13:34:56 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Diseño Web]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[modulos]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/15/sistema-de-modulos-para-cakephp-parte-1-2/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>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.<br />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.</p>
<hr class="jump" />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.</p>
<p>Dicho sistema debe ser de fácil mantenimiento y actualización. Inspirado en el sistema de paquetes de <a href="http://www.debian.org">Debian</a>, los módulos deben tener <span style="font-weight: bold;">dependencias</span>,scripts de <span style="font-weight: bold;">pre y post instalación/desinstalación</span>, <span style="font-weight: bold;">auto configuración de la base de datos</span>, y un sistema de registro que nos diga qué módulos están instalados y cuáles no.</p>
<p>Usaremos una base de datos <a href="http://www.sqlite.org/">sqlite</a>, que se integrará  al sistema cake sin problemas y podremos mantener la información de todos los módulos instalados.</p>
<p>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:<br /><span style="font-family: Courier New;">modules(</span><span style="text-decoration: underline; font-family: Courier New;">id</span><span style="font-family: Courier New;">,codename,name,version,description,status)</span><br />Con esto podemos guardar datos sobre los módulos instalados o a medio instalar.</p>
<p>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.</p>
<p>Dentro de cada directorio de módulo tendríamos los siguientes archivos:
<ul>
<li>module_specs.php</li>
<li>db_schema.sql</li>
<li>install_scripts.php</li>
</ul>
<p>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:
<ul>
<li>$name: opcional, el nombre del módulo. El default es el nombre del directorio.</li>
<li>$description: opcional, la descripción del módulo.</li>
<li>$depends: un array de nombres de módulo de los que éste depende.</li>
</ul>
<p>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.</p>
<p>Este sería el esquema básico para el sistema de módulos para cakephp (hasta ahora podría usarse independientemente del framework). <br />En el próximo post describiré el proceso de instalación de módulos.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/15/sistema-de-modulos-para-cakephp-parte-1-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ScribeFire Cada Vez Mejor</title>
		<link>http://palangano.com.ar/2008/03/14/scribefire-cada-vez-mejor/</link>
		<comments>http://palangano.com.ar/2008/03/14/scribefire-cada-vez-mejor/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 01:14:23 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Blogs]]></category>

		<category><![CDATA[blog utils]]></category>

		<category><![CDATA[blogging]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/14/scribefire-cada-vez-mejor/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div style="text-align: left;"><a href="http://www.scribefire.com/"><img style="max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px; width: 309px; height: 86px;" src="http://www.scribefire.com/images/header.png" /></a></div>
<p>Estoy usando la nueva versión (1.4.7) de esta <a href="http://www.scribefire.com/">fantástica herramienta para bloggers</a>, 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!</p>
<p>Entre las mejoras que destaco están la de poder agregar elementos HTML personalizados, muy útil para mi
<pre>código</pre>
<p>asi como la posibilidad de agregar tags, aparte de categorías a un post en particular. </p>
<p>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. </p>
<p>Recomendado 100%.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/14/scribefire-cada-vez-mejor/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nuevo Sitio de Cadena 3</title>
		<link>http://palangano.com.ar/2008/03/05/nuevo-sitio-de-cadena-3/</link>
		<comments>http://palangano.com.ar/2008/03/05/nuevo-sitio-de-cadena-3/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 12:49:03 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Córdoba]]></category>

		<category><![CDATA[Minipost]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/05/nuevo-sitio-de-cadena-3/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Está online el muy anunciado nuevo sitio de una gran gran radio de Córdoba cadena3.com. Lamentablemente, es horrible en todos los sentidos.</p>
<p>Podés leer más en el <a href="http://www.gatodegrandesbotas.com/2008/03/04/cadena3-relanza-su-portal-y-lo-empeora-por-todos-lados/#comment-46279">gato de grandes botas</a>, <a href="http://ele-zeta.com.ar/2008/03/04/cadena-3-y-el-relanzamiento-de-su-portal/">ele-zeta</a> y <a href="http://www.elrallador.info/2008/03/04/cadena-3-y-su-web-00/">el rallador</a>.</p>
<p>Un gran salto hacia atrás en el diseño web cordobés.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/05/nuevo-sitio-de-cadena-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Acabemos con las patentes de software!</title>
		<link>http://palangano.com.ar/2008/03/03/acabemos-con-las-patentes-de-software/</link>
		<comments>http://palangano.com.ar/2008/03/03/acabemos-con-las-patentes-de-software/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 13:51:36 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Minipost]]></category>

		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/03/acabemos-con-las-patentes-de-software/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Genial iniciativa, <a href="https://endsoftpatents.org/">End Software Patents</a>, nos cuenta desde distintos puntos de vista, por qué estan tan mal las patentes de software. Felicitaciónes a ellos por el nuevo sitio.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/03/acabemos-con-las-patentes-de-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Una iniciativa arrogante en defensa de la web</title>
		<link>http://palangano.com.ar/2008/03/02/una-iniciativa-arrogante-en-defensa-de-la-web/</link>
		<comments>http://palangano.com.ar/2008/03/02/una-iniciativa-arrogante-en-defensa-de-la-web/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 23:10:26 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Diseño Web]]></category>

		<category><![CDATA[Minipost]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/02/una-iniciativa-arrogante-en-defensa-de-la-web/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><img style="float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" src="http://palangano.com.ar/wp-content/uploads/2008/03/banner-234x60.png" />Es el eslogan del sitio <a href="http://403day.org/es/">403day.org</a>, que nos plantea intentar defender la web de las deficiencias de ciertos navegadores a la hora de implementar los estándares web. Como desarrollador web siento que es mi responsabilidad difundir esta iniciativa, por el bien de la web y el futuro de los estándares.<br />¿La idea? el 4 de marzo de 2008 es el día 403 (en honor a la respuesta http de &#8220;prohibido el acceso&#8221;) y se frenará el acceso a todos los usuarios que usen Micro$oft Internet Exploter. <br />más info en <a href="http://403day.org/es/">la página de 403</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/02/una-iniciativa-arrogante-en-defensa-de-la-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Localización e internacionalización en cakephp 1.2</title>
		<link>http://palangano.com.ar/2008/03/01/localizacion-e-internacionalizacion-en-cakephp-12/</link>
		<comments>http://palangano.com.ar/2008/03/01/localizacion-e-internacionalizacion-en-cakephp-12/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 19:34:12 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[1.2]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[i18n]]></category>

		<category><![CDATA[internacionalización]]></category>

		<category><![CDATA[l10n]]></category>

		<category><![CDATA[localización]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/01/localizacion-e-internacionalizacion-en-cakephp-12/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Uno de los agregados más  importantes de cake 1.2 es el soporte para i18n y l10. Para activarla, cualquier controller que procese contenido localizado, debería usar la clase L10n que cake nos provee.</p>
<p>En mi caso, la aplicación completa usará localización, entonces agrego al principio de app_controller.php:</p>
<pre>uses('L10n');
class AppController extends Controller {</pre>
<p>Luego de esto, necesitamos crear archivos para manejar el texto localizado, cake maneja esto en el directorio <span style="font-family: Courier New">APP/locale.</span> Cada lenguaje tiene un conjunto de cadenas de texto con sus repectivas claves, o id. Cada lenguaje es un subdirectorio dentro de <span style="font-family: Courier New">APP/locale</span> con el código de tres caracteres correspondiente al lenguaje (ISO 639-2, <a href="http://www.loc.gov/standards/iso639-2/php/code_list.php">ver lista</a>).</p>
<p>Cada subdirectorio de lenguaje debe contener un archivo  <span style="font-family: Courier New">default.po</span>  dentro del directorio LC_MESSAGES con las cadenas y sus claves. Por ejemplo, mi .po para inglés es  APP/locale/eng/LC_MESSAGES/default.po</p>
<p>Hay que tener en cuenta que cada clave debe ser única y debe tener un valor asociado.</p>
<p>Los archivos .po deber tener un encoding <span>ISO-8859-1 y los strings no pueden tener más de 1014 caracteres y deben estar formados de la siguiente manera:</span></p>
<pre>msgid "clave o id del texto"
msgstr "cadena asociada en el idioma  actual."</pre>
<p>Luego te tener esto listo, debemos indicar a cake el lenguaje a utilizar. podemos hacer esto en el controller, mi método preferido: en app_controller.php</p>
<pre>function beforeFilter(){
        $this-&gt;L10n = new L10n();
        $languages=array('es','en');
        $paramLang=strtok($_SERVER['HTTP_HOST'],'.');
        $lang = $this-&gt;Session-&gt;check('lang') ? $this-&gt;Session-&gt;read('lang'):'en';
        if(isset($paramLang) &amp;&amp; in_array($paramLang,$languages) ){
            $lang = $paramLang;
            $this-&gt;Session-&gt;write('lang',$lang);
        }else{
            $this-&gt;Session-&gt;write('lang',$lang);
        }
        $this-&gt;L10n-&gt;get($lang);
        Configure::write('Config.language', $lang);
    }</pre>
<p>me permite guardar el lenguaje en sesión, y cambiarlo con subdominios. Una vez elegido el método para guardar y cambiar el lenguaje actual, las líneas</p>
<pre><span>        $this-&gt;L10n-&gt;get($lang);
        Configure::write(&#8217;Config.language&#8217;, $lang);</span></pre>
<p>son las que indican a cake que debe usar el lenguaje especificado para imprimir las cadenas asociadas cuando usamos __().</p>
<p><span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/01/localizacion-e-internacionalizacion-en-cakephp-12/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Las vistas en cakephp 1.2</title>
		<link>http://palangano.com.ar/2008/03/01/las-vistas-en-cakephp-12/</link>
		<comments>http://palangano.com.ar/2008/03/01/las-vistas-en-cakephp-12/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 17:47:16 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[1.2]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[vistas]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/03/01/las-vistas-en-cakephp-12/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con el post anterior, sigo investigando lo nuevo que trae la version 1.2 de <a href="http://www.cakephp.org">cakephp</a>.<br />
Mi primera aplicación es una migración de una con la que vengo trabajando hace bastante, no es nada específico sino más una especie de sitio base, o template para crear aplicaciónes.</p>
<p>Lo primero que encuentro en mi recién creado proyecto, es un montón de archivos .ctp en la vista. En la nueva versión, los .thtml se llaman ahora .ctp (por cake template), pero siguen siendo archivos php y la idea debajo es la misma.</p>
<p>Además, en estos archivos .ctp hay llamadas a una nueva función __(), que maneja la localización y traducciones, la función se declara de la siguiente forma:</p>
<pre>__(string $string_id, boolean $return = false)</pre>
<p>Y nos permite imprimir el texto asociado al id para el idioma actual. Una cosa importante a notar es que si no existe el texto con el id indicado, esta función imprimirá dicho texto, asi que es buena costumbre usarla siempre para el texto que queramos mostrar en nuestra aplicación.</p>
<p>Por lo demás, las vistas son prácticamente iguales que en cake 1.1, archivos php para mostrar html y el contenido que nos pasa el controlador.</p>
<p>Cake 1.2 trae también nuevos y mejorados <strong>helpers,</strong> por ejemplo, el <strong>FormHelper</strong> tiene funciones mucho más completas (y se movió todo lo relacionado a forms a este helper)  como:</p>
<ul>
<li> create() para abrir un form</li>
<li>end() para cerrarlo</li>
<li>input() para crear inputs automágicos (solo $form-&gt;input(&#8221;nombre_del_campo&#8221;) nos crea el campo de formulario correcto, un gran reemplazo para los distintos métodos de cake 1.1, que todavía podemos usar de ser necesario.</li>
</ul>
<p>El nuevo <strong>HtmlHelper</strong> ya no tiene métodos relacionados con formularios, y esta disponible por default para todas las vistas. El mismo nos provee functiones para imprimir html bien formado,  incluyendo charsets, meta,  doctypes, estilos (css), imagenes, divs, links, urls, parrafos,  tablas, etc.</p>
<p>Tambien tenemos los ya conocidos <strong>JavascriptHelper</strong> y <strong>AjaxHelper </strong>que nos ayudan a agregar efectos dinámicos a la aplicaicón,  usando prototype y script.aculo.us y no han cambiado mucho.</p>
<p>NumberHelper, TextHelper y TimeHelper  mejorados y con más funciones que nos ayudan a dar formato a sus respectivos tipos de datos siguien facilitandonos la vida en el maravilloso mundo de cakephp.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/03/01/las-vistas-en-cakephp-12/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalando cakephp 1.2</title>
		<link>http://palangano.com.ar/2008/02/29/instalando-cakephp-12/</link>
		<comments>http://palangano.com.ar/2008/02/29/instalando-cakephp-12/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 13:38:47 +0000</pubDate>
		<dc:creator>palangano</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[cake]]></category>

		<category><![CDATA[cake 1.2]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[instalar]]></category>

		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://palangano.com.ar/2008/02/29/instalando-cakephp-12/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Hace bastante tiempo que estoy usando este framework, <a href="http://www.cakephp.org">cakephp</a> está inspirado en rails y plantea ser un framework de desarrollo rápido de aplicaciones web para php.</p>
<p>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 &#8220;la versión oficial impuesta por el uso&#8221;. 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.</p>
<p>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).</p>
<p>Entre las más notables entonces tenemos:</p>
<ul>
<li>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 &#8220;custom&#8221; que nos permite usar expresiones regulares. La lista es gigante, y puede encontrarse <a href="http://cakebaker.42dh.com/2007/01/03/validation-with-cakephp-12/">aqui</a>.</li>
<li>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.</li>
<li>Soporte para temas: ahora es muy fácil asignar distintos grupos de vistas y crear temas totalmente distintos.</li>
<li>Se agrega una consola cake, desde la cual ejecutamos el nuevo script bake, que está bastante mejorado.</li>
<li>Se incluye una suite de testing que en estos días es un requerimiento más para el desarrollo.</li>
<li>Facilidades para generación de rss y xml</li>
<li>paginación: directamente en el core de cake.</li>
<li>Mejoras en autenticación</li>
<li>Componente email: para generar emails facilmente y desde templates.</li>
<li>Mejoras en los helpers, se mueven funciónes para mejorar cohesión y se agrega funcionalidad a los helpers existentes.</li>
<li>Manual! si, cake 1.2 sale con un manual completito y bastante bueno cuya versión beta está temporalmente <a href="http://tempdocs.cakephp.org/">aca</a></li>
</ul>
<p>Bueno, suficiente por ahora sobre lo nuevo. instalemos cake:</p>
<p>Primero lo primero, yo tengo la siguiente estructura de directorios:</p>
<pre>~/cake_1.2 : aqui va la ultima version de cake 1.2
 ~/public_html : aqui crearemos el nuevo sitio.</pre>
<p>entonces, estando en ~/cake_1.2/cake/console tenemos el nuevo script <span style="font-weight: bold">cake </span>que es la consola de la que hablaba antes.</p>
<pre>cd ~/cake_1.2/cake/console</pre>
<p>lo ejecutamos, queremos especificar que vamos a usar el comando bake, y queremos crear un sitio en ~/public_html</p>
<pre>./cake -app ~/public_html/demosite bake</pre>
<p>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:</p>
<h2 style="font-weight: bold; color: #cc0000"><small><small>Sweet, &#8220;Demosite&#8221; got Baked by CakePHP!</small></small></h2>
<p>Si todo está bien, vemos mensajes de confirmación sobre</p>
<ul>
<li> el directorio tmp (<span class="notice success">Your tmp directory is writable.</span>)</li>
<li>el cache (<span class="notice success">The <em>FileEngine</em> is being used for caching. To change the config edit APP/config/core.php</span>)</li>
<li>la base de datos (<span class="notice">Your database configuration file is NOT present.)</span></li>
</ul>
<p>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:</p>
<pre>./cake -app ~/public_html/demosite bake</pre>
<p>Y nos pregunta sobre la base de datos (de forma más bonita que el 1.1), le ponemos<br />
name: default,<br />
driver: en mi caso mysql o postgres, el que usemos en el servidor de prueba.<br />
persistent connection: lo que corresponda segun sus necesidades, yo le pongo no<br />
database host: localhost o el servidor de bases de datos que corresponda<br />
port: n usa el puerto default<br />
user y password: lo que corresponda aqui.</p>
<p>Si todo sale bien, vemos un mensaje de confirmación y cuando refrescamos el sitio nos dice &#8220;<span class="notice success">Your database configuration file is present.</span>&#8221; y &#8220;<span class="notice success">Cake is able to connect to the database.</span>&#8221;</p>
<p>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 <img src='http://palangano.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>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.</p>
<p>Como conclusión, no es muy distinto de instalar cake 1.1 solo que el nuevo bake es más inteligente.</p>
]]></content:encoded>
			<wfw:commentRss>http://palangano.com.ar/2008/02/29/instalando-cakephp-12/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
