<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CuatroXL &#187; php</title>
	<atom:link href="http://www.cuatroxl.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cuatroxl.com</link>
	<description>Desarrollo web - Cuatro XL</description>
	<lastBuildDate>Wed, 07 Dec 2011 12:21:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Metodos y Algoritmo para crear una URL corta (shorturl)</title>
		<link>http://www.cuatroxl.com/2011/09/metodos-algoritmo-crear-una-url-corta-shorturl/</link>
		<comments>http://www.cuatroxl.com/2011/09/metodos-algoritmo-crear-una-url-corta-shorturl/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 21:58:54 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[tutoriales]]></category>
		<category><![CDATA[utilidades]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=480</guid>
		<description><![CDATA[Intro Hoy quería investigar sobre cómo crear un sistema de URL cortas; lo primero que hay que decir, es que hay cientos de servicios que te generan este tipo de URL, pero siempre es con el dominio de la herramienta, cosa que no es muy recomendable. De las librerías(resumidas más abajo) que he podido analizar; [...]]]></description>
			<content:encoded><![CDATA[<h2>Intro</h2>
<p>Hoy quería investigar sobre cómo crear un sistema de  URL cortas; lo primero que hay que decir, es que hay cientos de servicios que te generan este tipo de URL, pero siempre es con el dominio de la herramienta, cosa que no es muy recomendable.</p>
<p>De las librerías(resumidas más abajo) que he podido analizar; todas guardan en una base de datos la URL y un identificador que será el que se envía como parámetro. Dentro de estas librerías, <strong>se puede separar en tres grupo por la forma de generar ese identificador</strong>:</p>
<ol>
<li>Las que crean un indice numérico incremental y lo utilizan como identificador.</li>
<li>Las que crear un indice numérico incremental y luego encriptan este número y usan como identificador</li>
<li>Las que ecriptan de algún modo la URL de destino y utilizan (el resultado de la encriptación) como identificador.</li>
</ol>
<h2>YourURL</h2>
<p>Esta librería ha sido la primera en descartar; porque creo que usa la API de su web para realizar la tarea acortar la URL. Cabe destacar que es una aplicación bastante completa porque tiene una sección para ver el trafico que han tenido las URL generadas.</p>
<p>web: <a href="http://yourls.org">http://yourls.org</a></p>
<h2>Rick URL Shortening Service </h2>
<p>Esta librería (en .NET) es del primer grupo; que más o menos nos da una idea de como se monta el sistema. </p>
<p>El principal fallo que le veo; es que se pasa como identificador el ID (numérico) como parámetro y no queda demasiado estético.</p>
<p>En el siguiente screencast (del autor de esta librería) se puede ver bastante bien cómo se monta este sistema(es exactamente igual a como lo monta el segundo grupo):</p>
<p><iframe src="http://player.vimeo.com/video/2517727?title=0&amp;byline=0&amp;portrait=0" width="100%" height="302" frameborder="0"></iframe></p>
<p>web: <a href="http://www.stum.de/2008/12/14/rick-url-shortening-service-an-aspnet-mvc-learning-project/">http://www.stum.de/&#8230;url-shortening-service&#8230;-project/</a></p>
<h2>LilURL</h2>
<p>Esta librería es del 2 grupo; aunque hace una encriptación un tanto rara y bastante enrevesada. Hace una encriptación con caracteres alfabéticos en minúscula.</p>
<p>Lo curioso es que no usa el indice incremental; es él mismo quien va creando la secuencia de identificadores. Para que os hagáis una idea de cómo funciona, este es su código para generar el identificador:</p>
<pre class="brush: php;">
$id = $this-&gt;get_next_id($this-&gt;get_last_id());
</pre>
<p>Como podéis ver, genera el identificador a partir del último. Esto resultaría interesante si no fuese porque realiza una consulta a la base de datos para poder conocer el último identificador generado y a partir de ahí genera el siguiente.</p>
<p>web: <a href="http://lilurl.sourceforge.net/">http://lilurl.sourceforge.net/</a></p>
<h2>Loolu</h2>
<p>Este pertenece al segundo grupo y sin lugar a duda, para mi, es la mejor manera de encriptar la URL. Aquí directamente se descompone el número en una base (64) y se representa con caracteres numéricos, alfabéticos con minúsculas y mayúsculas. El algoritmo es más que sencillo (está en python):</p>
<pre class="brush: python">
codeset  = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
base = 62 # len(codeset)
#....
def encode(self, id):
        hash = ""
        while (id > 0):
            hash = self.codeset[int(id % self.base)] + hash
            id = math.floor(id / self.base)
        return hash
</pre>
<p>Poco más que añadir a lo genial que es esta solución, simple y eficaz.</p>
<p>web: <a href="http://code.google.com/p/loolu/">http://code.google.com/p/loolu/</a></p>
<h2>LessN</h2>
<p>Esta librería pertenece al tercer grupo; encripta la URL utilizando un CheckSum (de PHP y Mysql) y lo usa como identificador. Código que realiza la encriptación:</p>
<pre class="brush: php;">
$checksum 		= sprintf('%u', crc32($url));
$escaped_url 	= function_exists('mysql_real_escape_string') ? mysql_real_escape_string($url) : mysql_escape_string($url);
//...
mysql_query('INSERT INTO `'.DB_PREFIX.'urls` SET `url`="'.$escaped_url.'", `checksum`='.$checksum);
</pre>
<p><em>nota: Cómo podéis ver es muy importante escapar las URL, ya que corremos el peligro de que nos pongan javascript en la url y puede llegar a ejecutarse en el navegador.</em></p>
<p>web: <a href="http://www.shauninman.com/archive/2009/08/17/less_n">http://www.shauninman.com/archive/2009/08/17/less_n</a></p>
<h2>Resumen</h2>
<p>En este tipo de servicios, es muy importante tener muy en cuenta el rendimiento de nuestra aplicación, ya que una mala arquitectura te puede consumir demasiados recursos. Es por eso que personalmente me quedo con el algoritmo de Loolu que me parece de lo más sencillo y eficiente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2011/09/metodos-algoritmo-crear-una-url-corta-shorturl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuatroxl_Controller_Plugin_DataPage :: Un plugin para cargar datos multi-idioma (o no) con ZF</title>
		<link>http://www.cuatroxl.com/2010/08/cuatroxl_controller_plugin_datapage-un-plugin-para-cargar-datos-multi-idioma-o-no-con-zf/</link>
		<comments>http://www.cuatroxl.com/2010/08/cuatroxl_controller_plugin_datapage-un-plugin-para-cargar-datos-multi-idioma-o-no-con-zf/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 12:12:08 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[component]]></category>
		<category><![CDATA[componente_web]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[cuatroxl source]]></category>
		<category><![CDATA[zend_controller plugin]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=406</guid>
		<description><![CDATA[Este plugin viene bastante bien para tener todos los datos de texto en un XML. Por norma general se suele guardar en una base de datos; pero muchas veces el sitio no tiene un CMS o es muy pequeño para tener la información en una base de datos. Con este plugin cargamos un XML, pasandole [...]]]></description>
			<content:encoded><![CDATA[<p>Este plugin viene bastante bien para tener todos los datos de texto en un XML. Por norma general se suele guardar en una base de datos; pero muchas veces el sitio no tiene un CMS o es muy pequeño para tener la información en una base de  datos.</p>
<p>Con este plugin cargamos un XML, pasandole unos parámetros de configuración para que automáticamente nos seleccione un nodo especifico del XML. Esta configuración utiliza comodines de Zend_Route (Module, Controller, Action, ParamX&#8230;.) para el nombre del archivo y el nodo por defecto:</p>
<pre class="brush: php;">
<?php
/*
 * Cuatroxl
 *
 * LICENSE
 *
 * This file is part of Cuatroxl ( http://code.google.com/p/cuatroxl/ ).
 *
 * Cuatroxl is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Cuatroxl is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Cuatroxl.  If not, see <http ://www.gnu.org/licenses/>.
 *
 *
 * @category   Cuatroxl
 * @package    Cuatroxl_Zf_Action_Helper
 * @autor      Jimmy Collazos <jimmy.collazos@gmail.com>
 * @license    http://www.gnu.org/licenses/gpl.html     GPLv3
 * @version    0.01
 */

/**
 * @see Zend_Controller_Plugin_Abstract
 */
require_once 'Zend/Controller/Plugin/Abstract.php';

/**
 * @category   Cuatroxl
 * @package    Cuatroxl_Controller
 * @subpackage Cuatroxl_Controller_Plugin
 * @license    http://www.gnu.org/licenses/gpl.html     GPLv3
 */
class Cuatroxl_Controller_Plugin_DataPage extends Zend_Controller_Plugin_Abstract
{

    /*
     * Variable de configuración
     *
     * @var Array
     */
    protected       $_config      = array('autoload'  => false
                            ,'filePath'     => 'public/:module/:controller/:action.xml'
                            ,'xpath'        => ''
                            ,'basePath'     => APPLICATION_PATH
                            // esta opción es solo para cuando NO usamos Zend_Application
                            ,'_keyPlugin'   => '');

    /*
     * Ruta del archivo XML a cargar
     *
     * @var string
     */
    protected       $_filePath = null;

    /*
     * Xpath query para poder obteenr el nodo por defecto del XML
     *
     * @var string
     */
    protected       $_xpath = null;

    /*
     * En esta variable se almacena el XML final con el que podemos trabajar
     * desde el controlador
     *
     * @var SimpleXMLElement
     */
    protected       $_data;

    /*
     * Nombre asignado en el archivo de configuración de al aplicación
     *
     * @var string
     */
    private         $_keyPlugin;

    /**
     * Constructor
     *
     * @param  Array
     * @return void
     */

    public function  __construct( array $options = array() ) {

        $this->_setConfig($options);

    }

    /*
     * routeShutdown() es como el constructor ya que se usa para setear el XML
     * en caso de estar activado el "autoload" y también setea la configuración del INI
     *
     * @param Zend_Controller_Request_Abstract
     * @return void
     */
    public function routeShutdown( Zend_Controller_Request_Abstract $request)
    {

        //@TODO cambiar esto por una funcion que setee todas las opciones
        $bootstrap = Zend_Controller_Front::getInstance()
                            ->getParam('bootstrap');
        if(! empty($bootstrap) ){
            $bootstrapOptions   = $bootstrap->getOptions();
            $this->_keyPlugin          = $this->_getKeyPlugin($bootstrapOptions['resources']['frontController']['plugins']);
            if($this->_keyPlugin){
                if(! empty($bootstrapOptions[$this->_keyPlugin]['config'])){
                    $this->_setConfig($bootstrapOptions[$this->_keyPlugin]['config']);
                }
            }
            //@TODO añadir una excepción
            $this->_parseFilePath();
            $this->_parseXPath();

            if( $this->_config['autoload'] ){
                $this->_loadXmlFile();
                $this->_setXPath();
            }
        }
    }

    /*
     * Setea los daots en la variable _data
     *
     * @param SimpleXMLElement
     * @return void
     */
    public function setData ( SimpleXMLElement $data )
    {
        $this->_data = $data;

        if(!empty ($this->_keyPlugin) ){
            Zend_Controller_Front::getInstance()
                    ->setParam($this->_keyPlugin, $this->_data);
        }
    }

    /*
     * Devueble el XML obtenido
     *
     * @return Cuatroxl_Controller_Plugin_DataPage $_data
     *
     */
    public function getData ()
    {
        return $this->_data;
    }

    /*
     * Configura todas las opiones de la clase
     *
     * @var array
     * @return Cuatroxl_Controller_Plugin_DataPage  Provides a fluent interface
     *
     */
    protected function _setConfig( array $config) {
        foreach ($config as $k => $v){
            if(!empty ($v)){
                $this->_config[$k] = $v;
            }
        }
        return $this;
    }

    /*
     * Carga el archivo XML
     *
     * @var string
     * @return Cuatroxl_Controller_Plugin_DataPage Provides a fluent interface
     *
     */
    protected function _loadXmlFile( string $fileName = NULL ) {
        if( $fileName === NULL ){
            $fileName = $this->_filePath;
        }
        if( file_exists( $fileName ) ){
            $data   = simplexml_load_file( $fileName );
            $this->setData( $data );
        }
        return $this;
    }

    /*
     * Ejecuta una query sobre el XML con xpath y devuelve TRUE o FALSE  según el exito de la consulta
     *
     * @var string
     * @return Boolean
     *
     */
    protected function _setXPath( string $path = NULL ) {
        if( $path === NULL){
            $path = $this->_xpath;
        }

        if( empty($this->_xpath) ){
            return false;
        }

        $data = $this->_data->xpath($this->_xpath);

        if( empty ($data[0]) ){
            return false;
        }else{
            $this->setData( array_shift( $data ) );
            return true;
        }

    }

    /*
     * remplaza los comodines en la ruta al XML y devuelve TRUE o FALSE
     * según el exito de la consulta
     *
     * @return Boolean
     *
     */
    private function _parseFilePath() {

        //@TODO indagar para hacer este proceso con con Zend_Controller_Router_Route
        if(! preg_match_all("/:[^\/\.]+/s", $this->_config['filePath'], $matches) ){
            return false;
        }
        $request        = $this->getRequest();
        $values         = array();
        $matches        = $matches[0];
        foreach($matches as $v){
            $values[] = $request->getParam(substr($v, 1));
        }
        $matches[]          = '/';
        $values[]           = DIRECTORY_SEPARATOR;
        $this->_filePath    = str_replace($matches, $values, $this->_config['basePath'].$this->_config['filePath']);

        return true;
    }

    /*
     * remplaza los comodines en la ruta al nodop por defecto del  XML
     * y devuelve TRUE o FALSE  según el exito de la consulta
     *
     * @return Boolean
     *
     */
    private function _parseXPath() {

        //@TODO indagar para hacer este proceso con con Zend_Controller_Router_Route
        if( empty ($this->_config['xpath']) ){
            return false;
        }
        if(! preg_match_all("/:[\d\w_]+/s", $this->_config['xpath'], $matches) ){
            $this->_xpath = $this->_config['xpath'];
            return true;
        }
        $request        = $this->getRequest();
        $values         = array();
        $matches        = $matches[0];
        foreach($matches as $v){
            $values[] = $request->getParam(substr($v, 1));
        }

        $this->_xpath    = str_replace($matches, $values, $this->_config['xpath']);

        return true;
    }

    /*
     * Devuelve el nombre que se designó en el archivo de configuración
     *
     * @return string o false
     */
    private function _getKeyPlugin(array $config)
    {
        foreach ($config as $k => $v){
            if($v === 'Cuatroxl_Controller_Plugin_DataPage'){
                return $k;
            }
        }
        return false;
    }
}
</pre>
<h1>Modo de uso con Zend_Application</h1>
<p>Configuracion:</p>
<pre class="brush: javascript;">
;definimos la clase, en este caso lo asociamos a "dataPage"
resources.frontController.plugins.dataPage = "Cuatroxl_Controller_Plugin_DataPage"
;le decimos que la carga es automática
dataPage.config.autoload = 1
;la ruta del XML utilizando como comodín el parámetro LANG, nombre del controlador y acción
dataPage.config.filePath = ":lang/:controller/:action.xml"
;el nodo, del XML, por defecto que tiene que cargar; también usando la variable PAGE
dataPage.config.xpath = "pages/page[@id=':page']"
;el directorio raíz de donde están los XML
dataPage.config.basePath = APPLICATION_PATH "/../public/data/"
</pre>
<p>Controller:</p>
<pre class="brush: php;">
public function indexAction()
{
    // El parámetro "dataPage" es el mismo nombre con que vinculamos en el archivo de configuración
    var_dump($this->getFrontController()->getParam('dataPage'));
}
</pre>
<p>pdt: tengo que subirlo a Google Code; por lo que pronto colgaré la dirección con un manual más sencillo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/08/cuatroxl_controller_plugin_datapage-un-plugin-para-cargar-datos-multi-idioma-o-no-con-zf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acceso a variable del config desde Zend_Controller_Plugin con Zend_Application (solucionado)</title>
		<link>http://www.cuatroxl.com/2010/07/acceso-variable-config-desde-zend_controller_plugin-con-zend_application/</link>
		<comments>http://www.cuatroxl.com/2010/07/acceso-variable-config-desde-zend_controller_plugin-con-zend_application/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 13:15:12 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/2010/07/acceso-a-variable-del-config-desde-plugin-con-zend_application/</guid>
		<description><![CDATA[Es la primera vez que uso Zend_Application y ando un poco perdido. Estoy haciendo un plugin ( Zend_Controller_Plugin ) y hay una variable que necesito tener en el archivo de configuración (declarado en Zend_Application). El problema lo tengo a la hora de accedes ésta desde el Plugin. La única posibilidad que he visto es declarar [...]]]></description>
			<content:encoded><![CDATA[<p>Es la primera vez que uso Zend_Application y ando un poco perdido.</p>
<p>Estoy haciendo un plugin ( Zend_Controller_Plugin ) y hay una variable que necesito tener en el archivo de configuración (declarado en Zend_Application). El problema lo tengo a la hora de accedes ésta desde el Plugin.</p>
<p>La única posibilidad que he visto es declarar el config con Zend_Registre desde el Bootstrap; pero para ello estoy obligado a hacerlo cada vez en cada proyecto y me parece un poco &#8220;raro&#8221;:</p>
<pre class="brush: php;">
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initConfig()
    {
        $config = new Zend_Config($this-&gt;getOptions(), true);
        Zend_Registry::set('config', $config);
        return $config;
   }
   ....
</pre>
<p>Otra manera, más fea, es re-declarar el config file desde el plugin; pero estaría en la misma porque tendría que poner la ruta del file.</p>
<p>Alguna idea?</p>
<h2>Update:</h2>
<p>Por fin he encontrado la solución. He podido obtener config del bootstrap a través del controlador; es un poco engorroso pero al final el código es muy cortito:</p>
<pre class="brush: php;">
class myPlugin extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown($request)
    {
        //optenemos la instancia del Zend_Application_Bootstrap
        $bootstrap = Zend_Controller_Front::getInstance()
                                ->getParam('bootstrap');
        //Ahora si que tenemos acceso al archivo de configuración (application.ini)
        $config = $bootstrap->getOptions();
        var_dump($config)
    }
    ....
}
</pre/>

Al final resultó basante sencillo, aunque ahora tengo que averiguar con que nombre se le ha instanciado el plugin y utilizar ese mismo para la configuración; ejemplo:
<pre class="brush: js;">
resources.frontController.plugins.namePlugin = "ClassPlugin"
namePlugin.options.optionA = 1
</pre>
<pre class="brush: js;">
resources.frontController.plugins.otherNamePlugin = "ClassPlugin"
otherNamePlugin.options.optionA = 1
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/07/acceso-variable-config-desde-zend_controller_plugin-con-zend_application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de Magento para el verano</title>
		<link>http://www.cuatroxl.com/2010/07/curso-de-magento-para-el-verano/</link>
		<comments>http://www.cuatroxl.com/2010/07/curso-de-magento-para-el-verano/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 07:10:34 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[enlaces]]></category>
		<category><![CDATA[magento]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=388</guid>
		<description><![CDATA[El equipo de Magento presenta una oferta veraniega para los que quieran aprender a gestionar e incluso &#8220;desarrollar&#8221; sus Tiendas Virtuales con Magento Commerce Link en spañol: Curso de Magento para el verano Oficial de Magento: Magento U &#8211; Summer Webinar Series Gracias a Sergio Guerrero por el enlace.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" src="http://www.magentocommerce.com/img/magento-u/top-banner.png" alt="Curso de magento para el verano" /></p>
<p><a href="http://www.sergioguerrero.es/tiendas-virtuales/curso-magento-verano/comment-page-1"><cite>El equipo de Magento presenta una oferta veraniega para los que quieran aprender a gestionar e incluso &#8220;desarrollar&#8221; sus Tiendas Virtuales con Magento Commerce</cite></a></p>
<p>Link en spañol: <a href="http://www.sergioguerrero.es/tiendas-virtuales/curso-magento-verano/comment-page-1">Curso de Magento para el verano</a><br />
Oficial de Magento: <a href="http://www.magentocommerce.com/summer-webinar-series">Magento U &#8211; Summer Webinar Series</a></p>
<p>Gracias a <a href="http://www.sergioguerrero.es">Sergio Guerrero</a> por el enlace.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/07/curso-de-magento-para-el-verano/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP para Android</title>
		<link>http://www.cuatroxl.com/2010/07/php-para-android/</link>
		<comments>http://www.cuatroxl.com/2010/07/php-para-android/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 08:41:08 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[enlaces]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=375</guid>
		<description><![CDATA[Sí, habéis leído bien. Hay un proyecto que hacer correr código PHP en Android y la verdad que está bastante bien conseguido. Imagino que aún tiene limitaciones pero la idea es bastante buena Aquí tenéis un vídeo de la instalación y unas cuantas pruebas: más info: http://phpforandroid.net/]]></description>
			<content:encoded><![CDATA[<p>Sí, habéis leído bien. Hay un proyecto que hacer correr código PHP en Android y la verdad que está bastante bien conseguido. Imagino que aún tiene limitaciones pero la idea es bastante buena</p>
<p>Aquí tenéis un vídeo de la instalación y unas cuantas pruebas:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="693" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=13177370&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="693" src="http://vimeo.com/moogaloop.swf?clip_id=13177370&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>más info: <a href="http://phpforandroid.net/">http://phpforandroid.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/07/php-para-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Style Php y Js: Uso de comas y puntos</title>
		<link>http://www.cuatroxl.com/2010/06/code-style-php-y-js-uso-de-comas-y-puntos/</link>
		<comments>http://www.cuatroxl.com/2010/06/code-style-php-y-js-uso-de-comas-y-puntos/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 21:27:17 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[code style]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=367</guid>
		<description><![CDATA[Me estaré volviendo paranoico pero tengo un gran dilema a la hora de utilizar comas &#8220;,&#8221; y puntos. Por norma general siempre he utilizado: PHP $arr = array('a'=&#62;'nueva variable', 'b'=&#62;'otra variable más', 'c'=&#62;'la ultima variable' ); $str = $arr['a']. $arr['b']. $arr['c'] Javascript var obj = { paramA:'a', paramB:'b', paramC:'c' }; class. methodA(). methodB(). methodC('.classCss') En [...]]]></description>
			<content:encoded><![CDATA[<p>Me estaré volviendo paranoico pero tengo un gran dilema a la hora de utilizar comas &#8220;,&#8221; y puntos.</p>
<p>Por norma general siempre he utilizado:<br />
PHP</p>
<pre class="brush: php;">$arr = array('a'=&gt;'nueva variable',
           'b'=&gt;'otra variable más',
           'c'=&gt;'la ultima variable'
           );

$str = $arr['a'].
$arr['b'].
$arr['c']
</pre>
<p>Javascript</p>
<pre class="brush: js;">var obj = {
           paramA:'a',
           paramB:'b',
           paramC:'c'
           };

class.
methodA().
methodB().
methodC('.classCss')
</pre>
<p>En principio esto es lo más normal, o por lo menos lo que he solido ver en casi todo los códigos. Mi gran Dilema viene con el Javascript; que en IE si te dejas una coma al final de un objeto &#8220;;}&#8221; te tira un lindo error que no sueles saber de dónde viene.</p>
<p>Para evitar este problema; he decidido hacerlo de la siguiente manera:<br />
PHP</p>
<pre class="brush: php;">$arr = array('a'=&gt;'nueva variable'
           ,'b'=&gt;'otra variable más'
           ,'c'=&gt;'la ultima variable')

$str = $arr['a']
           .$arr['b']
           .$arr['c']
</pre>
<p>Javascript</p>
<pre class="brush: js;">var obj = {
           paramA:'a'
           ,paramB:'b'
           ,paramC:'c'
};

class
.methodA()
.methodB()
.methodC('.classCss')
</pre>
<p>Lo malo de todo este cambio es que ya no soporto ver código con las comas o puntos al final de cada línea.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/06/code-style-php-y-js-uso-de-comas-y-puntos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Errores para no olvidar (I)</title>
		<link>http://www.cuatroxl.com/2010/04/errores-para-no-olvidar-i/</link>
		<comments>http://www.cuatroxl.com/2010/04/errores-para-no-olvidar-i/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 16:09:20 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[errores]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[code igniter]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=347</guid>
		<description><![CDATA[Hace un par de semanas hice un formulario, sencillo y con muy poco tiempo para poder hacerlo.  El caso es que tenía el siguiente requerimiento: existe una lista de usuarios(jefes), a los que se les ha enviado un email con un enlaces a mi form estos usuarios tienen que confirmar su asistencia.( día y turno [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de semanas hice un formulario, sencillo y con muy poco tiempo para poder hacerlo.  El caso es que tenía el siguiente requerimiento:</p>
<ul>
<li>existe una lista de usuarios(jefes), a los que se les ha enviado un email con un enlaces a mi form</li>
<li>estos usuarios tienen que confirmar su asistencia.( día y turno fijo)</li>
<li>estos usuarios pueden invitar a sus empleados; eligiendo día, turno (mañana y tarde) y si van a comer o no. El día es distinto al que van los jefes</li>
</ul>
<pre class="brush: php;">if ( $this-&gt;input-&gt;post('user') == 'new' ){
 $data        = array('boss'=&gt;$dealer-&gt;FairafterfaidealerId
 ,'name'         =&gt;$this-&gt;input-&gt;post('name')
 ,'lastname'     =&gt;$this-&gt;input-&gt;post('lastname')
 ,'email'        =&gt;$this-&gt;input-&gt;post('email'));

 $newDealerId = $this-&gt;Fairafterthefair-&gt;addDealer($data);

 $data        = array('FairafterfaidealerId'=&gt;$newDealerId
 ,'cuisine'  =&gt;$this-&gt;input-&gt;post('cuisine')
 ,'day'      =&gt;'4'
 ,'hours'    =&gt;'a');

 $this-&gt;Fairafterthefair-&gt;confirmAssist($data);

 }else{

 $data = array('FairafterfaidealerId'=&gt;$this-&gt;input-&gt;post('user')
 ,'cuisine'  =&gt;$this-&gt;input-&gt;post('cuisine')
 ,'day'      =&gt;'4'
 ,'hours'    =&gt;'a');
 $this-&gt;Fairafterthefair-&gt;confirmAssist($data);

 }</pre>
<p>El problema; es que les puse el día y hora a los dos iguales; por lo que la base de datos siempre guarda el mismo día y misma fecha.</p>
<pre class="brush: php;">$data        = array('FairafterfaidealerId'=&gt;$newDealerId
 ,'cuisine'  =&gt;$this-&gt;input-&gt;post('cuisine')
 ,'day'      =&gt;'4'
 ,'hours'    =&gt;'a');</pre>
<p>El problema no acaba ahí; iluso de mí ejecute esto, para los invitados:</p>
<pre class="brush: php;">$newDealerId = $this-&gt;Fairafterthefair-&gt;addDealer($data);</pre>
<p>pensando que esa función me devolvería el el ID añadido, pero parece que no. Así que, para que no se me olvido aquí me apunto la url de <a href="http://codeigniter.com/user_guide/database/helpers.html">la documentación de Code Igniter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2010/04/errores-para-no-olvidar-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Application: Guía para empezar</title>
		<link>http://www.cuatroxl.com/2009/08/zend-application-guia-para-empezar/</link>
		<comments>http://www.cuatroxl.com/2009/08/zend-application-guia-para-empezar/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 10:50:19 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[enlaces]]></category>
		<category><![CDATA[zend application]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=273</guid>
		<description><![CDATA[Estoy empezando a investigar sobre Zend Application, creo que debo de ser el único que a estas alturas no lo usa; pero nunca es tarde para empezar. Aquí pongo unos enlaces para comenzar a leer y poder empezar zend application ejemplo zend framework (español) bootstrapping con zend application (Español, muy bien explicado) Set up a [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy empezando a investigar sobre Zend Application, creo que debo de ser el único que a estas alturas no lo usa; pero nunca es tarde para empezar.</p>
<p>Aquí pongo unos enlaces para comenzar a leer y poder empezar</p>
<ul>
<li><a href="http://www.forosdelweb.com/f68/zend-application-ejemplo-zend-framework-1-8-a-709661/">zend application ejemplo zend framework</a> (español)</li>
<li><a href="http://bolsadeideas.cl/zsamer/2009/08/bootstrapping-con-zend-application/">bootstrapping con zend application</a> (Español, muy bien explicado)</li>
<li><a href="http://maff.ailoo.net/2009/04/set-up-a-zend-framework-application-using-zend_application-including-phpunit-setup/">Set up a Zend Framework application using Zend_Application (including PHPUnit setup)</a> (Ingles, para mí el mejor. Tienes un Zip para descargar con la estructura y config ya echo)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2009/08/zend-application-guia-para-empezar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manual de PHP</title>
		<link>http://www.cuatroxl.com/2009/08/manual-de-php/</link>
		<comments>http://www.cuatroxl.com/2009/08/manual-de-php/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 10:43:10 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[enlaces]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[manual]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=271</guid>
		<description><![CDATA[&#8220;This area is intended for everyone new to PHP. It opens with a series of informal, entertaining tutorials written by Vikram Vaswani, founder and CEO of Melonfire. These tutorials build on a previously-published 5-part series which has now been updated and extended to embrace PHP 5, making parts of it suitable for those of you [...]]]></description>
			<content:encoded><![CDATA[<p style="padding-left: 30px;"><em>&#8220;This area is intended for everyone new to PHP. It opens with a series of informal, entertaining tutorials written by Vikram Vaswani, founder and CEO of Melonfire. These tutorials build on a previously-published 5-part series which has now been updated and extended to embrace PHP 5, making parts of it suitable for those of you who already have worked with PHP 4 in the past.</em></p>
<p style="padding-left: 60px;"><em>If you came here to learn about elementary PHP 4 or basic PHP 5, this is for you. Enjoy!&#8221;</em></p>
<p>Enlace: <a href="http://devzone.zend.com/node/view/id/627">http://devzone.zend.com/node/view/id/627</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2009/08/manual-de-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>enlace: &#8220;Paradigma Reflection en PHP&#8221;</title>
		<link>http://www.cuatroxl.com/2009/07/enlace-paradigma-reflection-en-php/</link>
		<comments>http://www.cuatroxl.com/2009/07/enlace-paradigma-reflection-en-php/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 12:24:31 +0000</pubDate>
		<dc:creator>acido69</dc:creator>
				<category><![CDATA[enlaces]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://cuatroxl.com/?p=267</guid>
		<description><![CDATA[&#8220;Supongamos que tienes una clase con unos atributos y unos métodos. Supongamos ahora que desde otra clase necesitas averiguar por cualquier razón qué atributos y métodos tiene esa clase primera. Más aún, supongamos que necesitas saber los parámetros de llamada de cada método.&#8221; Enlace: http://blog.osusnet.com/2009/07/16/paradigma-reflection-en-php/]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;Supongamos que tienes una clase con unos atributos y unos métodos. Supongamos ahora que desde otra clase necesitas averiguar por cualquier razón qué atributos y métodos tiene esa clase primera. Más aún, supongamos que necesitas saber los parámetros de llamada de cada método.&#8221;</em></p>
<p>Enlace: <a href="http://blog.osusnet.com/2009/07/16/paradigma-reflection-en-php/">http://blog.osusnet.com/2009/07/16/paradigma-reflection-en-php/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cuatroxl.com/2009/07/enlace-paradigma-reflection-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

