<?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>Blog InterGraphicDESIGNS</title>
	<atom:link href="http://www.intergraphicdesigns.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.intergraphicdesigns.com/blog</link>
	<description>Blog InterGraphicDESIGNS</description>
	<lastBuildDate>Thu, 06 Sep 2012 16:05:25 +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>Atributos personalizados para HTML5 y Javascript</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/09/06/atributos-personalizados-para-html5-y-javascript/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/09/06/atributos-personalizados-para-html5-y-javascript/#comments</comments>
		<pubDate>Thu, 06 Sep 2012 16:05:25 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[Diseño Web]]></category>
		<category><![CDATA[HTML, XHTML, CSS, Javascript y AJAX]]></category>
		<category><![CDATA[InterGraphicDESIGNS - Últimas Noticias]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1352</guid>
		<description><![CDATA[Con la llegada de HTML5 vinieron muchísimas mejoras, entre ellas, la posibilidad de crear nuestros propios atributos en cada etiqueta HTML. Para el desarrollador y el diseñador web que se preocupa por hacer un código legible, fácil de entender y que cumpla con los estándares de la W3C, esto es un enorme avance. Gracias a [...]]]></description>
			<content:encoded><![CDATA[<p>Con la llegada de HTML5 vinieron muchísimas mejoras, entre ellas, la posibilidad de crear nuestros propios atributos en cada etiqueta HTML. Para el desarrollador y el diseñador web que se preocupa por hacer un código legible, fácil de entender y que cumpla con los estándares de la W3C, esto es un enorme avance.<br />
Gracias a la presión que ejercía la comunidad web, en HMTL5 se incluyó la posibilidad de crear nuestros propios atributos en las etiquetas HTML sin tener que incluir un DTD externo (lo que además no cumpliría con los estándares de la W3C). La importancia de esto radica es que ahora se puede evitar el exceso de clases en las etiquetas, y usar los nuevos atributos para definir estilos o funcionalidades diferentes.</p>
<h2>El Problema</h2>
<p>Antes, si uno no quería verse forzado a utilizar exceso de clases o ids, tenía que crear atributos como:</p>
<pre class="wp-code-highlight prettyprint">
&lt;div id=&quot;myid&quot; class=&quot;myclass&quot;&gt;CONTENT&lt;/div&gt;
</pre>
<p>ó</p>
<pre class="wp-code-highlight prettyprint">
&lt;div id=&quot;myid&quot; class=&quot;myclass myaction&quot;&gt;CONTENT&lt;/div&gt;
</pre>
<p>Sin embargo, esto hacía que la página que se estaba contruyendo no fuera válida ante el W3C, afectando su despliegue en los navegadores y el posicionamiento en buscadores. Además, si la clase &#8220;myaction&#8221; era solamente utilizada para ejecutar acciones javascript, se tornaba confuso buscar la clase entre las definiciones CSS y no encontrarla.</p>
<h2>La Solución</h2>
<p>Ahora podemos definir los atributos de la siguiente forma:</p>
<pre class="wp-code-highlight prettyprint">
&lt;div id=&quot;myid&quot; class=&quot;myclass&quot; data-action=&quot;myaction&quot;&gt;CONTENT&lt;/div&gt;
</pre>
<p>Separando claramente las clases, los identificadores y nuestros atributos personalizados, que siempre serán precedidos por el texto &#8220;data-&#8221;</p>
<h2>El Código</h2>
<p>Pero, ¿Cómo hacemos una llamada a una acción javascript usando atributos personalizados? Simple:</p>
<pre class="wp-code-highlight prettyprint">//usando la librería JQUERY
    $(&quot;[data-action='myaction']&quot;).click(function(){
        return confirm('¿Está seguro?');
    });</pre>
<p>Los desarrolladores y diseñadores web deben incluir los atributos personalizados entre sus mejores prácticas. Es simple y sencillo, pero tremendamente funcional para hacer sitios web más estándar, que sean más fáciles de mantener y actualizar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/09/06/atributos-personalizados-para-html5-y-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consultas &#8220;tipo CakePHP&#8221; en CodeIgniter</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/09/04/consultas-tipo-cakephp-en-codeigniter/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/09/04/consultas-tipo-cakephp-en-codeigniter/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 14:05:50 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[PHP y MySQL]]></category>
		<category><![CDATA[Programación Web]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1357</guid>
		<description><![CDATA[Una de las mayores facilidades con la que cuenta CakePHP es la forma en que maneja los modelos y las búsquedas en ellos. En este artículo vamos a tomar el núcleo de los modelos de CakePHP para aplicarlo a CodeIgniter y así obtener búsquedas más sencillas en este último framework. Los Modelos de CakePHP El [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las mayores facilidades con la que cuenta CakePHP es la forma en que maneja los modelos y las búsquedas en ellos. En este artículo vamos a tomar el núcleo de los modelos de CakePHP para aplicarlo a CodeIgniter y así obtener búsquedas más sencillas en este último framework.</p>
<p><strong>Los Modelos de CakePHP</strong></p>
<p>El concepto de CakePHP es simple: Los módelos no son archivos de funciones que consultan la base de datos si no que son mapas de datos, clases que contienen arreglos cuya estructura es una abstracción de los campos, restricciones y relaciones de las tablas en la base de datos.</p>
<p>Todos los modelos heredan el método <em>find</em> de la clase Model de CakePHP. El find es una función super poderosa que permite hacer casi cualquier consulta a la base de datos solamente variando los parámetros que se envían. Acá está la magia. El find de CakePHP evita tener que hacer una función distinta en el modelo para cada consulta que vayamos a hacer sobre cada tabla de la base de datos, y eso nos puede ahorrar muchísimo tiempo de desarrollo.</p>
<p><strong>Traduciendo a CodeIgniter</strong></p>
<p>En CodeIgniter (CI, para abreviar), los modelos son simples clases que deberían tener las funciones que realizarán consultas directas a la base de datos. Estas clases extienden a la librería CI_Model del núcleo de CI. Así, si tenemos una tabla <em>usuarios</em> y otra tabla <em>publicaciones</em> y queremos una consulta que nos traiga todos los elementos de cada tabla, tendríamos que crear la misma función en dos archivos diferentes, en dos modelos diferentes, con la única diferencia de la tabla a la cual consultan.</p>
<p>Podemos evitar esto usando Mapeo de Datos. Solamente tenemos que modificar la clase CI_Model del núcleo de CI para agregarle funciones que mediante parámentros reciban toda la información y puedan actuar sobre las distintas tablas de la base de datos. </p>
<p>Sin embargo, es cierto que modificar el núcelo de un framework (y en general de cualquier sistema que no hayamos creado) nunca es una buena idea. Afortunadamente, CI permite crear extensiones o reemplazar del todo sus librerías del núcleo de una forma sencilla: Si queremos extender la librería del núcleo CI_Model simplemente se coloca en la carpeta <em>application/core</em> un archivo llamado MY_Model (el prefijo MY_ es configurable). Este archivo debe contener una clase que extienda a CI_Model y ahí podemos agregar nuestras funciones.</p>
<pre class="wp-code-highlight prettyprint">
&lt;?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

class KAPS_Model extends CI_Model
{
    private $_table_prefix;

    function __construct()
    {
        $this-&gt;_table_prefix = 'my_table_prefix_';
        //IMPORTANT: runs the constructor of the CI_Model class
        parent::__construct();
    }

    /**
     *
     * create a query to de database and return it's results
     * @param String $type [all|first|count|list]
     * @param Array $params array([conditions|fields|order|limit|join])
     * @return Object or Array
     */
    function find($type,$params=array())
    {
        //result of the query
        $result = FALSE;

        //set the name of the table where the query will run
        $this-&gt;db-&gt;from($this-&gt;_table_prefix.$this-&gt;table);

        //creates the where clause if $params['conditions'] is defined
        if(isset($params['conditions']))
        {
            //where options =&gt; array('name !=' =&gt; $name, 'id &lt;' =&gt; $id, 'date &gt;' =&gt; $date, 'field'=&gt;$value);
            $this-&gt;db-&gt;where($params['conditions']);
        }

        //creates the join clause if $params['join'] is defined
        if(isset($params['join']))
        {
            foreach($params['join']['clause'] as $join_table =&gt; $join_conditions)
            {
                if(isset($params['join']['type']))
                    $this-&gt;db-&gt;join($join_table, $join_conditions, $params['join']['type']);
                else
                    $this-&gt;db-&gt;join($join_table, $join_conditions);
            }
        }

        //creates the fields clause if $params['fields'] is defined
        if(isset($params['fields']))
        {
            $this-&gt;db-&gt;select($params['fields']);
        }

        //creates the order clause if $params['order'] is defined
        if(isset($params['order']))
        {
            foreach($params['order'] as $field =&gt; $sort)
            {
                $this-&gt;db-&gt;order_by($field,$sort);
            }
        }

        //creates the group clause if $params['group'] is defined
        if(isset($params['group']))
        {
            $this-&gt;db-&gt;group_by($params['group']);
        }

        if($type=='count')
            $result = $this-&gt;db-&gt;count_all_results();
        else
        {
            //creates the limit clause if $params['limit'] is defined and type!=first
            if($type=='first')
                $this-&gt;db-&gt;limit(1);
            else if(isset($params['limit']) &amp;&amp; !empty($params['limit']))
            {
                if(is_array($params['limit']))
                {
                    $cnt_params = count($params['limit']);

                    if($cnt_params)
                    {
                        if($cnt_params==1)
                            $this-&gt;db-&gt;limit($params['limit'][0]);
                        else
                            $this-&gt;db-&gt;limit($params['limit'][0],$params['limit'][1]);
                    }
                }
                else
                    $this-&gt;db-&gt;limit($params['limit']);
            }

            $query = $this-&gt;db-&gt;get();

            switch($type)
            {
                case 'list':
                {
                    $result = array();
                    //return the result in array format
                    $tmp_result = $query-&gt;result_array();
                    $keys = array_values($params['fields']);

                    foreach($tmp_result as $tmp)
                    {
                        $result[$tmp[$keys[0]]] = $tmp[$keys[1]];
                    }
                    break;
                }
                case 'first':
                {
                    //return just the first result in object format
                    $result = $query-&gt;row();
                    break;
                }
                default:
                {
                    //return the results in object format
                    $result = $query-&gt;result();
                }
            }
        }

        return $result;
    }

    /**
     *
     * saves or updates a record in the database
     * @param Array $params fields to be saved
     * @return Int the id of the modified record in the database if success, FALSE otherwise
     */
    function save($params)
    {
        $already_exists = FALSE;

        if(count($params))
        {
            if(isset($params['id']))
            {
                //check if the record already exists in the database
                $found_record = $this-&gt;find('count', array('conditions'=&gt;array('id'=&gt;$params['id'])));
                if($found_record)
                    $already_exists = TRUE;
            }

            //set the fields to save
            $this-&gt;db-&gt;set($params);

            //if the record already exists, just do an update, otherwise, do an insert
            if($already_exists)
            {
                $this-&gt;db-&gt;where('id',$params['id']);
                if($this-&gt;db-&gt;update($this-&gt;_table_prefix.$this-&gt;table))
                    return $params['id'];
                else
                    return FALSE;
            }
            else
            {
                $this-&gt;db-&gt;insert($this-&gt;_table_prefix.$this-&gt;table); 

                if($this-&gt;db-&gt;affected_rows())
                {
                    //make a query to find the id of the newly inserted record
                    $new_record_id = $this-&gt;find('first',array('fields'=&gt;array('id'),'order'=&gt;array('id'=&gt;'DESC')));
                    return $new_record_id-&gt;id;
                }
                else
                    return FALSE;
            }

        }

        return FALSE;
    }

    /**
     *
     * deletes records in the database
     * @param Array $params conditions to match the record(s) that will be deleted
     * @return INT the number of deleted rows if success, FALSE otherwise
     */
    function delete($params)
    {
        if($this-&gt;db-&gt;delete($this-&gt;_table_prefix.$this-&gt;table, $params))
            return $this-&gt;db-&gt;affected_rows();
        else
            return FALSE;

    }
}
?&gt;
</pre>
<p>De este modo, el modelo de usuarios sería construido así:</p>
<pre class="wp-code-highlight prettyprint">
&lt;?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * User Model
 *
 * @package		CodeIgniter
 * @author		Daniel Obando
 * @subpackage	Models
 * @category	Models
 * @copyright  Copyright (c) 2012, IGD.
 * @version 1.0
 *
 */

class User_model extends MY_Model
{
    public $table;

    function __construct()
    {
        parent::__construct();
        //IMPORTANT: Tells MY_Model which table are we going to query
        $this-&gt;table = 'user';
    }

}
?&gt;
</pre>
<p>Así de sencillo. Ahora, si desde un controlador queremos hacer una consulta, lo hacemos en la forma CakePHP:</p>
<pre class="wp-code-highlight prettyprint">
//load the model
$this-&gt;load-&gt;model('User_model','User');

//run a query to find all the users in the table
$users = $this-&gt;User-&gt;find('all',array(
     'conditions'=&gt;array(
         'is_active'=&gt;1
      ),
      'limit'=&gt;10,
      'order'=&gt;array(
         'name'=&gt;'DESC'
      )
));
</pre>
<p>Y esta misma función <em>find</em> estará disponible para cada modelo que creemos. Similarmente, con la nueva librería también tendremos disponibles funciones para eliminar o salvar nuevos registros en la base de datos.</p>
<pre class="wp-code-highlight prettyprint">
//save a record in the database
$user_id = $this-&gt;User-&gt;save(array('name'=&gt;'User1','is_active'=&gt;0));

//update a record in the database using the same SAVE function
$this-&gt;User-&gt;save(array('id'=&gt;$user_id, 'name'=&gt;'User2'));

//delete a record, accept an array with all the params to match with the record to delete
$this-&gt;User-&gt;delete(array('id'=&gt;$user_id));
</pre>
<p>Para más información, puede consultar la <a href="http://book.cakephp.org/2.0/en/models/retrieving-your-data.html" title="CakePHP Find" target="_blank">guía de consultas de CakePHP</a> y el <a href="http://codeigniter.com/user_guide/general/core_classes.html" title="Creating Core System Libraries" target="_blank">manual de CodeIgniter sobre extenciones a las librerías del núcleo</a>.</p>
<p><strong>¿Y si vamos aún más lejos?</strong></p>
<p>Sí, sería perfectamente posible también copiar la estructura de modelos que tiene CakePHP en CodeIgniter. Para ello, recomendamos la librería <a href="http://codeigniter.com/forums/viewthread/90181/" title="DataMapper">DataMapper</a>. En palabras del autor:</p>
<blockquote><p>El DataMapper es un Mapeador Relacional de Objetos escrito en PHP para CodeIgniter. Está diseñado para mapear sus tablas de base de datos a objetos fáciles de trabajar, encargándose por completo de las relaciones entre cada uno de ellos.
</p></blockquote>
<p>Este es solo un ejemplo de como se pueden tomar algunas buenas ideas y unirlas para crear algo poderoso. Es importante estar pendiente de las genialidades que aparecen todos los días en el mundo web, de modo que podamos empezar un proceso de investigación y pruebas para finalmente implementarlas en nuestros proyectos y obtener los másximos réditos de ellas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/09/04/consultas-tipo-cakephp-en-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Está muerto Flash?</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/07/05/%c2%bfesta-muerto-flash/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/07/05/%c2%bfesta-muerto-flash/#comments</comments>
		<pubDate>Thu, 05 Jul 2012 20:55:51 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[Diseño Web]]></category>
		<category><![CDATA[HTML, XHTML, CSS, Javascript y AJAX]]></category>
		<category><![CDATA[Programación Web]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1336</guid>
		<description><![CDATA[Para no darle muchas vueltas: No. Flash no está muerto. Quienes hacen esta afirmación deben tener cuidado de no encasillar al formato SWF como un objeto cuyo uso exclusivo es la web. Flash tiene muchas más aplicaciones que hacer precargadores bonitos o banners en un sitio web. No obstante es entendible el por qué de [...]]]></description>
			<content:encoded><![CDATA[<p>Para no darle muchas vueltas: No. Flash no está muerto. Quienes hacen esta afirmación deben tener cuidado de no encasillar al formato SWF como un objeto cuyo uso exclusivo es la web. Flash tiene muchas más aplicaciones que hacer precargadores bonitos o banners en un sitio web.</p>
<p>No obstante es entendible el por qué de que algunos piensen que el formato dejará de ser usado. Las películas SWF históricamente han tenido una debilidad cuando se trata de SEO. Los crawlers que andan recorriendo la red no pueden acceder al contenido de los archivos SWF y por tanto no pueden ser indexados ni contribuir al posicionamiento de una página web.</p>
<p>A esto se suma el hecho de que librerías Javascript como JQuery han avanzado significativamente en sus opciones de animación. No tiene sentido, por ejemplo, hacer una galería de imágenes con Flash si se puede hacer lo mismo con javascript, obteniendo el plus de que toda la galería es indexable para un buscador.</p>
<p>Finalmente, HTML5. Con la llegada de HTML5 es posible realizar animaciones complejas utilizando simplemente Javascript y CSS3. Nuevamente, por ser HTML5/CSS3 código puro, legible para un crawler, se gana en SEO y también en el hecho de que las animaciones son significativamente más livianas que las ejecutadas en un SWF. Incluso Google lanzó <a title="Swiffy - Convertidor de SWF a HTML5" href="https://www.google.com/doubleclick/studio/swiffy/" target="_blank">Swiffy</a>,  la versión beta de un convertidor de animaciones SWF sencillas a HTML5.</p>
<p>Sí, el panorama no es alentador para Flash. Sin embargo, como dijimos al principio, sería un error pensar que Flash es un formato exclusivo del web.</p>
<p><a title="Realidad Aumentada en Flash" href="http://www.adobe.com/devnet/flash/articles/augmented_reality.html" target="_blank"> Realidad aumentada</a>: suena interesante y se ve aún mejor. Flash siempre ha permitido la generación de animaciones, presentaciones y programas que se pueden distribuir en discos o que se pueden instalar, como las aplicaciones AIR que son geniales para crear widgets de escritorio. Sin embargo recientemente, con el auge del desarrollo de juegos interactivos y sobre todo de tecnologías como el <a title="Kinect" href="http://www.xbox.com/en-US/kinect/">Kinect</a> donde la persona puede usar todo su cuerpo para jugar, Flash ha tomado una relevancia especial.</p>
<p>La facilidad con la que Flash permite la captura y manipulación de video, aunado a la sencillez con la que se generan las animaciones, ha hecho de este uno de los formatos indispensables del Kinect. Muchos de los juegos Kinect muestran en tiempo real a la persona y utilizan animaciones Flash para mostrar los objetivos del juego: conejos que hay que aplastar, formas que hay que lograr con el cuerpo, obstáculos que se aproximan, meteoritos y cualquier cosa que se pueda imaginar. Este es un ejemplo sencillo de un juego hecho con Flash, que ahora provee componentes especializados en estos desarrollos, como <a title="Stage 3D" href="http://www.adobe.com/devnet/flashplayer/stage3d.html" target="_blank">Stage3D</a></p>
<p><object width="560" height="315" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" 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://www.youtube.com/v/6-XE9tT06xc?version=3&amp;hl=en_US" /><param name="allowfullscreen" value="true" /><embed width="560" height="315" type="application/x-shockwave-flash" src="http://www.youtube.com/v/6-XE9tT06xc?version=3&amp;hl=en_US" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<p>Pero la web no se escapa de los juegos con Flash. Se están desarrollando muchas inciativas de realidad aumentada en la web, mediante la cual los usuarios utilizan sus webcams para interactuar con las aplicaciones Flash. Veamos algunos ejemplos:</p>
<p><object width="380" height="285"><param name="movie" value="http://www.youtube-nocookie.com/v/YS9mciQdQPc?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/YS9mciQdQPc?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="380" height="285" allowscriptaccess="always" allowfullscreen="true"></embed></object><object width="380" height="214"><param name="movie" value="http://www.youtube-nocookie.com/v/6-XE9tT06xc?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/6-XE9tT06xc?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="380" height="214" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Aquí hay un <a title="Webcam en Flash" href="http://www.youtube.com/watch?v=CKvV_gSSi-M&amp;feature=related" target="_blank">pequeño tutorial</a> sobre como realizar animaciones utilizando el webcam en Flash.</p>
<p>Hay dos consideraciones más que hacer sobre Flash. La primera es la compatibilidad. Es importante reconocer que lo reciente de la salida de HTML5 hace que aún existan funcionalidades que no son completamente soportadas por todos los navegadores. Flash, al ser un formato embebido en sí mismo, no tiene este problema.</p>
<p>A esto se suma el eterno problema de los desarrolladores y diseñadores web: las cosas se ven diferentes dependiendo del navegador. Se ha demostrado que hacer que los estilos de un sitio web se reflejen exactamente iguales en distintos navegadores consume hasta un 30% de tiempo extra en el desarrollo de un proyecto web. Imagine cuánto tiempo más requerirá una animación compleja para que se vea y se ejecute de la misma manera en todos los navegadores.</p>
<p>La segunda consideración está relacionada a esta: el tiempo de desarrollo de una animación compleja es comparativamente más alto si no se utiliza Flash, ya que en el ambiente Flash se trata básicamente de arrastrar objetos, asignarles su animación o código y determinar la cantidad de frames en que se desplegará. Para hacer una animación en HTML5/CSS3 es necesario hacer mucho desde cero, como el control del tiempo y las repeticiones, de las cuales Flash se encarga automáticamente.</p>
<p>Finalmente tenemos que decir que Adobe no se ha quedado de brazos cruzados viendo el surgimiento de HTML5 como una amenaza, si no mas bien como una oportunidad. Se sabe que en Adobe se está trabajando para que Flash pueda <a title="Adobe - Exportando Animaciones a HTML5" href="http://tv.adobe.com/watch/adobe-technology-sneaks-2012/export-to-html5-from-flash-professional/" target="_blank">exportar sus animaciones a HTML5</a>, lo que promete ser el siguiente gran paso de Flash. Para esto se está desarrollando una nueva aplicación Adobe llamada <a title="Wallaby" href="http://blogs.adobe.com/conversations/2011/03/flash-to-html5-conversion-tool-on-adobe-labs.html" target="_blank">Wallaby</a>.</p>
<p>Sin duda que debemos seguir teniendo en cuenta a Flash cuando hablemos de web y estar atentos ya que algunas de estas iniciativas pueden convertirse en el siguiente gran paso de la comunidad web.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/07/05/%c2%bfesta-muerto-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax: Lo que no se debe hacer</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/06/27/ajax-lo-que-no-se-debe-hacer/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/06/27/ajax-lo-que-no-se-debe-hacer/#comments</comments>
		<pubDate>Wed, 27 Jun 2012 22:27:32 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[HTML, XHTML, CSS, Javascript y AJAX]]></category>
		<category><![CDATA[Programación Web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1316</guid>
		<description><![CDATA[Para cualquier desarrollador web es vital conocer AJAX. AJAX (Asynchronous JavaScript And XML) es una técnica de programación utilizando Javascript, la cuál permite consultar y mostrar contenidos desde un repositorio sin tener que recargar la página en la que el usuario se encuentra. El repositorio  puede ser cualquier elemento que permita almacenar datos para un [...]]]></description>
			<content:encoded><![CDATA[<p>Para cualquier desarrollador web es vital conocer AJAX. AJAX (Asynchronous JavaScript And XML) es una técnica de programación utilizando Javascript, la cuál permite consultar y mostrar contenidos desde un repositorio sin tener que recargar la página en la que el usuario se encuentra. El repositorio  puede ser cualquier elemento que permita almacenar datos para un sitio web: una base de datos, un archivo XML, un servicio web, otra página web, etc.</p>
<p>Bien utilizado, puede ser de inmensa utilidad para mejorar la usabilidad de un sitio web. Por ejemplo, se puede reducir significativamente el tiempo de espera para el usuario si, en lugar de utilizar links comunes para mostrar el contenido de una nueva sección del sitio, se utiliza AJAX para solamente cargar el contenido requerido. Sin embargo, hacer un uso equivocado de esta técnica puede dar al traste con el mejor de los sitios web. Veamos qué cosas no se deberían hacer al implementar AJAX en un sitio web:</p>
<h2>1. No usar indicadores de carga</h2>
<p>Al utilizar AJAX en un sitio web es necesario indicarle al usuario que algo está sucendiendo luego de que se haya desencadenado un evento de este tipo. Esto sucede muy frecuentemente, el usuario da click a un enlace, la sección en donde se cargará el contenido se pone en blanco, pero nada parece suceder. Lo que el usuario no sabe es que hay un evento AJAX publicando información. Para esto se debe colocar un texto o alguna imagen, normalmente un gif animado que sea claro para el usuario. En <a title="Generador de Cargadores" href="http://preloaders.net/" target="_blank">este sitio web</a> es posible generar fácilmente una imagen que indique que se está desarrollando una carga vía AJAX.</p>
<h2>2. Cargar más datos de los requeridos</h2>
<p>Muy relacionado con el punto anterior: muchas veces los desarrolladores no colocan un indicador de carga debido a que los datos que se están consultando son &#8220;muy pocos&#8221;. Sin embargo muchas veces no se toma en cuenta la escalabilidad que debe tener todo sitio web: hay que preveer que la información que maneja el sitio puede crecer.  De esta forma, el sitio crece y cuando el usuario ejecuta la acción de carga AJAX el tiempo de espera se incrementa, resultando en que el usuario crea que el sitio no funcionay que posiblemente abandone.</p>
<p>Es muy dado que se utilice AJAX para mostrar o actualizar campos de un formulario o contenidos dentro de una etiqueta <em>table</em> o <em>div</em>. Un problema común es que el desarrollador opta por volver a cargar todo el contenido, como por ejemplo cargar un campo <em>select</em> completo, incluso con los tags <em>option</em>, en lugar de traer únicamente los valores del campo. Esto es peor cuando se carga un tabla completa en vez de cargar solamente los valores que han cambiado de sus celdas. Para evitar esto, y siempre pensando en la escalabilidad, se puede utilizar el formato <a title="JSON" href="http://www.json.org/">JSON</a> (Javascript Object Notation), que permite obtener los datos en el formato INDICE =&gt; VALOR</p>
<h2>3. Uso excesivo de AJAX</h2>
<p>No se debe utilizar AJAX para todo en el sitio web. Es necesario hacer un balance y usarlo solamente donde signifique una ganacia para el usuario. Mucho AJAX puede confundir al usuario y hacer el sitio difícil de navegar. Muchas veces se intentan hacer galerías de imágenes utilizando AJAX de modo que cada imagen se cargue por demanda en vez de cargarlas de una vez al abrir la página. Pero, si la galería es muy grande o las imágenes son pesadas, se volverá tedioso para el usuario tener que esperar por cada imagen. Para este caso es mejor pensar en utilizar caché, paginación y hacer una carga secuencial de las imágenes escondiendo las que no están en primer plano mientras cargan.</p>
<h2>4. Reemplazar URLs</h2>
<p>Muchas veces se opta por hacer que todos los contenidos de una sección del sitio sean cargados por AJAX de modo que el usuario no tenga que estar cambiando de página para ver todos los contenidos. El problema de esto es que cada contenido pierde su url. Es decir, no hay forma de que el usuario ingrese directamente al tercer contenido por una url, si no que debe ingresar a la url principal y ejecutar cuantas cargas AJAX sean necesarias para llegar al contenido deseado. La importancia de mantener una url para los contenidos es que esto permite que los contenidos sean compartidos, y en esta época de redes sociales esto es vital.</p>
<h2>5. Transmisiones inseguras</h2>
<p>Al hacer una consulta AJAX se envían una serie de parámetros a un código que los recibirá, los procesará y enviará una respuesta. Es necesario que se mantenga la cantidad de parámetros en el mínimo indispensable para evitar urls de conexión muy largas que hagan el código dificil de mantener o propenso a bloqueos desde el servidor. Además, se debe preprocesar cada parametro de modo que se asegure que no se están enviando carácteres extraños que puedan dar al traste con la consulta y validando que no hayan ataques como XSS. En lo posible no se debe enviar texto como parámetro y siempre utilizar POST.</p>
<p>Igualmente, la respuesta desde el script que será ejecutado debe ser preprocesada de modo que no se envíen carácteres extraños que rompan la comunicación. En este punto vuelve a cobrar importancia lo que discutimos en el punto 2, utilizar JSON y retornar solamente la información que sea absolutamente indispensable.</p>
<h2>6. No manejar excepciones</h2>
<p>Es posible que los datos que se carguen por AJAX vengan de un servidor externo. Siempre es necesario establecer un tiempo límite de carga para las consultas AJAX, y en caso de que  no exista respuesta del servidor, mostrarle un mensaje al usuario que le indique que ocurrió un problema al cargar y que lo intente de nuevo. Sería deseable que algún tipo de alerta se genere al administrador del sitio.</p>
<p>Ajax puede ser un increíble aliado para crear sitios web  sorprendentes. Por ello, es necesario tomar las previsiones durante su desarrollo de modo que no se afecte la usabilidad ni la experiencia del usuario.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/06/27/ajax-lo-que-no-se-debe-hacer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Single Sign On: Un solo login, múltiples accesos</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/06/15/single-sign-on-un-solo-login-multiples-accesos/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/06/15/single-sign-on-un-solo-login-multiples-accesos/#comments</comments>
		<pubDate>Fri, 15 Jun 2012 17:18:16 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[InterGraphicDESIGNS - Últimas Noticias]]></category>
		<category><![CDATA[Programación Web]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[Single Sign On]]></category>
		<category><![CDATA[SSO]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1288</guid>
		<description><![CDATA[El Single Sign On, conocido por sus siglas en inglés como SSO, es una arquitectura de sistemas que le permite al usuario acceder a diferentes aplicaciones con una sola validación de acceso. ¿Cómo se puede lograr esto en un sitio web? ¿Existe algún riesgo? Esta técnica se ha popularizado con el auge de las redes sociales, [...]]]></description>
			<content:encoded><![CDATA[<p>El Single Sign On, conocido por sus siglas en inglés como SSO, es una arquitectura de sistemas que le permite al usuario acceder a diferentes aplicaciones con una sola validación de acceso. ¿Cómo se puede lograr esto en un sitio web? ¿Existe algún riesgo?</p>
<p>Esta técnica se ha popularizado con el auge de las redes sociales, las aplicaciones web y la computación en la nube. Grandes compañías han querido simplificar la vida de sus usuarios permitiéndoles tener acceso a sus distintos productos con una misma cuenta. Puede entenderse el Facebook Connect como un tipo de SSO, sin embargo un ejemplo más claro sería Google Apps.</p>
<p><a href="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/05/google1.png"><img style="float: right;" title="Google Apps" src="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/05/google1.png" alt="Google Apps" width="205" height="153" /></a>Con una sola cuenta, usted puede acceder a Gmail (gmail.com), Google Calendar (google.com/calendar), Google Maps (maps.google.com), Google Play (play.google.com), Youtube (youtube.com),  Google News (news.google.com), Google Docs (docs.google.com), etc&#8230; Como vemos, tenemos acceso a todos estos incluso a pesar de que algunos de estos sitios están ubicados en subdominios de google.com, otros son dominios completamente aparte y posiblemente estén distribuidos en múltiples servidores.</p>
<p>Hay diferentes aproximaciones para implementar un SSO, dependiendo del ambiente en el que se requiera. Es diferente hacer un SSO para dos sitios que están en el mismo servidor que para sitios que estén en distintos servidores o que tengan distintos dominios. A continuación analizamos diferentes escenarios en los que el SSO puede ser necesario.</p>
<p><strong>SSO en el mismo servidor</strong></p>
<p>La base del SSO es lograr compartir la información que identifica a cada usuario en la sesión. Si los sitios están en el mismo servidor y comparten el mismo dominio (es decir, existe un dominio principal abc.com y varios subdomios xyz.abc.com o def.abc.com) lo que debe hacerse es configurar las siguientes directivas:</p>
<ul>
<li>Debe modificarse el dominio de las cookies de modo que cada cookie sea creado con el dominio <em>.abc.com</em>.</li>
<li>Debe asegurarse que todas las cookies se almacenen en el mismo lugar del servidor.</li>
<li>El nombre de la sesión debe ser el mismo en todos los sitios.</li>
</ul>
<p>Es posible que se tengan que desactivar algunas directivas de seguridad como el <em><a title="Session Referer Check" href="http://www.php.net/manual/en/session.configuration.php#ini.session.referer-check" target="_blank">session referer check</a></em>, que verifica que los cookies hayan sido creados en el mismo sitio. Por ello, es importante que el sitio tome en cuenta otras validaciones de seguridad como las que repasamos en <a title="6 tips para mejorar la seguridad de tus formularios web" href="http://www.intergraphicdesigns.com/blog/2012/04/28/6-tips-para-mejorar-la-seguridad-de-tus-formularios-web/" target="_blank">este post</a>.</p>
<p><strong>SSO entre distintos servidores</strong></p>
<p>El problema al intentar establecer una arquitectura SSO en servidores distintos es, por supuesto, que las Cookies no pueden almacenarse en la misma ubicación y por tanto, no pueden ser leídas por los sitios. Lo que necesitamos, entonces, es crear un espacio compartido en donde puedan alamcenarse estas Cookies. Para ello podemos usar <a title="Memcached" href="http://memcached.org/" target="_blank">Memcached</a>.</p>
<p>Lo que hacemos es instalar Memcached en ambos servidores.</p>
<pre class="wp-code-highlight prettyprint">apt-get install memcached //si estamos utilizando php podemos usar php5-memcache</pre>
<p>Ambos servidores deben configurarse, de modo que ambos almacenen las cookies de la sesión en Memcached. Memcached tiene un manejador de sesiones que facilita esta tarea. Por ejemplo, en PHP tendríamos que configurar el archivo php.ini para indicarle que utilice el manejador de sesiones de Memcached. Sólo uno de los servidores proveerá el servicio de almacenaje de las cookies de la sesión, los otros servidores se comunicarán con este para alamcenar sus sesiones. En el caso del servidor donde se almacenarán las sesiones usaremos algo como:</p>
<pre class="wp-code-highlight prettyprint">session.save_handler = memcache
session.save_path=&quot;tcp://127.0.0.1:port?persistent=1&amp;amp;amp;weight=1&amp;amp;amp;timeout=1&amp;amp;amp;retry_interval=15&quot;</pre>
<p>y para el cliente</p>
<pre class="wp-code-highlight prettyprint">session.save_handler = memcache
session.save_path=&quot;tcp://IP_DEL_SERVIDOR:port?persistent=1&amp;amp;amp;weight=1&amp;amp;amp;timeout=1&amp;amp;amp;retry_interval=15&quot;</pre>
<p>y listo! Normalmente, se utiliza el puerto 11211 por convención, pero se puede utilizar cualquier otro puerto disponible.La única salvedad es verificar que el puerto esté abierto y que se permita el acceso a los demás servidores, sobre todo si hay firewalls de por medio.<br />
<strong>SSO entre distintos dominios</strong></p>
<p>Si los sitios tienen distintos dominios, lo mejor es guardar las sesiones en bases de datos, de modo que cada sitio tome la información de los usuarios registrados desde allí. Claro que hay que tomar en cuenta que el costo de traer información desde una base de datos es mayor que el de obtenerla desde la memoria o el disco, como en el caso de las cookies. Hay que analizar el impacto que tendrá en el rendimiento del sitio y buscar métodos de caché de sesiones en caso de optar por el uso de bases de datos. En este apartado, Memcached también puede servir.</p>
<p>Tanto la configuración de cookies como guardar las sesiones en bases de datos permiten no solo guardar la información de los usuarios registrados, si no cualquier otra información que se almacene en la sesión. Sin embargo, cuando el requerimiento del SSO es solo para el registro de usuarios, es posible que, si se está trabajando sobre una plataforma Windows, se realice el registro de usuarios con el Active Directory. También es posible utilizar un servicio externo de registro de sesiones como <a title="OpenID" href="http://openid.net" target="_blank">OpenID</a>.</p>
<p>En futuros posts analizaremos en detalle como implementar esta técnica utilizando CakePHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/06/15/single-sign-on-un-solo-login-multiples-accesos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rápido y completo: Expresiones Regulares en PHP</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/06/05/rapido-y-completo-expresiones-regulares-en-php/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/06/05/rapido-y-completo-expresiones-regulares-en-php/#comments</comments>
		<pubDate>Tue, 05 Jun 2012 17:42:55 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[PHP y MySQL]]></category>
		<category><![CDATA[Programación Web]]></category>
		<category><![CDATA[expresiones regulares]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[preg_match]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1268</guid>
		<description><![CDATA[Las expresiones regulares en PHP son una potente herramienta de programación que muchas veces se deja de lado ya que se cree que es muy compleja (aunque sí lo puede ser). En este post explicamos de manera sencilla cómo utilizar las expresiones regulares en PHP y brindamos soluciones a ejercicios cotidianos de programación utilizando expresiones [...]]]></description>
			<content:encoded><![CDATA[<p>Las expresiones regulares en PHP son una potente herramienta de programación que muchas veces se deja de lado ya que se cree que es muy compleja (aunque sí lo puede ser). En este post explicamos de manera sencilla cómo utilizar las expresiones regulares en PHP y brindamos soluciones a ejercicios cotidianos de programación utilizando expresiones regulares. También puede servir como un pequeño recordatorio.</p>
<p>La única salvedad que debemos hacer es que se debe considerar muy bien cuando usar una expresión regular, y no usarlas en exceso. Esto ya que el procesamiento de una expresión regular es considerablemente más costoso que una simple búsqueda de strings (utilizando strstr por ejemplo).</p>
<p>La idea, entonces, de una expresion regular es crear un string especial para hacer una búsqueda en otro string. Si nuestra expresión regular encaja (hace &#8220;match&#8221;) en el string, la operación es exitosa. Exsite algunos caracteres que tienen un significado especial en una expresión regular:</p>
<p><strong>Metacaracteres</strong></p>
<table>
<tbody>
<tr>
<td>.</td>
<td>Match con cualquier caracter</td>
</tr>
<tr>
<td>^</td>
<td>Match al principio del string</td>
</tr>
<tr>
<td>$</td>
<td>Match al final del string</td>
</tr>
<tr>
<td>\s</td>
<td>Match con cualquier espacio en blanco</td>
</tr>
<tr>
<td>\d</td>
<td>Match con cualquier dígito</td>
</tr>
<tr>
<td>\D</td>
<td>Match con cualquier caracter que no sea un dígito</td>
</tr>
<tr>
<td>\w</td>
<td>Match con cualquier caracter que pueda ser parte de una palabra (letra, número, guión bajo)</td>
</tr>
<tr>
<td>\W</td>
<td>Match con cualquier caracter que NO pueda ser parte de una palabra (letra, número, guión bajo)</td>
</tr>
<tr>
<td>\A</td>
<td>Inicio de un string.</td>
</tr>
<tr>
<td>\z</td>
<td>Final de un string.</td>
</tr>
</tbody>
</table>
<p><strong>Cuantificadores</strong></p>
<table>
<tbody>
<tr>
<td>*</td>
<td>el caracter puede aparecer cero o mas veces.</td>
</tr>
<tr>
<td>+</td>
<td>el caracter puede aparecer una o mas veces.</td>
</tr>
<tr>
<td>?</td>
<td>el caracter puede aparecer cero o una vez.</td>
</tr>
<tr>
<td>{n}</td>
<td>el caracter aparece exactamente n veces.</td>
</tr>
<tr>
<td>{n,}</td>
<td>el caracter aparece n o más veces.</td>
</tr>
<tr>
<td>{n,m}</td>
<td>el caracter puede aparecer entre n y m veces.</td>
</tr>
</tbody>
</table>
<p>Como parte de la notacion, siempre encerramos las expresiones regulares entre /, llaves ({}) o #. Por ejemplo, la expresion <em>/ab?c/</em> hace match con <em>ac</em> y <em>abc</em>. La expresión regular <em>/ab{1,3}c/</em> hace match con <em>abc</em>, <em>abbc</em>y <em>abbbc</em>.</p>
<p><strong>Agrupadores</strong></p>
<table>
<tbody>
<tr>
<td><strong>[]</strong></td>
<td>permiten agrupar creando rangos, por ejemplo /ab[0-5]+c/ hará match con cualquier string que contenga ab, una o más veces un número entre 0 y 5, y finalmente una c. Por ejemplo: ab12c.</td>
</tr>
<tr>
<td><strong>()</strong></td>
<td>Nos permiten crear sub-expresiones, expresiones regulares contenidas dentro de otras: <em>/a(bc.)+e/</em>. Tiene un uso especial en formas como (&#8230;), que permite capturar todo lo que encierren los paréntesis, y (a|b) que hace match con a o b</td>
</tr>
</tbody>
</table>
<p><strong>Modificadores</strong><br />
Permiten cambiar el modo en que se ejecute la expresión regular. Se agregan después del delimitador de cierre.</p>
<table>
<tbody>
<tr>
<td><strong>i</strong></td>
<td>Coincidir indistintamente entre mayúsculas y minúsculas.</td>
</tr>
<tr>
<td><strong>m</strong></td>
<td>Match multilínea.</td>
</tr>
<tr>
<td><strong>s</strong></td>
<td>El metacaracter . hará match también con el caracter de cambio de línea.</td>
</tr>
<tr>
<td><strong>u</strong></td>
<td>Hacer los matches en modo UTF8</td>
</tr>
<tr>
<td><strong>x</strong></td>
<td>Ignorar espacios.</td>
</tr>
<tr>
<td colspan="2">Otros modificadoresX,e,A,D,S,U,J <a title="Modificadores de expresiones regulares en PHP" href="http://www.php.net/manual/es/reference.pcre.pattern.modifiers.php">ver más</a></td>
</tr>
</tbody>
</table>
<h2>Funciones PHP</h2>
<p><strong>preg_match</strong></p>
<p>Nos permite evaluar si un string hace match con una expresi&ocuate;n regular. Por ejemplo, para validar un email haríamos lo siguiente</p>
<pre class="wp-code-highlight prettyprint">
function verificar_email($email)
{
  if(preg_match(&quot;/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/&quot;,$email))
  {
    return true;
  }
  return false;
}
</pre>
<p>Otros ejemplos interesantes pueden ser:</p>
<pre class="wp-code-highlight prettyprint">
//1. verificar si un password es seguro
function verificar_password_strenght($password)
{
   if (preg_match(&quot;/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$/&quot;, $password))
     echo &quot;Su password es seguro.&quot;;
   else
     echo &quot;Su password no es seguro.&quot;;
} 

//2. Verificar el fomato de una IPv4
function verificar_ip($ip)
{
    return preg_match(&quot;/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])&quot; .
            &quot;(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/&quot;, $ip );
}

//3. Verificar formato de número telefónico en EU
function verificar_telefono_eu($telefono)
{
  $regex = '/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})'
        .'(?:(?$0', $text);
}</pre>
<p>Al usar preg_replace se vuelve muy útil utilizar las retroreferencias. Estas son simplemente una sintaxis para hacer referencia a los matches que ocurrirán al ejecutar una expresión regular. Por ejemplo, para convertir una fecha en formato MM/DD/YYYY a formato DD/MM/YYYY podemos utilizar retroreferencias:</p>
<pre class="wp-code-highlight prettyprint">
function cambiar_formato_fecha($fecha)
{
    return preg_replace(&quot;/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/i&quot;,&quot;$3/$2/$1&quot;,$fecha);
}
</pre>
<p>Para un guía completa puede visitar <a title="Manual de PHP: Expresiones Regulares" href="http://www.php.net/manual/es/book.pcre.php">el manual de PHP</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/06/05/rapido-y-completo-expresiones-regulares-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>6 tips para mejorar la seguridad de tus formularios web</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/04/28/6-tips-para-mejorar-la-seguridad-de-tus-formularios-web/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/04/28/6-tips-para-mejorar-la-seguridad-de-tus-formularios-web/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 02:37:35 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[HTML, XHTML, CSS, Javascript y AJAX]]></category>
		<category><![CDATA[PHP y MySQL]]></category>
		<category><![CDATA[Programación Web]]></category>
		<category><![CDATA[captacha]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación web]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1254</guid>
		<description><![CDATA[Una de las principales consideraciones al momento de crear un sitio web es la seguridad de los formularios. Estos pueden convertirse en puntos de entrada sensibles hacia el sistema. Un formulario inseguro puede desde sobrecargar un servidor hasta acceder y modificar información almacenada en una base de datos. Acá listamos 6 pasos sencillos para asegurar [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las principales consideraciones al momento de crear un sitio web es la seguridad de los formularios. Estos pueden convertirse en puntos de entrada sensibles hacia el sistema. Un formulario inseguro puede desde sobrecargar un servidor hasta acceder y modificar información almacenada en una base de datos. Acá listamos 6 pasos sencillos para asegurar que los formularios de un proyecto web están protegidos.</p>
<p><strong>1. POST</strong></p>
<p>Cualquier formulario debe siempre enviar la información de su contenido usando el método POST. Con POST los valores del formulario viajan ocultos hacia el script de destino. Si un formulario utiliza el método GET, toda la información del mismo será desplegada en la barra de direcciones del browser.</p>
<p><strong>2. Token</strong></p>
<p>Es necesario que el script que va a procesar la información del formulario tenga algún modo de reconocer que efectivamente la información proviene de el formulario para el cuál fue diseñado.  Para ello, normalmente se utiliza un token o código encriptado que se envía como un campo oculto en el formulario y que el script puede desencriptar para validar si procesa o rechaza el formulario.</p>
<p>La mayoría de los frameworks para desarrollo web, como <a href="http://www.intergraphicdesigns.com/blog/2012/02/19/cakephp-un-framework-para-que-desarrollar-en-php-sea-un-queque/" target="_blank">CakePHP</a>, ya integran el token como una validación automática en sus formularios.</p>
<p><strong>3. Protección CSRF</strong></p>
<p>CSRF significa Cross Site Request Forgery o Falsificación de Petición en Sitios Cruzados en español. Este tipo de vulnerabilidad trata de enviar datos de un formulario a un script ubicado en un sitio web distinto. Para evitar este ataque se debe chequear el sitio web del que proviene el formulario. Por ejemplo, en PHP se puede usar la variable $_SERVER["<var><var>HTTP_REFERER</var></var>"] para validar desde dónde viene la información. No obstante, esta variable puede ser modificable o no provista, por lo cual una manera más confiable de validar que el formulario haya sido enviado desde el dominio correspondiente es utilizando Cookies.</p>
<p><strong>4. Validaciones Javascript</strong></p>
<p>Validar que los campos requeridos de un formulario se hayan completado y que tengan un formato y extensión apropiados mejora grandemente la experiencia del usuario y dificulta los posibles ataques. Se debe verificar que los campos del formulario permitan una cantidad razonable de caracteres y que respeten el formato pedido. Por ejemplo, usando Javascript, se puede limitar un campo para que solamente admita números.</p>
<p>Existen muchísimas librerías para javascript que permiten facilitar la validación de un formulario antes de su envío. Por ejemplo <a title="Jquery Validate" href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/" target="_blank">Jquery Validate</a> es un plugin de la librería Jquery que permite realizar validaciones de campos numéricos e emails con un formato muy sencillo. Similarmente, <a title="Masked Input" href="http://digitalbush.com/projects/masked-input-plugin/" target="_blank">Masket Input</a> es otro plugin de Jquery que no solo restringe el tipo y número de caracteres admitidos en un input, si no que también les da formato conforme el usuario escribe.</p>
<p><strong>5. Validaciones Internas</strong></p>
<p>De cualquier forma, los navegadores permiten desactivar el Javascript, razón por la cuál se hace necesaria la validación de los campos y de su formato desde el script final. Esto es importante ya que los ataques maliciosos podrían intentar enviar código por un formulario, que al ser leído o desplegado podría ejecutarse y causar serios problemas. Este tipo de ataque es conocido como XSS o Cross Site Scripting. En PHP, por ejemplo, una simple línea de código permitiría filtar una entrada dependiendo de si queremos recibir texto o código html:</p>
<pre class="wp-code-highlight prettyprint">//suponiendo que $entrada guarda el valor enviado por el formulario //$entrada_txt almacenará una cadena de texto segura $entrada_txt = htmlentities(trim(strip_tags(stripslashes($entrada))), ENT_NOQUOTES, &quot;UTF-8&quot;); //en este caso $entrada_html almacenará una cadena con html $entrada_html = strip_tags(htmlentities(trim(stripslashes($entrada))), ENT_NOQUOTES, &quot;UTF-8&quot;);</pre>
<p><strong>6. Captcha</strong><br />
<img title="Ejemplo Captcha" src="http://www.captcha.net/images/recaptcha-example.gif" alt="Ejemplo Captcha" width="220" height="88" /></p>
<p>Un captcha es una imagen distorcionada que contiene un código que el usuario debe leer e ingresar en un campo del formulario. La idea es que el hecho de ser una imagen y de que esté distorcionada evitará que códigos maliciosos puedan enviar ataques en el formulario.</p>
<p>Son pasos sencillos, validaciones simples que pueden llegar a ahorrarle dinero y muchos dolores de cabeza.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/04/28/6-tips-para-mejorar-la-seguridad-de-tus-formularios-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5 consejos para no perder el control de su tiempo en Redes Sociales</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/04/10/5-consejos-para-no-perder-el-control-de-su-tiempo-en-redes-sociales/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/04/10/5-consejos-para-no-perder-el-control-de-su-tiempo-en-redes-sociales/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 14:42:41 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[InterGraphicDESIGNS - Últimas Noticias]]></category>
		<category><![CDATA[DeskTime]]></category>
		<category><![CDATA[Harvest]]></category>
		<category><![CDATA[Hayfever]]></category>
		<category><![CDATA[Hootsuite]]></category>
		<category><![CDATA[LeechBlock]]></category>
		<category><![CDATA[redes sociales]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[TimeCamp]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1209</guid>
		<description><![CDATA[¿Ha notado cuánto tiempo utiliza revisando Facebook, Twitter o Youtube? ¿Alguna vez lo ha medido? De acuerdo con un reciente estudio de Redes Sociales en Centroamérica, Costa Rica es el país con mayor penetración de las redes sociales en el istmo. ¿Cómo afecta esto la productividad de los ticos en trabajos expuestos a internet y [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/03/apps1.png"><img class="alignright size-full wp-image-1214" title="Aplicaciones y extension para controlar el tiempo en el trabajo" src="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/03/apps1.png" alt="Aplicaciones y extension para controlar el tiempo en el trabajo" width="660" height="100" /></a></p>
<p>¿Ha notado cuánto tiempo utiliza revisando Facebook, Twitter o Youtube? ¿Alguna vez lo ha medido? De acuerdo con un<a href="http://ilifebelt.com/redes-sociales-centroamerica/" target="_blank"> reciente estudio de Redes Sociales en Centroamérica</a>, Costa Rica es el país con mayor penetración de las redes sociales en el istmo. ¿Cómo afecta esto la productividad de los ticos en trabajos expuestos a internet y redes sociales?</p>
<p>Existen diversas investigaciones que concluyen que mantenerse conectado en las redes sociales trae beneficios, como lo indica <a title="Facebook no distrae a empleados y los hace felices" href="http://www.nacion.com/2012-03-28/Tecnologia/Facebook-no-distrae-a-empleados-y-los-hace-felices--asegura-estudio.aspx" target="_blank">este artículo</a> compartido por el periódico La Nación: las personas parecen trabajar más felices, tener más conciencia social, son más accesibles y responden más rápido, además de que se crean oportunidades de negocio y aprendizaje. Como el artículo expresa, los trabajadores sienten que: (citamos)</p>
<blockquote><p><em>&#8220;&#8230;el acceso a la red social es un break que permite atender sus relaciones personales&#8230;&#8221;</em></p></blockquote>
<p>No obstante, otros estudios como <a href="http://www.elfinancierocr.com/ef_archivo/2010/enero/10/tecnologia2213289.html" target="_blank">este publicado por el periódico El Financiero</a> contrarestan los beneficios de las redes con su impacto en la productividad, que se puede reducir hasta en un 12,5%. ¿Cómo saber si sus breaks estan durando demasiado? Hay que medirlos.</p>
<p>Acá brindamos algunos consejos puntuales para controlar el tiempo que invierte en redes sociales y así mejorar su productividad.</p>
<p><strong>1) Concéntrese en sus tareas y establezca recompensas</strong></p>
<p>Se sabe que los trabajadores que requieren estar mucho tiempo sentados necesitan tomarse descansos ocasionales por salud alrededor de cada hora y media. Puede utilizar estos descansos para revisar sus redes sociales. Para hacerlo más interesante puede proponerse la meta de terminar una determinada tarea antes de tomarse el descanso. Incluso, si puede levantarse y revisar sus redes sociales en el celular, mucho mejor.</p>
<p><strong>2) Mida su tiempo de trabajo</strong></p>
<p>Normalmente tenemos que entregar reportes de lo que hacemos durante el día.Para ello podemos utilizar sistemas online que nos permitan acostumbrarnos a medir nuestro tiempo. Un buen ejemplo de esto es <a title="Harvest" href="http://www.getharvest.com/" target="_blank">Harvest</a>. Harvest es una herramienta web para el reporte de horas de trabajo. Cada colaborador tiene su cuenta, ingresa a ella y llena su reporte. Este reporte es enviado a otro usuario que es el administrador de la cuenta y que puede ver los detalles de estos reportes e incluso generar gráficos.</p>
<p>El gran reto es construir el hábito de reportar el tiempo. Este reporte no debería ser hecho al final del día o de la semana, cuando ya el usuario no está tan seguro de cuánto tiempo le tomó hacer una determinada tarea. Para evitar esto, Harvest tiene la opción de Time Tracking: un cronómetro que el usuario activa al iniciar la tarea y que detiene cuando esta termina. El resultado: el tiempo exacto y un incentivo más para realizar la tarea más rápido.</p>
<p>De hecho, hay extensiones y aplicaciones como <a title="Hayfever" href="https://chrome.google.com/webstore/detail/hieiheiincjomjoiiknfcmiioakhlhmj?hl=en-US" target="_blank">Hayfever</a> para Google Chrome, que permiten tener un acceso más rápido al time tracking de Harvest.</p>
<p><strong>3) Mida su tiempo en redes sociales</strong></p>
<p>Ya que estamos acostumbrados a utilizar herramientas de medición par nuestro trabajo, podemos utilizarlas para medir nuestro descanso. Existen diversas aplicaciones para diferentes plataformas que nos permiten medir cuanto tiempo estamos usando en las redes sociales.</p>
<p>Por ejemplo, podemos instalar en Firefox <a title="Leechblock" href="https://addons.mozilla.org/en-US/firefox/addon/leechblock/" target="_blank">LeechBlock</a>: Una extensión que permite, entre otras cosas, crear una lista de sitios restringidos, es decir, sitios que Firefox bloqueará automáticamente después de que usted exceda el límite de tiempo establecido por día.</p>
<p>Para Chrome existe <a title="Time Spent on Facebook" href="https://chrome.google.com/webstore/detail/cbdiihnkhjaiokcaeiecemajlohbhefo?hl=en-US" target="_blank">Time Spend on Facebook</a> que muestra un cronómetro del tiempo que se ha invertido ese día en Facebook. También están <a title="TimeCamp" href="https://chrome.google.com/webstore/detail/ampbdedfdfambbnofclooigndknamkbf?hl=en-US" target="_blank">TimeCamp</a> y <a title="DeskTime" href="https://chrome.google.com/webstore/detail/joecgohaladjemjnjckellppmfbbminb?hl=en-US" target="_blank">DeskTime</a>, que automáticamente registran su tiempo invertido en redes sociales y en trabajo, presentado reportes uy gráficos con los resultados.</p>
<p>Existen también aplicaciones para celulares con las cuales usted puede hacer la medición de su tiempo, ya sea trabajando o en redes sociales. Por ejemplo, en Google Play podemos encontrar aplicaciones Android como <a title="TimeClock" href="https://play.google.com/store/apps/details?id=com.spotlightsix.timeclock3" target="_blank">TimeClock</a> o <a title="TimeRecording" href="https://play.google.com/store/apps/details?id=com.dynamicg.timerecording&amp;feature=related_apps" target="_blank">TimeRecording</a>.</p>
<p><strong>4) Utilice Manejadores Sociales</strong></p>
<p>Puede evitar ingresar una por una a su cuenta en cada red social. Mejor utilice un manejador social: Una aplicación (o extensión de browser) que concentran todas las notificaciones de sus redes en un solo panel sin tener que ingresar a cada cuenta y le permite postear desde allí a todas sus cuentas sis sus necesidades de comunicación así lo requieren. Además pueden configurarse para desplegar pequeñas notificaciones de escritorio, de modo que usted puede seguir enterado y trabajando. Algunos de los manejadores sociales más utilizados son:</p>
<ul>
<li><a title="Yoono" href="http://www.yoono.com/" target="_blank">Yoono</a></li>
<li><a title="Hootsuite" href="http://hootsuite.com/" target="_blank">Hootsuite</a></li>
<li><a title="TweetDeck" href="http://www.tweetdeck.com/" target="_blank">Tweetdeck</a></li>
</ul>
<p><strong>5) Desactive los chats si no está logueado</strong></p>
<p>Los chats suelen ser un gran distractor. Utilícelos en modo offline cuando sea requerido, para que quien lo requiere le envíe un mensaje privado en vez de un chat. Los mensajes privados normalmente son más concisos que los chats.</p>
<p>Como estas, existen cientos de aplicaciones dedicadas a ayudarle a ser productivo, accesibles con sólo un click. No obstante, nada se logrará si no sale de usted el impulso genuino de mejorar. Como dijo Steve Jobs:</p>
<blockquote><p><em>&#8220;Tenga un criterio de calidad. Algunas personas no están acostumbradas a un entorno en el que se espera la excelencia.&#8221;</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/04/10/5-consejos-para-no-perder-el-control-de-su-tiempo-en-redes-sociales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Por qué aún no tenemos un mundo IPv6?</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/04/03/por-que-aun-no-tenemos-un-mundo-ipv6/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/04/03/por-que-aun-no-tenemos-un-mundo-ipv6/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 17:04:52 +0000</pubDate>
		<dc:creator>ssanchez</dc:creator>
				<category><![CDATA[Hospedaje Web y Dominios en Costa Rica.]]></category>
		<category><![CDATA[ICANN]]></category>
		<category><![CDATA[IPv4]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[LACNIC]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1231</guid>
		<description><![CDATA[Otro de los temas que se tocó en la Reunión 43 de la ICANN fue el despliegue del protocolo IPv6. En un artículo previo habíamos hablado un poco sobre IPv6 y el fin de las direcciones IPv4. En esa ocasión vimos que en Febrero de 2011 se agotó el Pool de direcciones IPv4, que en [...]]]></description>
			<content:encoded><![CDATA[<p>Otro de los temas que se tocó en la Reunión 43 de la <a title="ICANN" href="http://www.icann.org/" target="_blank">ICANN</a> fue el despliegue del protocolo IPv6.</p>
<p>En un artículo previo habíamos hablado un poco sobre <a title="IPv6 y el fin de las direcciones IPv4" href="http://www.intergraphicdesigns.com/blog/2011/09/08/ipv6-y-el-fin-de-las-direcciones-ipv4/">IPv6 y el fin de las direcciones IPv4</a>. En esa ocasión vimos que en Febrero de 2011 se agotó el Pool de direcciones IPv4, que en estos momentos las entidades encargadas están realizando las últimas asignaciones posibles, y que las estimaciones más conservadoras esperan que las asignaciones se terminen en menos de 4 años.</p>
<p>También comentamos de cuál será el protocolo sustituto -IPv6- y vimos algunas de sus características. Con IPv6 se tendrán unos 340 sextillones de direcciones IP, cada una de 128 bits de longitud. Si se repartiesen en toda la superficie de la Tierra habría unas 667.000.000.000.000.000.000.000 direcciones IP por cada metro cuadrado. Tal cantidad de direcciones permitirá que cada computadora, teléfono celular, y en general cada dispositivo inteligente que se fabrique, posea su propia dirección IP y se conecte directamente a Internet sin necesidad de enrutamientos e IPs compartidas como se hace hoy día.</p>
<p>El nuevo protocolo como tal está listo desde hace varios años. La mayoría de los dispositivos, infraestructura de red, servidores y sistemas operativos ya incorporan la capacidad de trabajar con IPv6 y con IPv4 simultáneamente. A nivel de las grandes organizaciones que administran y regulan el Internet, y en el entorno técnico de las empresas del Estado y privadas, ya se lleva varios años promoviendo el despliegue de IPv6 y capacitando al personal en sus ventajas y el modo de implementarlo. Entonces una pregunta que cabe hacerse es: ¿Porqué aún no se ha realizado un despliegue en masa del protocolo a nivel de la industria y los usuarios comunes y corrientes?</p>
<p><b>Inercia Social</b></p>
<p>Probablemente la respuesta a la anterior pregunta sea: Debido a la gran inercia social que se necesita superar. Grandes cambios como este requieren muchos pasos pequeños para poder mover toda la maquinaria social involucrada.</p>
<p>Por lo menos en lo que a América Latina se refiere, las campañas informativas y las pruebas que se han realizado (como el <a title="World IPv6 Day" href="http://www.worldipv6day.org/" target="_blank">Día Mundial IPv6</a> que se realizó el pasado 8 de Junio de 2011) tan solo ha tenido influencia en un pequeño sector muy técnico de la sociedad. Ya es hora de superar esta etapa técnica y llegar a los empresarios y usuarios comunes.</p>
<p>Para poder salir adelante con el despliegue de las direcciones IPv6, los ISPs (Proveedores de Acceso a Internet) es decir, las empresas que distribuyen servicios de Internet, deben solicitar sus propios bloques de direcciones IPv6 al ente regional (en nuestro caso <a title="LACNIC" href="http://lacnic.net/sp/index.html" target="_blank">LACNIC</a>), finalizar sus capacitaciones y pruebas de compatibilidad para que comiencen a promover el uso de direcciones IPv6. Cada gobierno y entidad interesada en promover el uso del nuevo protocolo, deberá mover su foco de atención hacia el usuario común, ya que en la esfera técnica existe bastante acuerdo y conocimiento del tema.</p>
<p>Es de esperarse que en los próximos años, poco a poco al principio pero con mayor velocidad luego, los ISPs permitan a sus usuarios solicitar direcciones IPv6 y en el caso de las nuevas conexiones, las realicen desde el inicio con el nuevo protocolo. Durante un tiempo estaremos viviendo en una sociedad en transición, con usuarios que mantienen su vieja dirección IPv4, pero que sobre ella tienen también el equivalente IPv6 hasta que con el paso de los años IPv4 finalmente sea sacado de operación.</p>
<p><b>Superando el Temor al Cambio</b></p>
<p>Al usuario común no le interesa cómo funciona su Internet, sino que funciona. La mayoría de las personas ni siquiera saben que la conexión de su casa probablemente comparte un IP con sus vecinos (¡quizá ni saben que tienen un IP, ni lo que eso significa!).</p>
<p>De tal manera, el trabajo de los ISPs en estos momentos programar el inicio del despliegue y asegurarse que el Internet continúa operando de manera normal para los usuarios que tengan IPv6. Por supuesto que sus departamentos técnicos deben estar altamente capacitados para atender cualquier situación que se pueda ir dando, sin embargo en un gran porcentaje los usuarios no van a preocuparse por los detalles, sino sólo por poder acceder a su correo y navegar en la web como siempre lo han hecho.</p>
<p><a style="float:right;" href="http://www.worldipv6launch.org" ><img title="WORLD IPV6 LAUNCH is 6 June 2012 – The Future is Forever" src="http://www.worldipv6launch.org/wp-content/themes/ipv6/downloads/World_IPv6_launch_badge_128.png" alt="WORLD IPV6 LAUNCH is 6 June 2012 – The Future is Forever" width="128" height="128" /></a>Gracias al éxito del Día Mundial IPv6 del año pasado, el 6 de Junio del 2012 se ha programado como el <a title="World IPv6 Day Launch" href="http://www.worldipv6launch.org/" target="_blank">Día Mundial del Lanzamiento de IPv6</a>. Este día algunos gigantes del Internet como Google, Facebook, Microsoft Bing, y Yahoo van a habilitar sus servicios en forma permanente con compatibilidad IPv6. Se espera que con esta iniciativa se le dé mayor impulso al protocolo y que poco a poco incremente la cantidad de servidores de hosting que atienden perfectamente solicitudes de visitantes con IPv6.</p>
<p>Así que estamos a las puertas de otro gran cambio, uno que nos permitirá experimentar la conectividad al Internet de maneras que hasta hoy no hemos visto. Nuestra tarea como usuarios es informarnos y preguntar a nuestro proveedor de servicios cuándo pondrá a nuestra disposición direcciones IPv6, y cuáles serán los requisitos y características del servicio.</p>
<p>Podría ser que con un poco de presión del público las entidades encargadas vayan superando el temor al cambio y sigan el ejemplo de Google y otros que intentan acelerar el despliegue del nuevo protocolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/04/03/por-que-aun-no-tenemos-un-mundo-ipv6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>9 consejos para mejorar el Buzz de su organización</title>
		<link>http://www.intergraphicdesigns.com/blog/2012/03/30/9-consejos-para-mejorar-el-buzz-de-su-organizacion/</link>
		<comments>http://www.intergraphicdesigns.com/blog/2012/03/30/9-consejos-para-mejorar-el-buzz-de-su-organizacion/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 20:14:25 +0000</pubDate>
		<dc:creator>Daniel Obando</dc:creator>
				<category><![CDATA[Google, SEO (Posicionamiento en Buscadores)]]></category>
		<category><![CDATA[InterGraphicDESIGNS - Últimas Noticias]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mercadeo digital]]></category>
		<category><![CDATA[redes sociales]]></category>
		<category><![CDATA[SEO (Posicionamiento en Buscadores)]]></category>
		<category><![CDATA[smo]]></category>

		<guid isPermaLink="false">http://www.intergraphicdesigns.com/blog/?p=1217</guid>
		<description><![CDATA[Para ponerlo en palabras simples: cuando hablamos de buzz hablamos de la presencia que tiene algo en internet, cualquier cosa capture la atención de los usuarios. Pareciera ser algo muy intangible, así que, ¿en qué modo ayuda el buzz a mi empresa? La ecuación es simple: a más exposición de su empresa en internet, más [...]]]></description>
			<content:encoded><![CDATA[<p>Para ponerlo en palabras simples: cuando hablamos de <em>buzz</em> hablamos de la presencia que tiene algo en internet, cualquier cosa capture la atención de los usuarios. Pareciera ser algo muy intangible, así que, ¿en qué modo ayuda el buzz a mi empresa? La ecuación es simple: a más exposición de su empresa en internet, más usuarios conocerán de ella, más se acercarán a conocerla y, finalmente, más usuarios utilizarán su servicio, comprarán su producto o se unirán a su causa.</p>
<p>Se ha especulado mucho sobre si Google mide y toma en cuenta el buzz dentro de sus algoritmos para afectar el SEO de una página web, de modo que esta aparezca mejor posicionada en las búsquedas. Sólo Google podría afiramrlo, no obstante lo que sí se sabe con certeza es que Google tiene un interés grande en el buzz. Para ello ha creado iniciativas como el despliegue de tweets en tiempo real en sus búsquedas y también <a title="Google Search plus Your World" href="http://www.google.com/insidesearch/plus.html" target="_blank">Google Search, plus Your World</a>. Con esta última, Google le permite al usuario personalizar los resultados de sus búsquedas, de modo que no solo aparezcan páginas web, si no también contenios publicado o compartido por nuestros contactos en Google Plus.</p>
<p style="text-align: center;"><a href="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/03/igd_search_result.png"><img class="size-full wp-image-1218 aligncenter" style="border: 1px solid #AAA;" title="Resultado de búsqueda combinado con resultados compartidos por usuarios" src="http://www.intergraphicdesigns.com/blog/wp-content/uploads/2012/03/igd_search_result.png" alt="Resultado de búsqueda combinado con resultados compartidos por usuarios" width="697" height="185" /></a></p>
<p>Vale a pena intentarlo. A continuación les dejamos algunos pasos básios para empezar a trabajar en el buzz de su empresa en internet.</p>
<p><strong>1. Agregue un blog a su sitio web</strong></p>
<p>Tenga un lugar en donde pueda estar publicando noticias que pueda compartir también en redes sociales. Un blog ayuda tremendamente al posicionamiento de su página web en los buscadores. Eso sí, la idea del blog es tener una forma rápida y sencilla de publicar noticias, para poder mantener el movimiento en el sitio. Un blog estático no sirve de mucho.</p>
<p><strong>2. Cree perfiles empresariales en redes sociales</strong></p>
<p>Muchísimas empresas cometen el error en Facebook de crear perfiles personales para sus empresas en vez de crear páginas. Al hacer esto, se exponen a que Facebook los detecte y clausure su perfil. Las personas tienen perfiles y amigos, las empresas, páginas y fans. Las redes sociales permiten crear perfiles empresariales, los cuales usted puede utilizar para compartir las notas de su blog y demás contenido de interés para su negocio. Usualmente se crean cuentas en Facebook, Twitter, LinkedIn y Google Plus. Sin embargo de acuerdo a su nicho y objetivos, podrían ser igual o mayormente efectivas otras como Tumblr, Flickr, YouTube, Foursquare o Pinterest. La selección de los canales que una empresa desea abrir para estar en contacto con proveedores, clientes y amigos es una de las partes más importantes de toda estrategia de mercadeo digital.</p>
<p><strong>3. SEO</strong></p>
<p>Mejore su página web para que sea más fácil que los buscadores la encuentren cuando alguna persona busca algo relacionado a su negocio, y por tanto, tenga más exposición. Una aclaración importante es que compartir links de su sitio web en las redes sociales realmente no ayuda a que el ranking de su página se incremente <em>per sé</em>, como algunos han dicho. Sin embargo esto sí es importante parra crear buzz y llamar la atención del mercado.</p>
<p><strong>4. Esté atento</strong></p>
<p>Además de publicar información de su blog, busque y comparta información relacionada a su negocio: noticias, eventos, videos, notas de interés, etc.</p>
<p><strong>5. Creando la red</strong></p>
<p>De acuerdo a sus objetivos de mercadeo digital, usualmente es buena idea iniciar por los colaboradores de su empresa. Agréguelos a sus redes e incentive a compartir a su vez toda la información que se publique en los perfiles empresariales. Es importante identificar a personas de interés e influencia para su mercado y aprovechar el potencial de las redes sociales para fortalecer relaciones con ellos. Cree relaciones con proveedores o empresas cercanas para ayudarse mutuamente de una forma natural.</p>
<p><strong>6. Manténgase en contacto: Trivias, juegos, sorteos, etc</strong></p>
<p>Recuerde que las redes sociales no son para vender (al menos no en la mayoría de los casos), sino que son para darse a conocer y reforzar su presencia de marca. Según los objetivos de su organización, puede utilizar trivias, regalos, sorteos, juegos, etc que le permita llamar la atención de sus usuarios.</p>
<p><strong>7. Medir, analizar e innovar. Medir, analizar e innovar otra vez</strong></p>
<p>En todo proceso, es importante tener los objetivos claros, así como determinar la forma de evaluar los resultados (Esto aplica tanto en el SEO como en los esfuerzos en Redes Sociales). De acuerdo a este análisis deben tomarse las medidas correctivas y repetir este proceso cíclicamente. Recuerde por ejemplo, que no necesariamente la cantidad de fans o followers son la mejor métrica para estudiar el éxito de estos esfuerzos, el tener muchos fans sólo porque sí podría no tener mucho sentido para algunos objetivos organizacionales. Intente identificar siempre lo que su empresa busca (refresque cuál era su misión y visión), y de acuerdo a esto, analice cuáles deberían ser las métricas mediantes las cuales usted va a estudiar el éxito de su inversión (tiempo y dinero) en mercadeo digital.</p>
<p><strong>8. Sea efectivo y aproveche debidamente las herramientas y canales</strong></p>
<p>Manejar las redes sociales de la empresa puede demandar mucho tiempo. Si usted decide hacerlo, recuerde que existen Manejadores Sociales que le pueden facilitar el trabajo y monitoreo del mismo. Tenga cuidado con las herramientas que te permiten sincronizar todas las cuentas, cada red social tiene una forma y lenguaje distinto, por ejemplo, es muy diferente compartir un enlace en Twitter en 140 caracteres y aprovechando el potencial de los hashtags que compartir el mismo enlace en Facebook, donde se puede extender un poco más en su redacción.</p>
<p><strong>9. ¿Contratar a una persona externa o no?</strong></p>
<p>Muchas organizaciones han seleccionado delegar este trabajo en agencias especializadas en el tema. Cada vez es más frecuente escuchar la figura de un &#8220;Community Manager&#8221; externo a la empresa. No existe una respuesta única sobre si esto debe hacerse por medio de una subcontratación o no, pues en cada organización se cuentan con objetivos y recursos que podrían inclinar la decisión a realizar esto internamente. Lo que sí es claro, es que el trabajo debe estar en manos de personas que comprendan el potencial de estos esfuerzos, la importancia de mantener una comunicación transparente y activa con su red, con conocimiento en los temas internos de la organización y su industria.</p>
<p>Recuerde, su organización tiene muchas cosas buenas que compartir a su red de clientes, proveedores y amigos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.intergraphicdesigns.com/blog/2012/03/30/9-consejos-para-mejorar-el-buzz-de-su-organizacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
