<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Senior Web Developer</title>
    <link>http://www.profesional.co.cr</link>
    <atom:link href="http://rudyjahchan.com/feeds/rss.xml" rel="self"
      type="application/rss+xml" />
    <description>
      Nestor Mata Cuthbert is a seasoned web developer with lot of experience in PHP, Drupal, .Net, Java, J2EE, AJAX, MySQL and other technlologies.

    </description>
    <language>en-us</language>
    <pubDate>Sun, 20 Jul 2014 07:55:50 -0500</pubDate>
    <lastBuildDate>Sun, 20 Jul 2014 07:55:50 -0500</lastBuildDate>

    
      
        <item>
          <title>Sobre la ley de obligatoriedad a colegiarse al CPIC</title>
          <link>http://www.profesional.co.cr/es/2014/06/30/proyecto-ley-obligatoriedad-cpic-costa-rica/</link>
          <pubDate>Mon, 30 Jun 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/06/30/proyecto-ley-obligatoriedad-cpic-costa-rica/</guid>
          <description>&lt;p&gt;Hoy el Colegio de Profesionales en Informatica y Computación (CPIC) de
Costa Rica, nos viene a intentar gobernar como un tirano que busca
poder.&lt;br /&gt;
El colegio tiene una ley en la asamblea legislativa, para asegurarse que
solamente colegiados puedan ejercer en Tecnologías de Información.  &lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/Informatica-Libre-logo2.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Esto a simple vista parece inofensivo y hasta necesario, y desde la
perspectiva de profesionales de otras carreras colegiadas inclusive
justo.&lt;br /&gt;
Cuando pregunto por cual es la justificación de esto, cual es el
problema que esto viene a resolver, recibo respuestas como “si otros
profesionales tienen la misma restricción, porque no ustedes? es lo
justo”, o “es para salvaguardar los intereses de los clientes”, o “para
protegernos de hackers y profesionales sin ética”.&lt;br /&gt;
Pero la realidad es que las intenciones del colegio son meramente
económicas, ellos han fallado en atraer el interes de los profesionales
y como solución deciden obligar con pena de carcel a integrarse a los
profesionales, porque saben que es la carrera de mayor crecimiento en el
mundo.  &lt;/p&gt;

&lt;p&gt;Pero, el problema aquí, no es solo una cuestión de oponerse a pagarles a
un grupo que tiene aires de grandesa, el problema es un problema serio
para el país, grave, mayúsculo.&lt;br /&gt;
No estoy siendo amarillista, el problema es que intentar poner en la
misma caja al area de tecnologías de información, junto a medicina,
abogacía o arquitectura es que no tiene el mas minimo sentido lógico.  &lt;/p&gt;

&lt;p&gt;La razón es que, aunque alguien pudiera poner ejemplos de como un
muchacho de colegio sin “preparación formal” no tiene la capacidad de
montar un sistema bancario seguro, escalable y eficiente y por esa razón
debería regularse la carrera, estaría dejando de cientos de otras ramas
de nuestra carrera.&lt;br /&gt;
Aunque ese ejemplo podría estar comparado con el trabajo de un
arquitecto, y en cierto sentido lo está, ese tipo de trabajo debería ser
supervisado y regulado por el cliente, porque las tendencias, esquemas,
estandares y otros, son demasiados y muy cambiantes, y es el cliente el
que debe determinar bajo que parametros debe permanecer ese desarrollo.  &lt;/p&gt;

&lt;p&gt;El problema es, que al ver ese ejemplo no veriamos todo otro monton de
ejemplos críticos, permitanme poner esto en perspectiva un poco, y el
porque nuestra area también es comparable con el arte, con un pintor o
un músico, el cual sería destruido al intentar limitarse y controlarse
por un esquema como el que propone el CPIC:  &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cualquier niño de escuela o joven de colegio (de hecho miles a nivel
mundial lo hacen todos los días) puede desarrollar una idea, un
sistema, un juego, una libreria, una solución a un problema.&lt;/li&gt;
  &lt;li&gt;Cualquier profesional de cualquier area puede desarrollar herramientas
que requieran.&lt;/li&gt;
  &lt;li&gt;Un joven podría desarrollar el próximo “Facebook”, o un sitio que
ofrezca maneras novedosas para aprender alguna materia en el colegio,
o podria desarrollar un experimento que cambie la vida de miles de
personas, o simplemente un juego.&lt;/li&gt;
  &lt;li&gt;Miles de proyectos open source son creados en una idea desarrollada en
un fin de semana o en un par de noches, por personas que no nos
imaginamos.&lt;/li&gt;
  &lt;li&gt;Un profesional de recursos humanos puede crear una herramienta que le
ayude a hacer su trabajo.&lt;/li&gt;
  &lt;li&gt;Un periodista puede crear un sitio para informar de sus artículos y
opiniones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos estos ejemplos son casos que según el CPIC no estan certificados
para ejercer estas tareas, y por lo tanto no serán aceptados en el
colegio y por consiguiente estan cometiendo un crimen, de la misma
manera que alguien que no es abogado no puede defender a un acusado, o
que alguien que no es medico no puede efectuar una cirugía.&lt;br /&gt;
La simple comparación es absurda, porque las areas no tienen ningún
parecido, porque en nuestra area &lt;em&gt;cualquiera puede crear&lt;/em&gt;, igual que un
joven puede decidir pintar o esculpir una obra, de la misma manera ese
mismo joven puede crear un sistema.&lt;br /&gt;
Así de versatil, libre y creativa es nuestra carrera y no esta límitada
solo por quienes el CPIC dice.&lt;br /&gt;
Si esto fuera como el CPIC insiste y dicta, entonces los creadores de
Facebook, Apple, Microsoft, Dell y millones de empresas más estarían en
las carceles, porque ninguno de ellos se graduó de la universidad,
como lo estipula el CPIC.  &lt;/p&gt;

&lt;p&gt;Las consecuencias de permitir que esta ley se apruebe son tan nefastas
que harían que miles de buenos profesionales no graduados se conviertan
en criminales si continuan ejerciendo la carrera y perderan sus
trabajos, empresas perderan sus empleados, la cantidad de profesionales
que se requieren no se podrá suplir, muchas empresas se irán del país,
personas honestas, justas y trabajadoras serás criminales por ejercer
aquello en lo que han demostrado ser excelentes, los jovenes no podran
ser creativos en esta area, porque estarían cometiendo un crimen.&lt;br /&gt;
En este momento los ingresos de divisas en el país generados por esta
área son mayores a los del cafe, banano o cualquier otro producto, y con
menos costos y mayores beneficios para el país.  &lt;/p&gt;

&lt;p&gt;Realmente queremos cercenar la creatividad, convertir un trabajo
honesto en un crimen y traer tantos problemas económicos y sociales al
país?  &lt;/p&gt;

&lt;p&gt;Mientras paises desarrollados invierten miles de millones de dolares en
incentivar a los niños y jovenes a crear proyectos en el area de
tecnologias de información, en programar y crear, Costa Rica intenta
declarar esto un crimen.  &lt;/p&gt;

&lt;p&gt;Es nuestra obligación cívica detener semejante atrocidad, los proyectos
del CPIC deben ser sacados de la asamblea.  &lt;/p&gt;

&lt;p&gt;Recursos:  &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.asamblea.go.cr/sil_access/ver_texto_base.aspx?Numero_Proyecto=18919&quot;&gt;Proyecto de ley 18919 - Obligatoriedad de pertenecer al
CPIC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://secure.avaaz.org/es/petition/Diputados_de_la_Comision_de_Asuntos_Sociales_Asamblea_Legislativa_No_a_la_obligatoriedad_a_pertenecer_al_CPIC_Expediente/?shSIUcb&quot;&gt;Firmas en oposición al proyecto de
ley&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://code.org&quot;&gt;Proyecto de gobierno y empresas para incentivar a los niños y jovenes a
programar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.helloruby.com&quot;&gt;Proyecto de libro de cuentos y trabajo para enseñar a los niños a
programar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.codemonkeyplanet.com&quot;&gt;Proyecto de juego de mesa para enseñar a los niños y jovenes las
bases de programación&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
      
    
      
        <item>
          <title>CPIC quiere restringir la innovación, la creatividad y la tecnología.</title>
          <link>http://www.profesional.co.cr/es/2014/06/30/cpic-restringe-tecnologia-innovacion-creatividad/</link>
          <pubDate>Mon, 30 Jun 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/06/30/cpic-restringe-tecnologia-innovacion-creatividad/</guid>
          <description>&lt;p&gt;En los inicios la computación eran unos y ceros y tarjetas perforadas
ingresadas en mainframes.&lt;br /&gt;
Hace poco mas de 3 de décadas la computación estaba limitada a sistemas
científicos, militares o corporativos.  &lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/Informatica-Libre-logo2.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ser parte de ese mundo esta limitado principalmente, pero aún entonces
no exclusivamente a un grupo elite de personas formalmente capacitadas o
a científicos de varias areas y definitivamente, solo si pertenecías a
una institución tan grande para justificar tener una computadora.&lt;br /&gt;
Luego la computación se convirtió en sistemas personales, aunque tomó un
poco de tiempo poder empezar a explotar el potencial de esto.&lt;br /&gt;
Los años pasaron, pero la velocidad con que se dieron los cambios fue
exponencial, hoy en día en dispositivos que andamos en los bolsillos
tenemos mas poder que el que aquellos mainframes tenían.&lt;br /&gt;
La computación dejó de ser algo exclusivo y ya son varias las décadas en
que jóvenes entusiastas han desarrollado sistemas que han cambiado el
mundo, de tal manera que no imaginamos nuestra actualidad sin estos
sistemas.&lt;br /&gt;
Grandes mentes han sido, muchos pasaron por universidades, pero muchas
mas empezaron en su cuarto o un garage antes de terminar el colegio y
algunas de estas mentes ni siquiera se educaron formalmente.&lt;br /&gt;
Hoy en día hay jóvenes de 12 años dando cátedras de tecnología en
conferencias internacionales, jóvenes llenos de acné desarrollando y
creando ideas y sistemas que impresionan a mas de un científico.&lt;br /&gt;
Los sistemas código abierto han cambiado el mundo, dando plataformas y
librerías para aquel que quiera hacer algo con ellas.&lt;br /&gt;
Los artículos e información, incluso libros técnicos completos son
desarrollados de manera abierta, completamente accesibles al mundo sin
costo alguno.&lt;br /&gt;
La información no esta restringida al mejor postor, o restringida en las
librerías de las universidades, o encerrada en las corporaciones, la
información e invenciones son ahora publicas, libres y mutables.&lt;br /&gt;
La tecnología e información se crea por multitudes en conjunto.&lt;br /&gt;
Los proyectos ahora crecen sin un inversionista que quiera controlar el
mercado, sino por la suma de pequeños aportes de los interesados en el
proyecto.&lt;br /&gt;
El mundo ha cambiado, la tecnología, las ideas, la invención y la
información ya no esta en manos de pocos, sino que es libre, libre de
iniciarse en la mente de uno y continuarse en la mente de otro al otro
lado del mundo.&lt;br /&gt;
Los niños y jóvenes hoy crean, inventan en areas tan complejas que antes
solo científicos especializados podían hacerlo.&lt;br /&gt;
En los años recientes hemos tenido a estudiantes de colegio competir a
nivel mundial con proyectos y experimentos ganando trofeos y preseas por
sus grandes ideas.  &lt;/p&gt;

&lt;p&gt;Pero hoy, aquellos que se dicen llamar “colegas” de nuestra area y
refugiados detrás de un nombre que implica el amor y pasión por la
tecnología han olvidado sus raíces y sus pasiones, encontrando ahora la
única pasión por el dinero y poder.&lt;br /&gt;
El Colegio de Profesionales en Informatica y Computación se atreve a
crear una ley para controlar quien puede y quien no puede crear e
innovar en tecnología, dejando claramente a grandes mentes por fuera,
porque son incapaces de aceptar que una gran idea e implementación puede
venir de cualquiera.&lt;br /&gt;
Eso no quiere decir que cualquiera tendrá una gran idea, sino que quien
tendrá una gran idea puede venir de cualquier lugar, y eso incluso puede
ser una escuela.&lt;br /&gt;
Para el esquema del CPIC, estas ideas elaboradas en colegios por
ejemplo, y que son tan buenas que ganan a nivel mundial, para ellos son
delito, es un crimen, y de efectuarse una vez impuesta la ley deberán
ser penados con cárcel.  &lt;/p&gt;

&lt;p&gt;El crimen aquí sería darle ese poder al CPIC.&lt;/p&gt;

&lt;p&gt;Recursos:  &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.asamblea.go.cr/sil_access/ver_texto_base.aspx?Numero_Proyecto=18919&quot;&gt;Proyecto de ley 18919 - Obligatoriedad de pertenecer al
CPIC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://secure.avaaz.org/es/petition/Diputados_de_la_Comision_de_Asuntos_Sociales_Asamblea_Legislativa_No_a_la_obligatoriedad_a_pertenecer_al_CPIC_Expediente/?shSIUcb&quot;&gt;Firmas en oposición al proyecto de
ley&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://code.org&quot;&gt;Proyecto de gobierno y empresas para incentivar a los niños y jovenes a
programar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.helloruby.com&quot;&gt;Proyecto de libro de cuentos y trabajo para enseñar a los niños a
programar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.codemonkeyplanet.com&quot;&gt;Proyecto de juego de mesa para enseñar a los niños y jovenes las bases de programación&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Drupal y alto rendimiento</title>
          <link>http://www.profesional.co.cr/es/2014/02/28/drupal-alto-rendimiento/</link>
          <pubDate>Fri, 28 Feb 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/02/28/drupal-alto-rendimiento/</guid>
          <description>&lt;p&gt;Información complementaria de la charla de Drupal y Alto Rendimiento
ofrecida hoy. &lt;br /&gt;
Pronto colocaré aquí mismo la charla completa, pero por mientras unos
links.&lt;/p&gt;

&lt;h2 id=&quot;modulos-de-drupal&quot;&gt;Modulos de Drupal:&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/boost&quot;&gt;Boost&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/authcache&quot;&gt;AuthCache&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/cdn&quot;&gt;CDN&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/simplecdn&quot;&gt;SimpleCDN&lt;/a&gt; (Only Drupal 6)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drupal.org/project/cacherouter&quot;&gt;CacheRouter&lt;/a&gt; (Only Drupal 5 and 6)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;otras-referencias&quot;&gt;Otras referencias:&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.varnish-cache.org/trac/wiki/ESIfeatures&quot;&gt;ESI Language&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://php.net/manual/es/book.apc.php&quot;&gt;APC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://eaccelerator.net&quot;&gt;eAccelerator&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://xcache.lighttpd.net&quot;&gt;XCache&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://memcached.org&quot;&gt;Memcached&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.fastcgi.com/drupal/&quot;&gt;FastCGI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://nginx.org&quot;&gt;nginx&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.varnish-cache.org&quot;&gt;Varnish&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developers.google.com/speed/pagespeed/&quot;&gt;Google PageSpeed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.profesional.co.cr/es/2009/12/03/tutorial-content-delivery-network-cdn-1469/&quot;&gt;Tutorial de CDN&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.profesional.co.cr/es/book/drupal-y-content-delivery-network-cdn/&quot;&gt;CDN y Drupal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;mysql-tunning-scripts&quot;&gt;MySQL Tunning Scripts&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/major/MySQLTuner-perl&quot;&gt;MySQLTuner by Major Hayden&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.day32.com/MySQL/&quot;&gt;MySQL Tuning Primer by Matthew Montgomery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suscribase para saber cuando el contenido completo estará disponible.&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
    
      
        <item>
          <title>¿Como usar el Cache de Drupal en los módulos?</title>
          <link>http://www.profesional.co.cr/es/2014/02/17/como-hacer-cache-datos-drupal/</link>
          <pubDate>Mon, 17 Feb 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/02/17/como-hacer-cache-datos-drupal/</guid>
          <description>&lt;p&gt;Reducir la cantidad de veces que se solicita o calcula un dato es una
forma de optimizar el rendimiento de una funcionalidad y realmente
necesario.&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/drupal-fast.png&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;formas-de-cache&quot;&gt;Formas de cache&lt;/h2&gt;
&lt;p&gt;Vamos a hablar de 2 diferentes tecnicas de cache que se pueden utilizar
en &lt;strong&gt;Drupal&lt;/strong&gt;, primero el uso de datos &lt;strong&gt;estáticos&lt;/strong&gt; y luego el &lt;strong&gt;Cache de Drupal&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;niveles-de-variables-o-scopes&quot;&gt;Niveles de variables (o scopes)&lt;/h2&gt;
&lt;p&gt;En la mayoría de las plataformas web existen varios niveles en los que
se pueden guardar las variables más allá de las variables de una función
o una clase, estos son ambientes o scopes.&lt;br /&gt;
Existen normalmente 4 niveles de estos scopes: &lt;strong&gt;Request&lt;/strong&gt;, &lt;strong&gt;Sesión&lt;/strong&gt;,
&lt;strong&gt;Aplicación&lt;/strong&gt; y &lt;strong&gt;Servidor&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;variables-de-request&quot;&gt;Variables de Request&lt;/h3&gt;
&lt;p&gt;Las variables de request son aquellas que permanecen vigentes durante la
solicitud que se hizo al servidor y dejan de existir en el momento en
que la ejecucion de la solicitud termina.&lt;br /&gt;
Este es el nivel normal que tenemos en PHP incluso si utilizamos
variables estaticas, patrones como Singleton, y cualquier otro intento
por código de mantener un dato vigente en memoria.&lt;/p&gt;

&lt;h3 id=&quot;variables-de-sesin&quot;&gt;Variables de Sesión&lt;/h3&gt;
&lt;p&gt;En PHP se pueden guardar datos en las sesión del usuario y estos datos
son solo para ese usuario en esa sesión y permaneceran vigentes durante
la duración total de esa sesión.&lt;br /&gt;
Esto es muy util para mantener información que el usuario requiera para
darle continuidad al uso sobre el sitio.&lt;/p&gt;

&lt;h3 id=&quot;variables-de-servidor&quot;&gt;Variables de Servidor&lt;/h3&gt;
&lt;p&gt;PHP por defecto no es capaz de mantener datos a nivel del servidor como
sí lo hacen otras tecnologías, pero eso no quiere decir que no se pueda
lograr.&lt;br /&gt;
En PHP se puede emular las variables de servidor guardando los datos en
una base de datos (que funcione solo para ese servidor), guardando los
datos en archivos o utilizando diccionarios como Redit, APC, Memcache o
similares (que funcionen solo para ese servidor).&lt;br /&gt;
Las variables de servidor se identifican porque pertenecen solo a lo que
este corriendo en ese servidor, no necesariamente son exclusivas de la
aplicación, por lo que podría utilizarse para compartir datos globales
entre aplicaciones.&lt;br /&gt;
Los datos suelen ser volátiles por definición y se suelen perder al
reiniciarse el servidor.  &lt;/p&gt;

&lt;h3 id=&quot;variables-de-aplicacin&quot;&gt;Variables de Aplicación&lt;/h3&gt;
&lt;p&gt;Muy similarmente a las variables de servidor, estas no son soportadas
por defecto en PHP, pero puede ser implementado de la misma manera que
se implementan las de servidor.&lt;br /&gt;
La diferencia conceptual de estas variables es que no se comparten entre
aplicaciones, pero por el otro lado sí podrían ser compartidas entre
servidores que esten sirviendo la misma aplicación.&lt;/p&gt;

&lt;h2 id=&quot;para-que-ocupo-hacer-cache-de-datos&quot;&gt;¿Para que ocupo hacer cache de datos?&lt;/h2&gt;
&lt;p&gt;Cada vez que hacemos una solicitud de datos o cierto tipo de calculos
eso cuesta recursos.&lt;br /&gt;
Las solicitudes a una base datos requieren memoria, CPU y en la mayoría
de los casos también lectura del disco duro.&lt;br /&gt;
La interpretación de archivos o los calculos matématicos complejos entre
otros tienen un peso grande en el rendimiento también.&lt;br /&gt;
Esto no suele ser mucho problema una vez, pero cuando se sirve un sitio
y se tiene gran tráfico esto puede tener un impácto muy grande en el
rendimiento del servidor y el tiempo de respuesta.&lt;br /&gt;
Reduciendo la cantidad de solicitudes o calculos que se hagan se
multiplica las ventajas en rendimiento y tiempo de respuesta.&lt;br /&gt;
De ahí que si por ejemplo podemos reducir la cantidad de archivos de
código o templates a usar a un 10% en el 90% de los requests o similar
para las solicitudes de base de datos, podríamos ver el rendimiento del
sitio mejorado drasticamente, o en su defecto, el no hacerlo podría
significar el tener un sitio lento e incluso que no soporte una cantidad
decente de tráfico.&lt;br /&gt;
Claro que, todo siempre tiene un costo, el mantener más datos en cache
implica que se debe utilizar más memoria para mantenerlos disponibles,
lo cual podría estar limitado por los recursos de RAM del servidor.&lt;br /&gt;
Por esta razón es que se debe tener cuidado y ser conciente de los
recuros o se puede empezar a tener un problema de disponibilidad de
cache, teniendo que recurrir al swap o memorial virtual en disco,
haciendo que todo el servidor se vuelva más pesado y lento.&lt;/p&gt;

&lt;h2 id=&quot;datos-estticos&quot;&gt;Datos estáticos&lt;/h2&gt;
&lt;p&gt;Ahora que conocemos los diferentes niveles de las variables veamos los
datos estáticos.
A travez de funcionalidad &lt;em&gt;“static”&lt;/em&gt; de PHP podemos mantener datos de
manera persistente durante la ejecución del código (variables de
request), permitiendonos ahorrar solicitudes o calculos repetitivos o
costosos.
En el caso de Drupal 7 se puede utilizar la función &lt;code&gt;drupal_static&lt;/code&gt; para
mantener estos datos.
La función &lt;code&gt;drupal_static&lt;/code&gt; recibe el &lt;code&gt;nombre&lt;/code&gt; o llave de los datos, el
&lt;code&gt;valor defecto&lt;/code&gt; y si deben &lt;code&gt;limpiarse&lt;/code&gt; los datos.
En ese sentido esta función puede verse un poco como el set de funciones
de Drupal de variable_get/set.
### Uso en Drupal 7 para datos exclusivos de una función:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function mi_funcion() {
  // Se utiliza el nombre de la función como llave
  $lista_datos = &amp;amp;drupal_static(__FUNCTION__);

  // Si los datos no han sido solicitados aún se solicitan
  if (!isset($lista_datos) {
    // Se obtienen los datos de la base de datos y efectuan los calculos
  }
  // La segunda vez que se llame a la función los datos ya estaran definidos y no requerirá solicitarlos de nuevo

  // Se utiliza $lista_datos y se modifican los datos en la variable
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;uso-en-drupal-7-compartiendo-los-datos-entre-funciones&quot;&gt;Uso en Drupal 7 compartiendo los datos entre funciones:&lt;/h3&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function una_funcion() {
  $lista_datos = &amp;amp;drupal_static(&amp;quot;datos compartidos&amp;quot;);
  // Se utiliza $lista_datos y se modifican los datos en la variable
}

function otra_funcion() {
  $lista_datos = &amp;amp;drupal_static(&amp;quot;datos compartidos&amp;quot;);
  // Se utiliza $lista_datos y se modifican los datos en la variable
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;uso-en-drupal-6-para-datos-exclusivos-de-una-funcin&quot;&gt;Uso en Drupal 6 para datos exclusivos de una función:&lt;/h3&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function mi_funcion() {
  // Se utiliza el nombre de la función como llave
  static $lista_datos;

  // Si los datos no han sido solicitados aún se solicitan
  if (!isset($lista_datos) {
    // Se obtienen los datos de la base de datos y efectuan los calculos
  }
  // La segunda vez que se llame a la función los datos ya estaran definidos y no requerirá solicitarlos de nuevo

  // Se utiliza $lista_datos y se modifican los datos en la variable
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;uso-en-drupal-6-compartiendo-los-datos-entre-funciones&quot;&gt;Uso en Drupal 6 compartiendo los datos entre funciones:&lt;/h3&gt;
&lt;p&gt;En Drupal 6 hay que hacer un ajuste, ya que la función static solo
aplica a la función (o clase) y no puede compartirse.&lt;br /&gt;
Para esto hay 2 opciones, usar una variable global o crear una función
intermedia para obtener una referencia a la variable estática que esta
en esa función.  &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function una_funcion() {
  global $lista_datos;
  // Se utiliza $lista_datos y se modifican los datos en la variable
}

function otra_funcion() {
  global $lista_datos;
  // Se utiliza $lista_datos y se modifican los datos en la variable
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;cache-de-drupal&quot;&gt;Cache de Drupal&lt;/h2&gt;
&lt;p&gt;Drupal tiene una serie de funciones para utilizar un sistema de cache
generico que esta implementado.&lt;br /&gt;
El cache de Drupal viene por defecto implementado en la base de datos,
pero puede cambiarse para que utilicen alguna otra implementación como
APC, Memcache, Redit, Archivos, etc.&lt;br /&gt;
En un próximo artículo les explicaré como configurar diferentes
implementaciones del cache de Drupal.&lt;br /&gt;
La ventaja de cache de Drupal es que la implementación es agnostica para
el código, al momento de trabajar con el código no se sabe cual es la
implementación y realmente es irrelevante.&lt;br /&gt;
Si tenemos que hacer una serie de calculos muy pesados sobre unos datos
y estos datos se mantienen constantes para el sitio durante un tiempo
determinado, podemos hacer algo como lo siguiente para evitar
calcularlos en cada solicitud:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function calcular_datos_pesados() {
  $datos_calculados = drupal_static(__FUNCTION__); // Drupal 7 version
  //static $datos_calculados; // Drupal 6 version

  if (!isset($datos_calculados)) {
    if ($cache = cache_get(&amp;quot;datos_pesados&amp;quot;)) {
      $datos_calculados = $cache-&amp;gt;data;
    } else {
      // Hacer todos los calculos necesarios en los datos y coloquelos en $datos_pesados
      cache_set(&amp;quot;datos_pesados&amp;quot;, $datos_pesados, &amp;quot;cache&amp;quot;);
    }
  }
  return $datos_calculados;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De esta manera los datos no se tendran que calcular ni durante la misma
solicitud varias veces, ni tampoco en otras solicitudes durante un
tiempo.&lt;/p&gt;

&lt;p&gt;Es aconsejable el uso de cache, sin abusar y teniendo en cuenta
estimaciones de cuanto puede afectar en la mejoría del rendimiento, pero
esto puede ser la diferencia entre el sitio pesado y lento o el sitio
agil y veloz.&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
        <item>
          <title>¿Qué es Markdown?</title>
          <link>http://www.profesional.co.cr/es/2014/02/11/que-es-markdown/</link>
          <pubDate>Tue, 11 Feb 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/02/11/que-es-markdown/</guid>
          <description>&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt; es un lenguaje de marcado ligero, es una forma sencilla de
escribir y dar estilo a un texto y es una de las formas de escribir
contenido en Jekyll.&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/markdown.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt; es sencillo de escribir y de leer, es un formato que es
facil de convertir a otros formatos como HTML, PDF, etc.&lt;br /&gt;
La sencillez de &lt;strong&gt;Markdown&lt;/strong&gt; restringe sea de paso, el que se complique
el texto, al permitir un estilo sencillo.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota:&lt;/em&gt; En Jekyll los archivos de contenido son encabezados por YAML y
pueden contener &lt;em&gt;HTML&lt;/em&gt; y tags &lt;em&gt;liquid&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;formato-de-texto-en-markdown&quot;&gt;Formato de texto en Markdown&lt;/h2&gt;
&lt;p&gt;En &lt;strong&gt;Markdown&lt;/strong&gt; se le puede dar formato al texto usando las siguientes
opciones:&lt;/p&gt;

&lt;h3 id=&quot;texto-con-nfasis&quot;&gt;Texto con énfasis&lt;/h3&gt;
&lt;p&gt;Se le agrega énfasis al texto encerrandolo entre asteriscos “*” o subrayado “_”  &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;*énfasis*, o _énfasis_ (normalmente se convierte a cursiva)
**énfasis fuerte**, o __énfasis fuerte__ (normalmente se convierte a negrita)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;ttulos-o-encabezados&quot;&gt;Títulos o encabezados&lt;/h3&gt;
&lt;p&gt;El estilo de los encabezados se da precediendo el texto con almohadillas “#”,
de manera que a menor cantidad de almohadillas mayor la prioridad  &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;# Primer nivel
## Segundo nivel
### Tercer nivel
...
###### Sexto nivel&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pero además los primeros 2 niveles se pueden definir usando una linea de
caracteres de igual “=” o resta “-“  &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;Primer nivel
============

Segundo nivel
-------------&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;listas&quot;&gt;Listas&lt;/h3&gt;
&lt;p&gt;Las listas se definen usando un asterisco “*” 0 un menos “-“ y un
espacio antes de la linea para listas no numeradas y un numero con un
punto y un espacio para las listas numeradas.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;* Rojo
* Amarillo
* Verde
* Azul

1. Primer elemento
2. Segundo elemento
3. Tercer elemento&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;cdigo&quot;&gt;Código&lt;/h3&gt;
&lt;p&gt;Para cuando se quiere definir código en el texto se usan el caracter
“`” tanto para código en la misma linea o encerrado en 3 caracteres
consecutivos para código de varias lineas.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;Este código `hola` esta en la misma línea que el texto.

```
Código de varias
  lineas que
  respeta tabs y
espacios
```&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En &lt;strong&gt;Jekyll&lt;/strong&gt; se puede usar también pigmentos (pygments) para hacer
destacado de sintaxis.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;{% highlight sql %}
SELECT * FROM TABLE
{% endhighlight %}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;citas&quot;&gt;Citas&lt;/h3&gt;
&lt;p&gt;Las citas de texto se preceden con el caracter mayor que “&amp;gt;” antes de
cada linea.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; Esta es una cita que en HTML será convertida a un &amp;quot;blockquote&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;enlaces&quot;&gt;Enlaces&lt;/h3&gt;
&lt;p&gt;Los enlaces se crean encerrando el texto en parentesis cuadrados junto
al enlace entre parentesis redondos y opcionalmente el título del enlace
entre comillas junto al enlace.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;[Este es un enlace](http://www.elsitio.com &amp;quot;Titulo va aquí&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;imagenes&quot;&gt;Imagenes&lt;/h3&gt;
&lt;p&gt;Las imágenes se escriben parecido a los enlaces pero precedidos por un
signo de exclamación “!”&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;![Texto alternativo](http://www.elsitio.com/imagen.png &amp;quot;Titulo de la
imágen&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De esta manera se tiene un código muy sencillo para escribir texto con
estilo.&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
    
      
        <item>
          <title>Posts y Drafts en Jekyll</title>
          <link>http://www.profesional.co.cr/es/2014/02/03/posts-y-drafts-jekyll/</link>
          <pubDate>Mon, 03 Feb 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/02/03/posts-y-drafts-jekyll/</guid>
          <description>&lt;p&gt;En esta tercera parte les explicaré como trabajar con posts y drafts en Jekyll.&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/jekyll-logo.png&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;front-matter&quot;&gt;Front-matter&lt;/h2&gt;
&lt;p&gt;Cualquier archivo que contenga un bloque YAML al inicio del archivo será procesado por Jekyll de manera especial.
Esto aplica tanto para posts como para archivos HTML, XMLs o cualquiera.
Un ejemplo de un bloque &lt;strong&gt;front-matter&lt;/strong&gt; es el siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;---
layout: post
title: This is a cool post
---&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lo que se ponga dentro del bloque de 3 lineas horizontales &lt;code&gt;---&lt;/code&gt; es considerado un bloque YAML.
Esta información se utilizará en Jekyll y estará disponible en durante el archivo y en los documentos que se vinculen a éste, además de que el archivo tendrá a disposición tags &lt;strong&gt;Liquid&lt;/strong&gt;.
Si desea usar los tags &lt;strong&gt;Liquid&lt;/strong&gt;, pero no ocupa usar el YAML aún puede definir el bloque vacío para que Jekyll lo interprete.&lt;/p&gt;

&lt;h2 id=&quot;posts-y-drafts&quot;&gt;Posts y drafts&lt;/h2&gt;
&lt;p&gt;Los posts son el contenido que ponemos normalmente en el directorio &lt;code&gt;_posts&lt;/code&gt; y están escritos en lenguajes como Markdown u alguna otra opción, pero aquí solo explicaré el lenguaje Markdown por su simplicidad y limpieza de código.&lt;/p&gt;

&lt;h3 id=&quot;posts&quot;&gt;Posts&lt;/h3&gt;
&lt;p&gt;Los posts se nombran por estándar en el siguiente formato:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;AÑO-MES-DIA-titulo.FORMATO&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Donde AÑO es un numero de 4 dígitos, y MES y DIA son números de 2 dígitos, y FORMATO es la extensión en que esta escrito el contenido, por ejemplo:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;2014-01-28-hola-mundo.md
2013-12-24-navidad-de-rudolf.textile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Los posts deben empezar con un bloque Front-matter YAML.&lt;/p&gt;

&lt;h3 id=&quot;drafts&quot;&gt;Drafts&lt;/h3&gt;
&lt;p&gt;Los drafts son archivos iguales a los posts pero que residen en el directorio &lt;code&gt;_drafts&lt;/code&gt; y no tienen fecha en su nombre ya que aún no han sido publicados.
Estos archivos serán ignorados por el proceso de construcción de Jekyll por defecto, esto para permitir tener separados los documentos publicados, de aquellos que no han sido publicados.
Cuando decida publicarlos los mueve de _drafts a _posts y les asigna una fecha de publicación en el nombre del archivo.&lt;/p&gt;

&lt;h2 id=&quot;el-post&quot;&gt;El post&lt;/h2&gt;
&lt;p&gt;Un ejemplo de un post (o draft) es el siguiente&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;---
title: Hola Mundo
layout: post
---
En las primeras lineas podemos colocar un resumen que separaremos por 2 enter.

## Un subtitulo puede aparecer
Y luego mucho más contenido&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En este ejemplo se define un titulo para el archivo y el layout que en este caso es &lt;code&gt;_layouts/post.html&lt;/code&gt;.
Las primeras lineas antes de los primeros 2 enter quedan en la variable &lt;code&gt;excerpt&lt;/code&gt; y son el resumen.&lt;/p&gt;

&lt;p&gt;En las próximas partes de la serie les explicaré sobre Markdown y como compilar Jekyll para generar el sitio.&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>¿Como trabajar con Jekyll?</title>
          <link>http://www.profesional.co.cr/es/2014/01/28/como-trabajar-con-jekyll/</link>
          <pubDate>Tue, 28 Jan 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/01/28/como-trabajar-con-jekyll/</guid>
          <description>&lt;p&gt;Ya que entendemos porque puede ser una opción razonable trabajar con Jekyll
ahora puedo explicarles como fue que lo hicé.&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/jekyll-logo.png&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;instalacin-y-configuracin-de-jekyll&quot;&gt;Instalación y configuración de Jekyll&lt;/h2&gt;
&lt;p&gt;No pienso repetir lo que se encuentra en el sitio oficial, así que para las
instrucciones básicas de instalación pueden revisar la 
&lt;a href=&quot;http://jekyllrb.com/docs/quickstart/&quot;&gt;guía&lt;/a&gt;.&lt;br /&gt;
El código completo de mi blog puede verse en mi repositorio en
&lt;a href=&quot;https://github.com/nestormata/my-static-blog/&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;estructura-de-directorios&quot;&gt;Estructura de directorios&lt;/h2&gt;
&lt;p&gt;Preferí separar el codigo de la configuración para lo cual moví el archivo
de configuracion &lt;strong&gt;_config.yml&lt;/strong&gt; al directorio raíz y el código del sitio a
&lt;strong&gt;/src&lt;/strong&gt; además de mover el destino al directorio &lt;strong&gt;/build&lt;/strong&gt;, de esta manera
puedo tener mi codigo más ordenado.&lt;/p&gt;

&lt;p&gt;Para que esto tenga efecto tuve que modificar las opciones en el
&lt;strong&gt;_config.yml&lt;/strong&gt; de la siguiente manera:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;source:       ./src
destination:  ./build
layouts:      ./_layouts
plugins:      ./src/_plugins&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De manera que el codigo queda estructurado como a continuación:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;/
|- _layout.yaml
|- /src
|  |- .htaccess
|  |- index.html
|  |- robots.txt
|  |- humans.txt
|  |- 404error.html
|  |- rss.xml
|  |- sitemap.xml
|  |- /_assets
|  |  |- /css
|  |  |- /js
|  |- /_data
|  |- /_drafts
|  |- /_posts
|  |- /_layouts
|  |- /_includes
|  |- /_components
|  |- /_locales
|  |- /_plugins
|  |- /images
|  |- /es
|  |  |- index.html
|  |  |- rss.xml
|  |  |- /_drafts
|  |  |- /_posts
|- /build&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Algunos de estos archivos y directorios serán explicados más adelante en la serie.&lt;/p&gt;

&lt;h3 id=&quot;beneficios-de-esta-estructura&quot;&gt;Beneficios de esta estructura:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;La configuración queda en un directorio raíz junto con cualquier archivo que necesite y que no se
requiera ser exportado junto con el sitio.&lt;/li&gt;
  &lt;li&gt;El codigo esta en un directorio &lt;strong&gt;/src&lt;/strong&gt; y los archivos generados quedan en
el directorio &lt;strong&gt;/build&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Dentro del directorio de cada lenguaje adicional al default tengo un
directorio para &lt;strong&gt;posts&lt;/strong&gt; y &lt;strong&gt;drafts&lt;/strong&gt; &lt;em&gt;(luego explicaré como trabajar con
diferentes lenguajes)&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Los archivos &lt;strong&gt;JavaScript&lt;/strong&gt; y &lt;strong&gt;CSS&lt;/strong&gt; serán preprocesados para &lt;strong&gt;SASS&lt;/strong&gt;,
unirlos, minificarlos y comprimirlos &lt;em&gt;(luego explicaré como se logra esto)&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Los componentes quedan separados, por ejemplo los archivos de
&lt;a href=&quot;http://foundation.zurb.com/&quot;&gt;Foundation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Pronto la continuación de esta serie con más detalles.&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>¿Por qué usar Jekyll en mi blog?</title>
          <link>http://www.profesional.co.cr/es/2014/01/27/por-que-usar-jekyll-en-mi-blog/</link>
          <pubDate>Mon, 27 Jan 2014 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2014/01/27/por-que-usar-jekyll-en-mi-blog/</guid>
          <description>&lt;p&gt;&lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; es un generador estático diseñado para blogs.&lt;br /&gt;
¿Por qué esto es mejor que un sistema dinámico como &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; o &lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt;?&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/jekyll-logo.png&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;por-qu-jekyll&quot;&gt;¿Por qué Jekyll?&lt;/h2&gt;
&lt;p&gt;Realmente no creo que uno sea mejor que el otro, simplemente son diferentes soluciones al mismo problema y depende de las
necesidades de cada quien para saber cual deberiamos utilizar. &lt;br /&gt;
De hecho, no recomendaría &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; a cualquiera, Jekyll normalmente (a menos que se desarrolle alguna interfaz web para manejarlo)
requiere que se trabaje desde una consola y requiere configuraciones que no son sencillas para cualquier usuario final.&lt;br /&gt;
De esta manera es que, si el blog va a ser para usuarios no tecnicos posiblemente esta no es la opción para ellos, claro que se
podría desarrollar una solución para eso.&lt;/p&gt;

&lt;p&gt;Dicho eso, posiblemente la mayor ventaja que tiene un generador estático sobre un framework dinámico esta en que requiere menos
menos recursos para su ejecución y permite inclusive ser puesto a funcionar directamente en CDNs u opciones gratuitas o economicas
de hosting, lo cual es una gran ventaja en redimiento y costo operativo de un sitio.&lt;/p&gt;

&lt;p&gt;Para cualquier caracteristica adicional que se quiera agregar al sitio y cumpla una función más dinámica aún se puede utilizar
el generador estático junto con otras opciones como Node.js o cualquier aplicación en cualquier otro lenguaje o plataforma.&lt;/p&gt;

&lt;p&gt;Además de esto, Jekyll esta desarrollado en &lt;a href=&quot;https://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; y puede ser facilmente extendido a través de plugins.&lt;/p&gt;

&lt;p&gt;Personalmente la desición de migrar mi sitio a Jekyll corresponde a 3 razones:
- &lt;strong&gt;Rendimiento de mi sitio&lt;/strong&gt;: quiero que mi sitio sea lo más rápido posible y no hay nada que sobrepase a archivos estáticos.
- &lt;strong&gt;Experimentación&lt;/strong&gt;: Mi blog ha sido y continúa siendo un sandbox donde experimento en el mundo real con tecnologías que quiero aprender.
- &lt;strong&gt;Bajo mantenimiento&lt;/strong&gt;: Una vez configurado Jekyll el mantenimiento el literalmente mínimo y puedo enfocarme en escribir más seguido.&lt;/p&gt;

&lt;p&gt;El código de mi blog puede ser encontrado en &lt;a href=&quot;https://github.com/nestormata/my-static-blog&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
        <item>
          <title>Como indexar información extra en Drupal 6 y 7</title>
          <link>http://www.profesional.co.cr/es/desarrollo/como-indexar-informacion-extra-drupal-6-y-7/</link>
          <pubDate>Mon, 16 Sep 2013 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/desarrollo/como-indexar-informacion-extra-drupal-6-y-7/</guid>
          <description>&lt;p&gt;Es muy sencillo agregar palabras para ser indexadas en un nodo o entidad en Drupal de manera que el nodo se encuentre por estas palabras aún si estas palabras no se encuentran en el texto o si se desea agregarles mayor relevancia.&lt;/p&gt;

&lt;p&gt;Antes de empezar a escribir código (el cual será muy sencillo) necesitamos entender un poco sobre como trabaja, lo cual nos lleva a hablar un poco sobre motores de búsqueda.&lt;/p&gt;

&lt;p&gt;Los motores de búsqueda tienen 2 grandes partes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;El indexador:&lt;/strong&gt; este es probablemente la parte más importante y la más mágica (y por mágica me refiero a matemática).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;El buscador:&lt;/strong&gt; este es la parte que trabaja en el momento en que hacemos una búsqueda y si esta parte trabaja bien es porque todo el trabajo duro fue llevado a cabo por el indexador, y adicionalmente una buena arquitectura para guardar los datos y obtenerlos rápido.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En el caso de la búsqueda default de Drupal, &lt;strong&gt;Solr&lt;/strong&gt;, &lt;strong&gt;Sphinx&lt;/strong&gt; y la mayoría de motores de búsqueda que se utilizan con &lt;strong&gt;Drupal&lt;/strong&gt; ellos no guardan realmente los datos, ellos reciben el contenido para poder analizar las palabras y guardan la referencia al nodo que luego Drupal utiliza para armar los resultados.&lt;/p&gt;

&lt;p&gt;Después de analizar los datos las palabras son extraídas y cada una es considerada con una nota basada en cosas como la frecuencia (cuantas veces aparece en el texto) y la relevancia basada en el código HTML que las encierra.&lt;/p&gt;

&lt;p&gt;Por ejemplo, digamos que tenemos lo siguiente en un contenido:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Una palabra que aparece 2 veces en un párrafo&lt;/li&gt;
  &lt;li&gt;Una palabra encerrada en un tag &lt;strong&gt;strong&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Una palabra encerrada en un tag de encabezado 2 (H2)&lt;/li&gt;
  &lt;li&gt;Una palabra encerrada en un tag de encabezado 1 (H1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este caso las notas quedan algo así:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;La palabra en el párrafo obtiene 1 punto por aparición así que 2 puntos en total&lt;/li&gt;
  &lt;li&gt;La palabra encerrada en el tag strong obtiene 3 puntos&lt;/li&gt;
  &lt;li&gt;La palabra encerrada por el H2 obtiene 18 puntos&lt;/li&gt;
  &lt;li&gt;La palabra encerrada por el H1 obtiene 21 puntos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De esta manera cuando se busca utilizando algunas de estas palabras mostrará primero los nodos con mayores notas para esas palabras.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tip: Recuerde dar importancia a lo que usted quiere que la tenga (use strong, heading y otros tags para definir lo que mayor importancia tiene), esto aplica tanto para la búsqueda como para SEO&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;De esa manera el usuario que hace una búsqueda tiene más posibilidades de encontrar lo que esta buscando.&lt;/p&gt;

&lt;p&gt;La lista completa de los puntajes asignados por el proceso de indexación por defecto es la siguiente:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;H1:&lt;/strong&gt; 25 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;H2:&lt;/strong&gt; 18 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;H3:&lt;/strong&gt; 15 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;H4:&lt;/strong&gt; 12 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;H5:&lt;/strong&gt; 9 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;H6:&lt;/strong&gt; 6 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;U, B, I, EM&lt;/strong&gt; y &lt;strong&gt;STRONG:&lt;/strong&gt; 3 puntos&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A:&lt;/strong&gt; 10 puntos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así que las palabras encerradas por esos tags acumularan esos puntajes y habrá más punto cuantas más veces aparezcan o por la anidación de varios de los tags.&lt;/p&gt;

&lt;p&gt;Ahora que tenemos una idea de como funciona podemos manipularlo.&lt;/p&gt;

&lt;p&gt;Digamos que ocupamos agregar un set de palabras o que queremos agregar el nombre completo del autor a la lista de palabras sobre las cuales puedo encontrar cada nodo y queremos asignarle un puntaje alto a estas palabras.&lt;/p&gt;

&lt;p&gt;Esto es sencillo y ocurre en el tiempo de la indexación, no en el tiempo de la busqueda (en el tiempo de busqueda todos los puntajes ya han sido asignados previamente por la indexación).&lt;/p&gt;

&lt;p&gt;Durante el tiempo de indexación ocurren 2 cosas en Drupal (entre otras cosas):
1. Se llama a la operación de vista del nodo para obtener el HTML que se suele desplegar cuando se despliega el nodo y se usa este HTML para procesarlo para la indexación de palabras.
2. Se llama la operación de “update index” en el hook_nodeapi (Drupal 6) o hook_node_update_index (Drupal 7) y el HTML resultante se adjunta al de la vista del nodo para la indexación.&lt;/p&gt;

&lt;p&gt;De esta manera tenemos 2 lugares en los cuales manipular, el primero en la vista del nodo se puede agregar y manipular lo que se devuelve, pero ese mismo HTML será utilizado para el despliegue del nodo.&lt;/p&gt;

&lt;p&gt;Pero si queremos agregar las palabras al indice pero no al despliegue del contenido entonces devolvemos la información en el update index.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo de como hacerlo:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
// Drupal 6
function mimodulo_nodeapi(&amp;amp;$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == &amp;quot;update index&amp;quot;) {
    $author_id = $node-&amp;gt;uid;
    // buscamos la información del nombre completo del profile del autor y lo ponemos en la variable $author_full_name
    return &amp;quot;&amp;lt;h2&amp;gt;&amp;quot; . $author_full_name . &amp;quot;&amp;lt;/h2&amp;gt;&amp;quot;;
  }
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
// Drupal 7
function mimodulo_node_update_index($node) {
  $author_id = $node-&amp;gt;uid;
  / buscamos la información del nombre completo del profile del autor y lo ponemos en la variable $author_full_name
  return &amp;quot;&amp;lt;h2&amp;gt;&amp;quot; . $author_full_name . &amp;quot;&amp;lt;/h2&amp;gt;&amp;quot;;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Con este código el indexador considerará el nombre completo del autor en las palabras con relevancia para el nodo, haciendo que se muestre el nodo en los resultados de buscar el nombre del autor, o el apellido o más aún si se buscan usando ambos (aumentaría el puntaje).&lt;/p&gt;

&lt;p&gt;Con pocas lineas de código logramos agregar más palabras y manipular el puntaje de estas para la indexación de nodos.&lt;/p&gt;

</description>
        </item>
      
    
      
    
      
    
      
        <item>
          <title>Multiples cuentas de Skype al mismo tiempo en Mac OS o Windows</title>
          <link>http://www.profesional.co.cr/es/technology/multiples-cuentas-skype-al-mismo-tiempo-mac-os-o-windows/</link>
          <pubDate>Tue, 15 May 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/technology/multiples-cuentas-skype-al-mismo-tiempo-mac-os-o-windows/</guid>
          <description>&lt;p&gt;Yo uso una cuenta de Skype personal y otra para la compañia para la que trabajo y por lo tanto tuve que encontrar una solución para tener ambas funcionando al mismo tiempo.&lt;/p&gt;

&lt;h2 id=&quot;multiples-instancias-de-skype-en-windows-xpvista7&quot;&gt;Multiples instancias de Skype en Windows XP/Vista/7&lt;/h2&gt;
&lt;p&gt;En Windows is bastante sencillo, solo hay que ejecutar Skype.exe con el parametro /secondary, lo cual se puede hacer creando un atajo en el menu de programas.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Localice el ejecutable de &lt;strong&gt;Skype&lt;/strong&gt; (&lt;code&gt;C:/Program Files(x86)/Skype/Phone/Skype.exe&lt;/code&gt; o &lt;code&gt;C:/Program Files/Skype/Phone/Skype.exe&lt;/code&gt; o algo parecido)&lt;/li&gt;
  &lt;li&gt;Click derecho en el archivo &lt;code&gt;Skype.exe&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Seleccione &lt;em&gt;“Create shortcut”&lt;/em&gt; (“Crear atajo”)&lt;/li&gt;
  &lt;li&gt;Después mueva este atajo a donde usted prefiera (como el &lt;em&gt;Escritorio o el Menu Programas&lt;/em&gt;)&lt;/li&gt;
  &lt;li&gt;Click derecho sobre el atajo, seleccione &lt;em&gt;“Properties”&lt;/em&gt; (“Propiedades”)&lt;/li&gt;
  &lt;li&gt;En el campo &lt;code&gt;&quot;Target&quot;&lt;/code&gt; (“Destino”) agregue &lt;code&gt;/secondary&lt;/code&gt; al final, de esta manera por ejemplo (&lt;code&gt;&quot;C:/Program Files(x86)/Skype/Phone/Skype.exe&quot; /secondary&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;Presione &lt;code&gt;OK&lt;/code&gt; y listo, puede abrir su instancia primaria (o default) de &lt;strong&gt;Skype&lt;/strong&gt; de la manera habitual y la instancia secundaria con este atajo y tener 2 cuentas de Skype funcionando al mismo tiempo una en cada instancia&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;multiples-instancias-de-skype-en-mac-os&quot;&gt;Multiples instancias de Skype en Mac OS&lt;/h2&gt;
&lt;p&gt;En Mac OS es un poco mas complicado ya que el ejecutable no soporta la opción &lt;em&gt;“secondary”&lt;/em&gt;.&lt;br /&gt;
La mejor opción que he encontrado es utilizar una cuenta diferente para iniciar el programa y he solucionado un par de problemas que vienen con esta solución.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Cree un nuevo usuario (solo hay que hacerlo una vez): 
    &lt;ul&gt;
      &lt;li&gt;Vaya a Preferencias del sistem (System Preferences) -&amp;gt; Sistema (System) -&amp;gt; Usuarios y Grupos (Users &amp;amp; Groups)&lt;/li&gt;
      &lt;li&gt;Desbloquee la pantalla si se requiere&lt;/li&gt;
      &lt;li&gt;Click en la señal de + para agregar un nuevo usuario&lt;/li&gt;
      &lt;li&gt;Ejija usuario estandard y llene los datos, puede utilizar la misma clave que utiliza en su usuario actual &lt;em&gt;(recuerde el nombre de la cuenta, la ocupará en los pasos siguientes)&lt;/em&gt;  &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Inicie Skype utilizando la nueva cuenta (hacer esto cada vez que ocupe utilizar su cuenta secundaria de Skype)
    &lt;ul&gt;
      &lt;li&gt;Abra la terminal (Abra el Spotlight y escriba terminal)&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Cambie de usuario, para hacer eso escriba los siguiente en la terminal, remplace &lt;code&gt;otheruser&lt;/code&gt; con el nombre de la cuenta que usted creó.&lt;/p&gt;

        &lt;pre&gt;&lt;code&gt;su otheruser
&lt;/code&gt;&lt;/pre&gt;
      &lt;/li&gt;
      &lt;li&gt;Se le solicitará que ingrese la clave de esta cuenta&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Ejecute Skype, para hacerlo escriba los siguiente en la terminal:&lt;/p&gt;

        &lt;pre&gt;&lt;code&gt;/Applications/Skype.app/Contents/MacOS/Skype
&lt;/code&gt;&lt;/pre&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;em&gt;Nota:&lt;/em&gt; este es un pequeño tip, usted podrá cerrar la terminal una vez que se haya logueado a Skype, le advertirá que el programa se cerrará, pero esto no ocurre, así que pruebe cerrar la ventana de la terminal.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Un ultimo tip es que usted puede crear un directorio compartido para salvar los archivos que alguien le envía a través de Skype, de otra manera usted tendría que loguearse como el otro usuario para poder tener acceso a estos archivos (me dí cuenta después de que alguien me envió unos archivos la primera vez)
    &lt;ol&gt;
      &lt;li&gt;Abra el Finder&lt;/li&gt;
      &lt;li&gt;En el menu seleccione &lt;em&gt;Ir&lt;/em&gt; (Go) -&amp;gt; &lt;em&gt;Ir a folder…&lt;/em&gt; (Go to folder…)&lt;/li&gt;
      &lt;li&gt;Ingrese: &lt;code&gt;/Users/Shared&lt;/code&gt; y presione &lt;em&gt;Ir&lt;/em&gt; (Go)&lt;/li&gt;
      &lt;li&gt;En el menu seleccione &lt;em&gt;Archivo&lt;/em&gt; (File) -&amp;gt; &lt;em&gt;Nuevo Folder&lt;/em&gt; (New Folder) y cree un nuevo folder, lo puede llamar Skype&lt;/li&gt;
      &lt;li&gt;En su segunda instancia de &lt;strong&gt;Skype&lt;/strong&gt; seleccione en el menu &lt;em&gt;Preferencias&lt;/em&gt; (Preferences) -&amp;gt; &lt;em&gt;General&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;Localice la opción &lt;em&gt;“Salvar archivos en:”&lt;/em&gt; (“Save files in:”) y seleccione el directorio compartido que usted creó, ahora cuando le envien archivos estos se salvaran en el directorio compartido. Usted puede agregar el folder compartido a sus favoritos para un rápido acceso&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ol&gt;

</description>
        </item>
      
    
      
    
      
        <item>
          <title>Drupal Deployments y el Ciclo de Desarrollo</title>
          <link>http://www.profesional.co.cr/es/drupal-deployments-y-ciclo-desarrollo/</link>
          <pubDate>Mon, 23 Apr 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/drupal-deployments-y-ciclo-desarrollo/</guid>
          <description>&lt;h2 id=&quot;el-problema&quot;&gt;El problema&lt;/h2&gt;
&lt;p&gt;Cuando trabajamos en nuestro ambiente local, todo esta bien, pero cuando tenemos que desarrollar para sitios en linea, cuando tenemos equipos de trabajo, cuando tenemos múltiples servidor y diferentes ambientes se puede tornar un poco complicado y propenso a errores.&lt;/p&gt;

&lt;p&gt;Para esto hay muchas herramientas y soluciones para poder manejar el proyecto integrado entre equipos de desarrollo, para disminuir los errores y los riesgos y para simplificar los procesos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El problema se puede resumir en:&lt;/strong&gt;
- Integración
- Manejo Versiones
- Seguridad del código
- Pruebas
- Puesta en producción
- A esto en Drupal se le agrega un problema, la configuración y estructura que existe en base de datos y no en código&lt;/p&gt;

&lt;h2 id=&quot;integracin-del-cdigo-y-manejo-de-versiones&quot;&gt;Integración del código y manejo de versiones&lt;/h2&gt;
&lt;p&gt;Estoy seguro que a mas de uno le ha pasado, aunque sea escribiendo un documento en word o programando algo, que se va la luz y se pierde todo el trabajo hecho. &lt;br /&gt;
Y no es de extrañarse que alguien pierda en algún momento trabajo en el que invirtió mucho mas tiempo. &lt;br /&gt;
Tambien, si se ha trabajado en equipos de programación se ha tenido que resolver problemas de conflictos entre lo que se esta haciendo. &lt;br /&gt;
Para esto lo mejor y no hay excusa para no hacerlo, es utilizar un control de versiones como Git o SVN. &lt;br /&gt;
Hay sitios que te permiten tener un control de versiones de manera gratuita como &lt;a href=&quot;http://www.unfuddle.com&quot;&gt;Unfuddle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Con un control versiones se puede:&lt;/strong&gt;
- Mantener el historial de los cambios
- Haciendo sencillo volver a una versión anterior
- Comparar los cambios que pudieron producir un problema
- Integrar el código de varios programadores
- Mantener diferentes versiones en diferentes ambientes
- Crear esquemas de aprobación
- Contribuye como herramienta para el proceso de deployment&lt;/p&gt;

&lt;h2 id=&quot;recomendaciones-del-uso-de-control-de-versiones-en-drupal&quot;&gt;Recomendaciones del uso de control de versiones en Drupal&lt;/h2&gt;
&lt;p&gt;Crear una estructura que incluya no solo el sitio publico, sino también, documentos, scripts y cualquier otro tipo de archivo requerido, una posibilidad puede ser una estructura como la siguiente:&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/vc_path_structure.png&quot; width=&quot;294&quot; height=&quot;300&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Dentro del directorio de archivos recomiendo crear un archivo de texto o un excel sencillo que contenga los parches que se han aplicado al sitio o buscar alguna otra manera de llevar registro de estos. &lt;br /&gt;
En los script pueden estar scripts de herramientas o script de base de datos.&lt;br /&gt;
En SVN yo recomiendo a veces llevar snapshots de la base de datos en el control de versiones, pero en Git se vuelve complicado por la forma de trabajar de Git, ya que en Git es un archivo único y aunque se quiera bajar una versión del sitio siempre hay que bajar una versión completa que incluiría todos los archivos de base de datos que pueden llegar a ser muy grandes y afectan el proceso de obtención de código en el control de versiones y esto puede ser critico en algunas circunstancias.&lt;/p&gt;

&lt;h2 id=&quot;el-directorio-files&quot;&gt;El directorio files&lt;/h2&gt;
&lt;p&gt;Usualmente no se recomienda ingresar el directorio files dentro del control de versiones, esto debido a que puede crecer mucho y también puede adquirir muchos archivos diferentes desentronizados en los diferentes ambientes en que se trabaje, generando a veces problemas y hasta borrar archivos cuando se actualiza el código en los diferentes ambientes (y lo mismo aplica para los directorios de cache).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para esto hay 2 recomendaciones:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Crear una regla de exclusion del directorio&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/files_dir.png&quot; width=&quot;319&quot; height=&quot;269&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Colocar el directorio fuera del los directorios públicos del servidor web y crear un link simbólico hacia este directorio&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/symlink.png&quot; width=&quot;407&quot; height=&quot;227&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En caso de no utilizar la opción del link simbólico recomiendo mover el directorio files a /sites/files y no dentro del directorio especifico del sitio, esto debido a que a veces hay que cambiar de nombre el sitio o se trabaja con diferentes nombres en los diferentes ambientes y esto puede causar problemas.&lt;/p&gt;

&lt;h2 id=&quot;reglas&quot;&gt;Reglas&lt;/h2&gt;
&lt;p&gt;Es bueno diseñar reglas en cada equipo de trabajo, esto puede evitar muchos problemas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por ejemplo&lt;/strong&gt;:
- No se permite modificaciones directas al o los servidores de producción, sino solo a través del esquema de deployment, sin importar la urgencia
- Definir días y horas para los pases a producción
- Definir protocolos para el pase a producción de casos de alta prioridad
- Definir el protocolo de aprobación y pase a producción
- Definir el formato de comentarios de cada commit, es importante que cada commit al control de versiones tenga algún tipo de comentario, corto, pero significativo, esto agiliza el proceso de revisión de lo que se efectuará en cada pase a producción&lt;/p&gt;

&lt;h2 id=&quot;informacin-importante-de-los-pases&quot;&gt;Información importante de los pases&lt;/h2&gt;
&lt;p&gt;En todo momento se debe poder saber que versión esta en cada ambiente, cuando se puso ahí, que contiene y que diferencias hay con el próximo pase. &lt;br /&gt;
Cada pase a producción debería estar aprobado por algún responsable después de haber sido probado, no solo que arregla el problema o agrega la mejora, sino no que incrusta un nuevo problema. &lt;br /&gt;
Es importante siempre hacer un respaldo de la base de datos y de ser requerido de los archivos del sitio antes de cada pase a producción. &lt;br /&gt;
Tener un protocolo de rollback para ser capaces de volver a nuestro estado anterior, no podemos garantizar que todos los pases a producción van a ser infalibles y podríamos tener que hacer rollback algunas veces, pero debemos estar preparados para poder lograrlo.&lt;/p&gt;

&lt;h2 id=&quot;unit-testing-unidades-de-prueba&quot;&gt;Unit testing (unidades de prueba)&lt;/h2&gt;
&lt;p&gt;Es recomendable, aunque implica toda una cultura para que pueda valer la pena. &lt;br /&gt;
Algunas personas apoyan y otras critican el TDD (Test Driving Development), sea o no que utilicemos TDD, aún así podemos crear unidades de prueba para unidades especificas y críticas de nuestra aplicación.&lt;br /&gt;
El utilizar unidades de prueba nos ayuda a garantizar que al agregar una mejora no estamos ingresando un problema rompiendo algo que ya funcionaba.&lt;/p&gt;

&lt;h2 id=&quot;documentacin&quot;&gt;Documentación&lt;/h2&gt;
&lt;p&gt;A veces obviamos lo importante que pueden ser documentar ciertas cosas básicas. &lt;br /&gt;
Nos pueden liberar de molestias durante nuestras vacaciones o de tratar de localizar a alguien durante sus vacaciones.&lt;br /&gt;
No es tan increíble que nadie pueda ingresar a los servidores si el único que conoce los accesos tuvo un accidente o decidió renunciar sin dar pre aviso. &lt;br /&gt;
Documentar los basico es necesario &lt;br /&gt;
La información de los diferentes servidores &lt;br /&gt;
Las claves (de manera seLgura por favor) &lt;br /&gt;
Los directorios importantes &lt;br /&gt;
Los procedimientos de respaldo y restore &lt;br /&gt;
Las configuraciones &lt;br /&gt;
Procedimientos importantes&lt;br /&gt;
Etc.&lt;/p&gt;

&lt;p&gt;Un ejemplo podría ser guardar alguna de esta información en el control de versiones&lt;/p&gt;

&lt;h2 id=&quot;el-proceso&quot;&gt;El proceso&lt;/h2&gt;
&lt;p&gt;Es importante que los procesos sean claros, en cada empresa y cada proyecto es diferente, pero en todos es importante.&lt;/p&gt;

&lt;h2 id=&quot;enfoques-de-pases-de-cdigo-y-archivos&quot;&gt;Enfoques de pases de código y archivos&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pull from server:&lt;/strong&gt; Personalmente  no me agrada mucho, porque considero que en un servidor de producción no deben haber librerías y herramientas de desarrollo como el control de versiones, y en algunos casos no debe de haber acceso del servidor hacia afuera. &lt;br /&gt;
&lt;strong&gt;Push to server:&lt;/strong&gt; En este caso el se publica hacia cada servidor lo que se requiere, permite hacer deploy de diferentes esquemas a diferentes tipos de servidores, y permite desde un punto centralizado controlar varios servidores. &lt;br /&gt;
En combinación de los esquemas anteriores&lt;br /&gt;
Enfoque de links simbolicos: algunas empresas o herramientas trabajan con el esquema de que cada pase se efectúa un directorio nuevo con un identificador basado en la versión o en el tiempo y se utiliza links simbólicos para indicar al servidor web que ya no utilice el deploy anterior sino este nuevo directorio. En este enfoque es necesario utilizar el esquema de links simbólicos para los directorios de files y cache como lo habíamos discutido anteriormente.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/versiones_simbolicas.png&quot; width=&quot;262&quot; height=&quot;276&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;manejo-de-las-configuraciones-en-base-de-datos&quot;&gt;Manejo de las configuraciones en base de datos&lt;/h2&gt;
&lt;p&gt;Si lo único que tuviéramos que pasar a los servidores fuera código, el proceso seria relativamente sencillo como ya vimos, pero, en el caso de Drupal hay muchas configuraciones y estructuras que están en la base de datos, podemos intentar manejar muchas de estas por código, pero aún así no serian todas y mantendríamos el problema.
Si es nuestro primer pase a producción es sencillo, se envía un snapshot completo de la base de datos, pero el problema comienza cuando ya el sitio ha estado en producción por un momento y empieza a adquirir información ahí, la cual ya no se encuentra en las bases de datos de pruebas y desarrollo.
A partir de ese momento si  hacemos un cambio en cualquiera de las configuraciones que están en base de datos, hacer el pase se vuelve mas complejo y requerimos de soluciones mas creativas.&lt;/p&gt;

&lt;h2 id=&quot;maneras-de-resolver-este-problema&quot;&gt;Maneras de resolver este problema&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Update hooks:&lt;/strong&gt; Utilizar el hook_update_N de los .install de los modulos para manejar las diferencias, modificar la información y hacer los cambios necesarios. El problema es que puede requerir mucho trabajo y habrán algunas circunstancias difíciles de codificar ahí. &lt;br /&gt;
&lt;strong&gt;SQL Scripts:&lt;/strong&gt; Aplicar query scripts directamente a la base de datos. Drupal es una infraestructura compleja, y que se vuelve mas compleja y con mas dependencias a cuantos mas modulos tiene instalado, debido a su esquema de hooks es casi imposible saber a ciencia cierta que datos se modifican con cada acción. Un esquema de modificaciones directas puede causar problemas. &lt;br /&gt;
&lt;strong&gt;Patterns:&lt;/strong&gt; El uso de este modulo implica definir patrones de las modificaciones a los datos, en si es un esquema complejo y podría tener el mismo problema de los SQL scripts. &lt;br /&gt;
&lt;strong&gt;Exportables:&lt;/strong&gt; Muchos modulos, principalmente los que utilizan el API de Chaos Tools, suelen tener la opción de exportar la configuración, de manera que se pueda agregar a archivos de código y utilizarse desde ahí. Requiere bastante trabajo aunque son buenas opciones, excepto que no todos los módulos lo implementan y hay muchos cambios que aún así tendremos que resolver de alguna otra manera. &lt;br /&gt;
&lt;strong&gt;Documentacion de pasos manuales:&lt;/strong&gt; Es un proceso tedioso, pero probablemente todos lo hemos utilizado mas de una vez, consiste en documentar los pasos para replicar los cambios en el servidor al que se efectúa el pase. El problema es que ademas del tiempo que se aumenta el pase, es muy propenso a errores. &lt;br /&gt;
&lt;strong&gt;Database Diff:&lt;/strong&gt; Consiste en utilizar alguna herramienta para analizar las diferencias en las estructuras y datos de la base de datos para generar el script SQL para aplicarlos. Es muy buena opción si se tiene la herramienta correcta. &lt;br /&gt;
&lt;strong&gt;Features:&lt;/strong&gt; No se desarrollo como un método de efectuar pases, sino mas bien de generar características que fueran instalables en un sitio, pero se ha estado utilizando para efectuar pases. Con ciertas precauciones suele ser un método bastante adecuado.&lt;/p&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;
&lt;p&gt;El modulo features permite inspeccionar las modificaciones en la configuracion y generar los el codigo de nuevos modulos de features que se pueden instalar y actualizar en los sitios llevando consigo estos cambios efectuados en las configuraciones. &lt;br /&gt;
De esta manera se pueden agregar estas modificaciones y configuraciones al código y manejarlo dentro del control de versiones y obtener así un esquema mas sencillo y fiable de pases  &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://c3434681.r81.cf0.rackcdn.com/deployments-ciclo-desarrollo-drupal-drupalcamp-2012.pdf&quot;&gt;Archivo de la presentación&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>SEO Drupal (Search Engine Optimization), DrupalCamp Costa Rica, 2012</title>
          <link>http://www.profesional.co.cr/es/drupalcamp/seo-drupal-search-engine-optimization/</link>
          <pubDate>Sun, 22 Apr 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/drupalcamp/seo-drupal-search-engine-optimization/</guid>
          <description>&lt;p&gt;&lt;a href=&quot;http://vimeo.com/40845076&quot;&gt;Drupal y SEO - DrupalCamp Costa Rica 2012&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/nestormata&quot;&gt;Nestor Mata Cuthbert&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://c3434681.r81.cf0.rackcdn.com/drupal-seo-drupalcamp-2012.pdf&quot;&gt;Archivo de la presentación (3MB)&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;porque-es-importante-el-seo&quot;&gt;¿Porque es importante el SEO?&lt;/h2&gt;
&lt;p&gt;La intención de crear un sitio suele ser para ser visitado.  &lt;br /&gt;
Existen sitio que son aplicaciones para un grupo especifico y no necesitan ser encontrados, como las intranets de una empresa para alguna función interna o el sitio donde se manejas las ventas de la empresa, o la aplicación en linea de un banco donde se hace manejo de las cuentas y tarjetas. &lt;br /&gt;
Pero, la mayoría de sitios necesitan de que los visitantes lo encuentren para cumplir su función. &lt;br /&gt;
Existen diferentes formas en que un usuario encuentra un sitio.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Directo:&lt;/em&gt; Escritos directamente en el browser o desde alguna aplicación en la computadora, no se obtiene información del origen&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Referidos:&lt;/em&gt; Desde otros sitios o anuncios en web&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Buscadores:&lt;/em&gt; El usuario busca información especifica en un buscador y encuentra una pagina de nuestro sitio que posiblemente contenga la información que el busca&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;como-un-buscador-encuentra-y-determina-el-tema-y-su-importancia&quot;&gt;Como un buscador encuentra y determina el tema y su importancia?&lt;/h2&gt;
&lt;p&gt;Los buscadores nos suelen encontrar a travez de enlaces de otros sitios o explícitamente indicadores la existencia del sitio a travez de herramientas como &lt;a href=&quot;http://www.google.com/webmasters/tools&quot;&gt;Google Webmaster Tools&lt;/a&gt; &lt;br /&gt;
Pero ser encontrado es solo el primer paso y no garantiza que seamos tomados en cuenta. &lt;br /&gt;
Cada página es una entidad independiente para los buscadores, esto quiere decir que los buscadores analizan cada página y le asignan importancia a cada página por separado para cada tema.   &lt;/p&gt;

&lt;h2 id=&quot;importancia-ranking-y-temas&quot;&gt;Importancia (ranking) y temas&lt;/h2&gt;
&lt;p&gt;Cada página será analizada en torno a uno o varios temas y se le asignara su nivel de importancia o ranking. &lt;br /&gt;
Este ranking va en relación con los demás sitios en internet que el buscador analiza para ese mismo tema. &lt;br /&gt;
Basado en este ranking para ese tema será que la el buscador nos coloque en los resultados para las palabras que se busquen relacionadas con el tema.&lt;br /&gt;
Por esto es importante que cada página debe ser escrita y optimizada por temas, porque el sitio aparecerá para búsquedas de palabras especificas.   &lt;/p&gt;

&lt;h2 id=&quot;transferencia-del-rank&quot;&gt;Transferencia del rank&lt;/h2&gt;
&lt;p&gt;Los buscadores suelen asignar un valor de ranking por defecto a una página para luego empezar a distribuirlo.&lt;br /&gt;
Los buscadores intentan entender las páginas de manera orgánica, o sea, de manera natural o de la manera que la ven los usuarios, esto lo que quiere decir es que igual que un usuario viaja de una página a otra (sea interna o externa), así lo calculan los buscadores, distribuyendo un poco del ranking hacia las páginas referidas y obteniendo desde las páginas que refieren a nuestra página.&lt;br /&gt;
Esto lo que quiere decir es que las páginas que son referidas por muchos enlaces son las páginas que tienen mayor rank. &lt;br /&gt;
De aqui se deriva una estrategia para atraer enlaces y ranks hacia nuestro sitio y consiste en buscar páginas o grupos en los que se tratan temas similares al que yo discuto en mi página y discutir los temas dejando enlaces hacia nuestro sitio, tanto para poder incitar a otros usuarios a dirigirse a nuestra página como también para lograr un poco de ranking externo.&lt;/p&gt;

&lt;h2 id=&quot;los-keywords&quot;&gt;Los keywords&lt;/h2&gt;
&lt;p&gt;Aquí es donde esta el verdadero trabajo de SEO, lo demás del trabajo es hacer que el sitio sea amigable con el buscador, pero el buscar y analizar los keywords es donde esta la magia.&lt;br /&gt;
Primero algo que debemos entender es que el resultado del trabajo de SEO se nota con paciencia.&lt;br /&gt;
Los resultados pueden tomar meses y no menos de varias semanas, el trabajo de SEO no es de resultados inmediatos.&lt;br /&gt;
Lo primero que debemos de hacer es definir cuales son nuestros keywords, analizar bien en que área nos estamos involucrando.&lt;br /&gt;
Por ejemplo, creemos un sitio que se dedique a la venta de propiedades en costa rica, podríamos pensar que nuestros keywords son: compra casa costa rica, compra propiedad costa rica, compra apartamento costa rica.&lt;br /&gt;
Con esto nos vamos a buscar el Keyword tool de google ads, podemos simplemente buscar keyword tool en google.&lt;br /&gt;
En esta herramienta escribimos cada uno de nuestros keywords en la búsqueda, en casos como este donde se busca enfocarse en usuarios de Costa Rica podemos aplicar los filtros de país e idioma, claro que si el caso fuera de buscar usuarios a nivel internacional no lo haríamos e incluiríamos palabras en ingles probablemente, por por el sentido de este ejemplo lo haremos localizado.  &lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/google_adwords__keyword_tool.png&quot; width=&quot;659&quot; height=&quot;300&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Google nos hace un gran favor y nos da información sobre los keywords que le dimos y ademas nos da ideas de keywords.&lt;br /&gt;
En estos resultados vemos como tal vez deberíamos olvidarnos de algunos de los keywords que pensábamos y mejor utilizar otros.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/google_adwords__keyword_tool-1.png&quot; width=&quot;596&quot; height=&quot;300&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Un detalle al respecto de estas listas que importante ver son las búsquedas por mes y la competencia.&lt;br /&gt;
En esta imagen ordene la lista por búsquedas mensuales, como pueden ver ahí, hay palabras sencillas que la gente busca mucho y que no tienen mucha competencia, sin embargo, una de las palabras que habíamos elegido tiene muy pocas búsquedas y una alta competencia.&lt;br /&gt;
Si queremos aparecer en las búsquedas la recomendación es tratar de competir con lo sencillo y así obtendremos resultados mas rápido. Así nos enfocaremos en palabras con baja competencia y muchas búsquedas y será como decía un amigo “como quitarle un dulce a un niño”, siempre y cuando tengamos buen contenido.&lt;br /&gt;
De esta lista, seleccionamos los keywords que nos interesan, que no tienen mucha competencia y que tienen muchas búsquedas y con esos iniciaremos nuestro trabajo en el sitio.&lt;br /&gt;
Y ahora que tenemos keywords con los que tenemos muchas posibilidades de aparecer en las búsquedas, vamos a trabaje con ellos.&lt;/p&gt;

&lt;h2 id=&quot;metatags&quot;&gt;Metatags&lt;/h2&gt;
&lt;p&gt;Una de las formas que utilizan los buscadores para identificar el contenido es a través de los metatags.&lt;br /&gt;
Google hasta donde sabemos ya no utiliza los metatags para determinar la información o la importancia de los keywords, Goole se basa en el contenido y los links y no en los metatags, pero no esta de mas ocuparse de ellos por los otros buscadores.&lt;br /&gt;
En el header del HTML se incluyen tags sobre el contenido, metatags.&lt;br /&gt;
&lt;em&gt;Keywords:&lt;/em&gt; La idea es identificar las palabras claves dentro del contenido, esas pocas palabras que indican de que se trata lo que esta en la página, es necesario elegirlas muy bien.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;palabra1, palabra2, palabra3, etc&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Description:&lt;/em&gt; Una pequeña descripción (recomendación es menos de 150 caracteres), esta descripción debe considerarse como aquellos que podría despertar el interés en alguien para hacer click y leer el articulo, en algunos casos de hecho los buscadores utilizan esta descripción como la descripción en la los resultados de la búsqueda. Igual, la recomendación es pensar muy bien como atraer y describir a alguien de que trata el contenido en pocas palabras.&lt;br /&gt;
&lt;em&gt;Drupal 6:&lt;/em&gt; &lt;a href=&quot;https://drupal.org/project/nodewords&quot;&gt;Nodewords Module&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Drupal 7:&lt;/em&gt; &lt;a href=&quot;https://drupal.org/project/metatag&quot;&gt;Metatag Module&lt;/a&gt;&lt;br /&gt;
Permiten configurar los metatags para cada nodo.&lt;/p&gt;

&lt;h2 id=&quot;titulo&quot;&gt;Titulo&lt;/h2&gt;
&lt;p&gt;El titulo es a lo que le damos mayor importancia, el titulo es la entrada al sitio, y a lo que le demos importancia así también se la dará el buscador.&lt;br /&gt;
Debemos asegurarnos hasta donde se puede, de que el titulo contenga los keywords que definimos que vamos a trabajar en el sitio (y de primero antes que otras palabras).&lt;br /&gt;
&lt;em&gt;Drupal:&lt;/em&gt; &lt;a href=&quot;https://drupal.org/project/page_title&quot;&gt;Page Title Module&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;el-contenido&quot;&gt;El contenido&lt;/h2&gt;
&lt;p&gt;Aunque suene un poco redundante, pero es importante hablar de ello, el contenido es lo más importante de todo, el contenido debe estar bien enfocado, bien estructurado y bien redactado, el contenido es el punto más importante para los buscadores y además sin un buen contenido no sirve de nada lograr que los clientes lleguen a nuestra página si no hay algo bueno que ofrecerles.&lt;/p&gt;

&lt;h2 id=&quot;enfasis&quot;&gt;Enfasis&lt;/h2&gt;
&lt;p&gt;La manera sencilla de decirlo es que el buscador le dará importancia a aquello que el autor le de importancia.&lt;br /&gt;
En una página debe haber un solo tag H1 (Header 1) y debe ser el título o aquello que identifique al contenido, aquello a lo que le damos la mayor importancia, procuremos usar los keywords de la página aquí.&lt;br /&gt;
El uso de tags H2, H3 y demás indican aquellos sub temas a los que el autor le da importancia.&lt;br /&gt;
El uso de tags como EM (Enfasis) o STRONG indican a que otras cosas se les da importancia. Nota el uso de los tags I (Italic) y B (bold) esta descontinuado y debe reemplazarse por atributos CSS.&lt;br /&gt;
No se le puede dar énfasis a todo porque pierde el énfasis, así que se debe seleccionar a que se le da énfasis y esto a lo que se le da importancia el buscador lo entenderá como importante y así lo considerará.&lt;/p&gt;

&lt;h2 id=&quot;buenos-y-malos-vecindarios&quot;&gt;Buenos y malos vecindarios&lt;/h2&gt;
&lt;p&gt;Los buscadores toman muy encuenta nuestras “juntas” por decirlo de una manera.&lt;br /&gt;
Los buscadores premian con ranking los enlaces hacia sitios relacionados y positivos, pero penalizan si estamos relacionados con sitios negativos, sitios de temas de pornografía, incumplimiento de derechos de autor, etc.&lt;br /&gt;
Esto porque los buscadores intentan de dar la mejor experiencia a los usuarios y evitan enviar a los usuarios a sitios que los pueden enviar a otros sitios que les den una mala experiencia.  &lt;/p&gt;

&lt;h2 id=&quot;uso-de-no-follow&quot;&gt;Uso de no follow&lt;/h2&gt;
&lt;p&gt;Una forma de evitar que los buscadores distribuyan nuestro ranking a otros sitios es usar la propiedad &lt;code&gt;rel=&quot;nofollow&quot;&lt;/code&gt; dentro del tag a del enlance:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&amp;lt;a href=&amp;quot;www.ejemplo.com&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;Ejemplo&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;reglas-de-etiqueta&quot;&gt;Reglas de etiqueta&lt;/h2&gt;
&lt;p&gt;No se debe intentar engañar a los buscadores, al intentarlo hay grandes probabilidades de ser descubierto y penalizado.&lt;br /&gt;
Un ejemplo de intentar engañar al buscador es utilizar contenido invisible o del mismo color del background para que no sea visto por el usuario pero si por el buscador.&lt;/p&gt;

&lt;h2 id=&quot;en-drupal&quot;&gt;En Drupal&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://drupal.org/project/seo_checklist&quot;&gt;SEO Checklist module&lt;/a&gt;   &lt;br /&gt;
Este modulo nos ayuda a guiarnos y llevar récord de lo que se ha hecho en el sitio al respecto de SEO.  &lt;/p&gt;

&lt;h2 id=&quot;revisar-constantemente-el-avance&quot;&gt;Revisar constantemente el avance&lt;/h2&gt;
&lt;p&gt;En SEO la clave es la paciencia.&lt;br /&gt;
Constantemente debemos revisar el uso de los usuarios en nuestros sitio y también revisar si lo que hacemos funciona o no y que cambios hacer, incluyendo el uso de los keywords.&lt;br /&gt;
Es un trabajo constante y que no termina.&lt;br /&gt;
Para esto es de mucha ayuda herramientas como Google Analytics y Google Webmaster Tools.&lt;/p&gt;

&lt;h2 id=&quot;google-analytics&quot;&gt;Google Analytics&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.google.com/analytics/&quot;&gt;Google Analytics&lt;/a&gt;&lt;br /&gt;
Dentro de la información que nos permite revisar:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Visitantes y visitantes exclusivos.&lt;/li&gt;
  &lt;li&gt;Datos demográficos (ubicación, idioma, etc)&lt;/li&gt;
  &lt;li&gt;Comportamiento (visitantes recurrentes, paginas vistas, tiempo en sitio, rebotes, etc)&lt;/li&gt;
  &lt;li&gt;Tecnologia (sistema operativo, browser, color, resolución, etc)&lt;/li&gt;
  &lt;li&gt;Fuentes de trafico&lt;/li&gt;
  &lt;li&gt;El contenido accesado&lt;/li&gt;
  &lt;li&gt;El flujo utilizado por los usuarios&lt;/li&gt;
  &lt;li&gt;Publicidad&lt;/li&gt;
  &lt;li&gt;Conversiones&lt;/li&gt;
  &lt;li&gt;Y Variables personalizadas (el modulo de Drupal ayuda en esto con tokens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Drupal:&lt;/em&gt; Google Analytics Module&lt;/p&gt;

&lt;h2 id=&quot;webmaster-tools&quot;&gt;WebMaster Tools&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.google.com/webmasters/tools/home&quot;&gt;Google Web Master Tools&lt;/a&gt;&lt;br /&gt;
Web master tools permite:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Indicarle a google algunos parámetros de como indexar el sitio, como indicar si debe indexarse mas o menos seguido&lt;/li&gt;
  &lt;li&gt;Ignorar algunos parámetros del &lt;em&gt;url&lt;/em&gt;, como &lt;code&gt;?page=x&lt;/code&gt; o &lt;code&gt;?id=123456789&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Indicarle &lt;em&gt;RSS feeds&lt;/em&gt; o &lt;em&gt;site maps&lt;/em&gt; de los cuales indexer&lt;/li&gt;
  &lt;li&gt;Analizar y probar el &lt;code&gt;robots.txt&lt;/code&gt; (un archivo para restrigir la indexación de algúnas rutas o paginas)&lt;/li&gt;
  &lt;li&gt;Ver problemas que se dieron durante el crawling&lt;/li&gt;
  &lt;li&gt;Ver la velocidad durante el crawling&lt;/li&gt;
  &lt;li&gt;Ver recomendaciones y problemas en páginas especificas&lt;/li&gt;
  &lt;li&gt;Ver y analizar los keywords en los que se aparecen en google y los clicks que se hacen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Además pueden ver el video de la charla que se dió que esta al inicio de esta presentación y bajar el archivo de la presentación que se utilizó.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Gracias a Anthony Phillips que recomienda revisar el modulo &lt;a href=&quot;http://drupal.org/project/seotools&quot;&gt;SEO Tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Baje el &lt;em&gt;&lt;a href=&quot;http://c3434681.r81.cf0.rackcdn.com/drupal-seo-drupalcamp-2012.pdf&quot;&gt;archivo de la presentación&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Drupal Camp Costa Rica en vivo</title>
          <link>http://www.profesional.co.cr/es/drupalcamp-costa-rica/</link>
          <pubDate>Fri, 20 Apr 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/drupalcamp-costa-rica/</guid>
          <description>&lt;p&gt;Este sabado 21 de Abril se dará el Drupal Camp Costa Rica, donde estaré ofreciendo 2 charlas que pueden ver aquí en vivo.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/drupalcamp.png&quot; alt=&quot;Drupal Camp Costa Rica&quot; width=&quot;243&quot; height=&quot;148&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Las charlas y sus horarios son las siguientes:
- &lt;a href=&quot;http://drupalcr.org/en/sesiones/deployments-y-el-ciclo-de-desarrollo-en-drupal&quot;&gt;Deployments y el ciclo de desarrollo en Drupal, 9:20 - 10:30am&lt;/a&gt;
- &lt;a href=&quot;http://drupalcr.org/en/sesiones/drupal-y-la-optimizaci%C3%B3n-para-los-buscadores-web-seo&quot;&gt;Drupal y la optimización para los buscadores web (SEO), 3:00 - 4:45pm&lt;/a&gt;&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;340&quot; src=&quot;http://cdn.livestream.com/embed/drupalcostarica?layout=4&amp;amp;color=0x9de691&amp;amp;autoPlay=false&amp;amp;mute=false&amp;amp;iconColorOver=0x57be46&amp;amp;iconColor=0x459738&amp;amp;allowchat=true&amp;amp;height=340&amp;amp;width=560&quot; style=&quot;border:0;outline:0&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;div style=&quot;font-size:11px;padding-top:10px;text-align:center;width:560px&quot;&gt;Watch&lt;a href=&quot;http://www.livestream.com/?utm_source=lsplayer&amp;amp;amp;utm_medium=embed&amp;amp;amp;utm_campaign=footerlinks&quot; title=&quot;live streaming video&quot;&gt;live streaming video&lt;/a&gt; 
from 
&lt;a href=&quot;http://www.livestream.com/drupalcostarica?utm_source=lsplayer&amp;amp;amp;utm_medium=embed&amp;amp;amp;utm_campaign=footerlinks&quot; title=&quot;Watch drupalcostarica at livestream.com&quot;&gt;drupalcostarica&lt;/a&gt; at livestream.com
&lt;/div&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Como utilizar el Cache en Drupal</title>
          <link>http://www.profesional.co.cr/es/2012/03/06/como-utilizar-cache-drupal-1486/</link>
          <pubDate>Tue, 06 Mar 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2012/03/06/como-utilizar-cache-drupal-1486/</guid>
          <description>&lt;h2 id=&quot;como-funciona&quot;&gt;Como funciona?&lt;/h2&gt;
&lt;p&gt;Lo primero que debemos entender es como funciona el cache de Drupal.&lt;/p&gt;

&lt;p&gt;El cache de Drupal por defecto esta basado en la base de datos, en la tabla cache (el cache por defecto) y las tablas &lt;code&gt;cache_XXX&lt;/code&gt; que son caches mas especificos.&lt;br /&gt;
El cache se suele basar en un esquema llave/valor/validez en el que se utiliza un identificador y se guardan los valores cacheados quedando asi en la base de datos por el tiempo que se indique o indefinidamente (hasta que se limpie ese cache).  &lt;/p&gt;

&lt;h2 id=&quot;como-se-usa&quot;&gt;Como se usa?&lt;/h2&gt;
&lt;p&gt;Hay 3 operaciones basicas con el cache: &lt;strong&gt;set, get, clear&lt;/strong&gt;.&lt;br /&gt;
El uso normal consta de revisar si existe el cache antes de entrar a la lógica, si este existe lo usamos y nos saltamos la lógica, si no existe o es invalido ejecutamos la lógica y posteriormente ingresamos el cache.&lt;br /&gt;
Además, si cabe la posibilidad de que este contenido cambie por alguna ejecución de otra lógica en la que tenemos control, es un buen lugar para colocar un clear de este cache.  &lt;/p&gt;

&lt;p&gt;Basandonos en esto, un ejemplo de uso seria el siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
function my_logica($var1, $var2) {
  // Defina el ID que debe usarse en el cache
  $cache_id = &amp;#39;my_cache:&amp;#39; . $var1;
  // &amp;#39;cache&amp;#39; es el contenedor por defecto (tabla)
  if ($cached = cache_get($cache_id, &amp;#39;cache&amp;#39;)) { 
    return $cached-&amp;gt;data;
  }
  $to_return; // Arreglo, string, o lo que sea que retornamos
  // Logica va a aqui, queries, ajax, procesamiento, etc
  cache_set($cache_id, $to_return, &amp;#39;cache&amp;#39;, time() + (60 * 60 * 24));
  return $to_return;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;definicion-del-cache-id&quot;&gt;Definicion del cache ID&lt;/h2&gt;
&lt;p&gt;El ID del cache es un tema importante para que aplique bajo el criterio adecuado.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Global:&lt;/strong&gt; un mismo cache ID siempre, ej: &lt;code&gt;&#39;mi_id&#39;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Por usuario:&lt;/strong&gt; utilizar el ID del usuario, ej: &lt;code&gt;$user-&amp;gt;uid . &#39;:mi_id&#39;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Por rol:&lt;/strong&gt; utilizar el rol como parte del ID, ej: &lt;code&gt;$role . &#39;:mi_id&#39;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Por Node Type:&lt;/strong&gt; utilizar el tipo de nodo en el ID, ej: &lt;code&gt;$node-&amp;gt;type . &#39;:mi_id&#39;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Por Contenido:&lt;/strong&gt; en caso de un contenido o un texto grande se puede usar un hash, ej: &lt;code&gt;md5($text) . &#39;:mi_id&#39;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se puede utilizar como base el ID de cualquier entidad que ocupemos, o tipo o la combinación de varios factores, de manera que tengamos un ID que nos identifique correctamente cuando usar el cache, ya sea para tener caches por usuario, rol, tipo de contenido, por contenido, por termino o por lo que sea necesario.&lt;br /&gt;
El cache puede ser utilizado en bloques, en paginas completas, en segmentos de codigo o en lo que consideremos importante evitar la ejecucion tan frecuente.  &lt;/p&gt;

&lt;h2 id=&quot;como-cambiar-el-tipo-de-contenedor-del-cache&quot;&gt;Como cambiar el tipo de contenedor del cache?&lt;/h2&gt;
&lt;p&gt;Existen modulos para extender el cache y utilizar otro metodos, como file cache, memcached, APC o el metodo que queramos, para esto existen modulos especificos como &lt;a href=&quot;http://drupal.org/project/apc&quot;&gt;APC&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/fastpath_fscache&quot;&gt;Fast Cache&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/memcache&quot;&gt;Memcache&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/memcached&quot;&gt;Memcached&lt;/a&gt;, &lt;a href=&quot;http://drupal.org/project/xcache&quot;&gt;XCache&lt;/a&gt; o un modulo mas generico que permite elegir diferentes caches para diferentes contenedores el cual es &lt;a href=&quot;http://drupal.org/project/cacherouter&quot;&gt;CacheRouter&lt;/a&gt;, este modulo permite que elijas un cache diferente para paginas, views, general, bloques, etc.  &lt;br /&gt;
A esto  también se le unen caches de páginas completas como el &lt;a href=&quot;http://drupal.org/project/boost&quot;&gt;Boost&lt;/a&gt; y el &lt;a href=&quot;http://drupal.org/project/authcache&quot;&gt;AuthCache&lt;/a&gt;.&lt;br /&gt;
Además de esto, puede haber casos en los que quieras agregar un cache a un bloque o codigo del que no tienes control en cuyo caso hay una tecnica para sobre escribir una pieza de codigo y reemplazarla de manera eficiente, escribiré de esto después.&lt;br /&gt;
Espero esto sea de utilidad.  &lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Como estructurar Drupal, planear y hacerlo bien desde el inicio</title>
          <link>http://www.profesional.co.cr/es/2012/02/27/como-estructurar-drupal-planear-y-hacerlo-bien-desde-inicio-1485/</link>
          <pubDate>Mon, 27 Feb 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2012/02/27/como-estructurar-drupal-planear-y-hacerlo-bien-desde-inicio-1485/</guid>
          <description>&lt;h2 id=&quot;punto-de-vista-fsico&quot;&gt;Punto de vista Físico&lt;/h2&gt;
&lt;p&gt;En este me enfocaré en la localización de archivos y directorios. &lt;br /&gt;
Planificar bien y cumplir con los lineamientos en cuanto a la localización de archivos nos ayudará a:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Evitar problemas al hacer actualización del core o de los modulos&lt;/li&gt;
  &lt;li&gt;Evitar problemas al mover o cambiar de dominio el sitio&lt;/li&gt;
  &lt;li&gt;Simplifica los respaldos&lt;/li&gt;
  &lt;li&gt;Evita problemas de seguridad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de localización de archivos en Drupal:&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/archivos_drupal.png&quot; alt=&quot;Ejemplo de organizacion de archivos en Drupal&quot; /&gt;&lt;/div&gt;

&lt;p&gt;En este ejemplo quiero resaltar varias cosas:
- Creamos una base del sitio mas arriba del root, esto para crear varios sub directorios que esten fuera de los directorios publicos del servidor web
- Fuera de los directorios publicos creamos los directorios privados y de cache (a excepcion los archivos generados de css, js y similares que si deben estar publicos), esto asegura que no agregamos un hueco de seguridad
- Ademas en este directorio base se pueden agregar utilitarios o documentos necesarios para el sitio, por ejemplo es un buen lugar para un documento de la lista de parches aplicados al sitio
- Normalmente el directorio de files Drupal lo localiza dentro del directorio de configuracion del sitio, debajo de /sites/mi.dominio.com/files, pero mi recomendacion es normalmente localizarlo debajo de /sites/files, esto para evitar problemas o confusiones a la hora de mover un sitio a produccion o al cambiar de nombre o dominio un sitio
- Aunque es aceptado colocar modulos y temas debajo del directorio de configuracion de cada sitio, esto puede generar problemas por ejemplo si se trabaja con un dominio para desarrollo y otro para produccion o al cambiar de nombre el sitio, mi recomendacion es evitarlo
- Otra recomendación, es evitar que el tema dependa de archivos subidos a travez de la interfaz de Drupal, de la misma manera que debemos evitar tener codigo que no sea exclusivamente de theming en los temas&lt;/p&gt;

&lt;h2 id=&quot;punto-de-vista-lgico&quot;&gt;Punto de vista Lógico&lt;/h2&gt;
&lt;p&gt;Desde el punto de vista lógico quisiera explicar 2 conceptos, primero y mas importante las entidades de Drupal y por el otro lado repasar un poco sobre theming.&lt;/p&gt;

&lt;h3 id=&quot;entidades&quot;&gt;Entidades&lt;/h3&gt;
&lt;p&gt;Una forma de ver a las entidades de Drupal sería de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Básicas:&lt;/em&gt;
- Usuarios
- Roles
- Permisos
- &lt;em&gt;Taxonomía (organización)&lt;/em&gt;
- Menus
- Comentarios
- Bloques&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Extensibles:&lt;/em&gt;
- &lt;em&gt;Nodos (contendido)&lt;/em&gt;
- Views (despliegue de entidades)
- Panels (Layout)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Custom:&lt;/em&gt;
- Profile
- Feeds
- Etc …&lt;/p&gt;

&lt;h3 id=&quot;nodos&quot;&gt;Nodos&lt;/h3&gt;
&lt;p&gt;El nodo es la entidad de datos de Drupal, la intención es que el nodo sea cualquier contenido en Drupal, siempre que pensemos en contenido debemos pensar en el nodo, ya sea una página, un artículo, una receta de cocina, un articulo en venta, un anuncio o lo que sea.&lt;br /&gt;
El nodo se puede extender con el CCK o el modulo de contenido, se le pueden agregar o quitar campos, y darle la forma y concepto que queramos.&lt;br /&gt;
También podemos extenderlo por medio de código a travez de los diferentes hooks para el manejo de nodos.&lt;/p&gt;

&lt;h3 id=&quot;taxonoma&quot;&gt;Taxonomía&lt;/h3&gt;
&lt;p&gt;Es importante entender la taxonomía, ya que esta esta muy bien integrada en Drupal y es la manera recomendada de manejar y categorizar los nodos.&lt;br /&gt;
La taxonomía nos permite ver los nodos desde diferentes perspectivas, como por ejemplo, si una receta es de tipo para vegetarianos o no, o si esta misma receta es de un país u el otro, o si la receta es de pasta o un postre, o cualquier otra perspectiva que queramos darle a ese tipo de contenido, y esto es lo que nos dará la herramienta para visualizar al usuario o manipular usando las diferentes perspectivas, por eso es muy importante planificar la taxonomía muy bien desde el inicio del proyecto.  &lt;/p&gt;

&lt;h3 id=&quot;views&quot;&gt;Views&lt;/h3&gt;
&lt;p&gt;Los views son la forma mas sencilla y extensible en que presentamos un grupo de nodos.&lt;br /&gt;
Los views tienen aplicaciones sin fin, un view por debajo es un query builder y nos sirve no solo para los nodos, sino para cualquier entidad que tengamos en nuestro sitio.&lt;br /&gt;
Los views nos permiten desplegar nuestros nodos de diferentes maneras, ya sea, como página, bloques, slideshow o muchas maneras mas.&lt;br /&gt;
Además me permito recalcar algo importante, tanto los views como los paneles implementan esquemas de cache, y es importante que revisemos y definamos el cache de cada view cuando este es creado, el no definir el manejo del cache del view puede causar problemas de rendimiento en nuestro sitio que serian tan faciles de arreglar como pensar en que parametros de cache debo usar para cada view.&lt;br /&gt;
Otro detalle es utilizar parametros cuando sea posible, a veces necesitamos crear mas de un view similar, si utilizamos parametros nos permitiremos agregar escalabilidad, así cuando queramos reutilizar este view en otra area o por otro parametro no necesitaremos crear un nuevo view, lo que nos facilitará las cosas al darle mantenimiento o hacer modificaciones.  &lt;/p&gt;

&lt;h3 id=&quot;panels&quot;&gt;Panels&lt;/h3&gt;
&lt;p&gt;Los panels son la forma en que podemos estructurar una página (o area) en Drupal de manera muy sencilla y visual. &lt;br /&gt;
Los panels nos permiten definir un layout en el que queremos colocar varia información.&lt;br /&gt;
Podemos agregar dentro de un panel nodos, views, panels, bloques, codigo custom y demás.&lt;br /&gt;
También se pueden pasar parametros a los elementos y definir cache.&lt;/p&gt;

&lt;h2 id=&quot;theming&quot;&gt;Theming&lt;/h2&gt;
&lt;p&gt;El theming en Drupal es muy versatil y nos permite sobre escribir el despliegue de una manera tan general como el despliegue de todas las páginas o todos los links o menus, o tan granular como un link especifico o un area en una página especifica.&lt;br /&gt;
También podemos customizar por taxonomías o urls.&lt;br /&gt;
Pero, recordemos siempre de no agregar código de lógica en el temas, solo código que sea necesario para el despliegue, esto nos mantendrá la lógica separada de la presentación, manteniendo un buen esquema de escalabilidad, si ocupamos modificar lógica siempre pensemos en un custom module en caso de que no encontremos un módulo que implemente lo que ocupamos.  &lt;/p&gt;

&lt;h2 id=&quot;recomendacion&quot;&gt;Recomendacion&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Recuerde siempre planificar el uso de Drupal, de sus entidades, views, layouts, taxonomía y de la localización de los archivos para que su proyecto se mantenga mas seguro y en mejor estado&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Adjunto pueden encontrar la presentación que se hizo de este tema en la Drupaleada de Febrero.&lt;br /&gt;
&lt;a href=&quot;http://profesional.co.cr/sites/files/como_estructurar_drupal.pdf&quot;&gt;Presentación&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Como pasar argumentos a un view en bloque</title>
          <link>http://www.profesional.co.cr/es/2012/02/23/como-pasar-argumentos-un-view-bloque-1484/</link>
          <pubDate>Thu, 23 Feb 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2012/02/23/como-pasar-argumentos-un-view-bloque-1484/</guid>
          <description>&lt;p&gt;Necesitaba poner varios bloques en una pagina siendo este bloque un view y la unica diferencia era el termino de taxonomia.&lt;/p&gt;

&lt;p&gt;El sitio no usa panels y no queria utilizarlo solo para esto, asi que decidi crear un bloque que utilice un argumento para el termino, pero quedaba el detalle de como pasar a un bloque un argumento sin usar paneles.&lt;br /&gt;
Este metodo que muestro aqui tambien sirve para incrustar un view en cualquier parte realmente.  &lt;/p&gt;

&lt;p&gt;Lo que hice fue lo siguiente:
1. Agregar un custom bloque en los bloques de Drupal
1. Elegir formato de input PHP
1. Utilizar la funcion views_embed_view en el codigo PHP&lt;/p&gt;

&lt;p&gt;Un ejemplo del codigo es el siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
$viewName = &amp;#39;el_nombre_maquina_del_view&amp;#39;;
$display_id = &amp;#39;el_nombre_maquina_del_display&amp;#39;; // El bloque
$arg = &amp;#39;argumento&amp;#39;; // el argumento puede ser un array, ejemplo: array(&amp;#39;arg1&amp;#39;, &amp;#39;arg2&amp;#39;, 3, arg(0))
print views_embed_view($viewName, $display_id, $arg)
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De esta manera el manejo de ese view se vuelve mucho mas escalable y sencillo que intentar copiar el display del view muchas veces, si luego hubiera que hacer cambios se volveria inmanejable y propenso a errores.&lt;br /&gt;
Espero que les sirva el tip.&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Como importar imagecache presets en Drupal</title>
          <link>http://www.profesional.co.cr/es/2012/02/09/como-importar-imagecache-presets-drupal-1483/</link>
          <pubDate>Thu, 09 Feb 2012 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2012/02/09/como-importar-imagecache-presets-drupal-1483/</guid>
          <description>&lt;p&gt;Hoy tuve la necesidad de importar una serie de presets de imagecache desde otro sitio.&lt;br /&gt;
En las características de imagecache aparece la opción de exportar, pero no hay opción alguna para importar.&lt;br /&gt;
Pero implementarlo no es complicado.&lt;/p&gt;

&lt;p&gt;En general puede implementarse en cualquier código de Drupal, pero en este momento lo voy a ejecutar en un update para correrlo una única vez por el update de Drupal, aunque de igual manera podria estar en el install.&lt;br /&gt;
Al usar la opción de export de cada uno de los presets obtenemos un codigo similar al siguiente:  &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
$presets = array();
$presets[&amp;#39;my-preset-name&amp;#39;] = array (
  &amp;#39;presetname&amp;#39; =&amp;gt; &amp;#39;my-preset-name&amp;#39;,
  &amp;#39;actions&amp;#39; =&amp;gt;
  array (
    0 =&amp;gt;
    array (
      &amp;#39;weight&amp;#39; =&amp;gt; &amp;#39;0&amp;#39;,
      &amp;#39;module&amp;#39; =&amp;gt; &amp;#39;imagecache&amp;#39;,
      &amp;#39;action&amp;#39; =&amp;gt; &amp;#39;imagecache_scale&amp;#39;,
      &amp;#39;data&amp;#39; =&amp;gt;
      array (
        &amp;#39;width&amp;#39; =&amp;gt; &amp;#39;80&amp;#39;,
        &amp;#39;height&amp;#39; =&amp;gt; &amp;#39;100%&amp;#39;,
        &amp;#39;upscale&amp;#39; =&amp;gt; 0,
      ),
    ),
  ),
);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aquí podemos ver que la primer línea es una línea de inicialización del arreglo y luego esta la definición del arreglo.&lt;br /&gt;
En el arreglo hay 2 sencillas partes, la que define el nombre del preset y la que define las diferentes acciones del preset.&lt;br /&gt;
Ahora, si tomamos todos los códigos de exportación que nos entrega drupal y los ponemos juntos, pero recordando remover la línea de iniciaclización de los código siguientes, esto es importante sino estaremos limpiando el arreglo con cada preset que copiamos y solo importariamos el último.&lt;br /&gt;
Estos códigos los ponemos dentro de una funcion de update dentro del archivo de install del modulo y agregamos un pequeño código al final para iterar sobre el arreglo de presets y salvar cada uno y las acciones, obtendriamos el siguiente código:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
// En el archivo &amp;quot;mimodulo.install&amp;quot;
function mimodulo_update_1000() {
  // Copiamos los codigos de exportar cada preset
  // Conservamos solo la primer linea de inicializacion
  $presets = array(); // Esta si se queda
  $presets[&amp;#39;my-preset-name&amp;#39;] = array (
    &amp;#39;presetname&amp;#39; =&amp;gt; &amp;#39;my-preset-name&amp;#39;,
    &amp;#39;actions&amp;#39; =&amp;gt;
    array (
      0 =&amp;gt;
      array (
        &amp;#39;weight&amp;#39; =&amp;gt; &amp;#39;0&amp;#39;,
        &amp;#39;module&amp;#39; =&amp;gt; &amp;#39;imagecache&amp;#39;,
        &amp;#39;action&amp;#39; =&amp;gt; &amp;#39;imagecache_scale&amp;#39;,
        &amp;#39;data&amp;#39; =&amp;gt;
        array (
          &amp;#39;width&amp;#39; =&amp;gt; &amp;#39;80&amp;#39;,
          &amp;#39;height&amp;#39; =&amp;gt; &amp;#39;100%&amp;#39;,
          &amp;#39;upscale&amp;#39; =&amp;gt; 0,
        ),
      ),
    ),
  );

  // Removemos cada linea de inicializacion
  //$presets = array();
  $presets[&amp;#39;my-other-preset-name&amp;#39;] = array (
    &amp;#39;presetname&amp;#39; =&amp;gt; &amp;#39;my-other-preset-name&amp;#39;,
    &amp;#39;actions&amp;#39; =&amp;gt;
    array (
      0 =&amp;gt;
      array (
        &amp;#39;weight&amp;#39; =&amp;gt; &amp;#39;0&amp;#39;,
        &amp;#39;module&amp;#39; =&amp;gt; &amp;#39;imagecache&amp;#39;,
        &amp;#39;action&amp;#39; =&amp;gt; &amp;#39;imagecache_scale_and_crop&amp;#39;,
        &amp;#39;data&amp;#39; =&amp;gt;
        array (
          &amp;#39;width&amp;#39; =&amp;gt; &amp;#39;124&amp;#39;,
          &amp;#39;height&amp;#39; =&amp;gt; &amp;#39;124&amp;#39;,
        ),
      ),
    ),
  );
  // El codigo para iterar y salvar los presets
  foreach($presets as $preset) {
    // Crea el preset usando el nombre
    // Las acciones no son guardadas por esta funcion
    $saved = imagecache_preset_save($preset);
    // Itera sobre cada accion del preset para guardarlas
    foreach($preset[&amp;#39;actions&amp;#39;] as $action) {
      // Agrega el preset ID del preset guardado
      $action[&amp;#39;presetid&amp;#39;] = $saved[&amp;#39;presetid&amp;#39;];
      // Salva la accion al preset
      imagecache_action_save($action);
    }
  }
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En resumen, lo único que había que hacer era copiar todos los códigos retornados del export y agregar esas pequeñas líneas para iterar sobre el arreglo y salvar los presets y sus acciones.&lt;br /&gt;
Ahora solo queda correr el update.php y listo.  &lt;/p&gt;

&lt;p&gt;Saludos,&lt;br /&gt;
Nestor&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Varnish, Reverse Proxy y ESI</title>
          <link>http://www.profesional.co.cr/es/book/varnish-reverse-proxy-y-esi/</link>
          <pubDate>Thu, 22 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/varnish-reverse-proxy-y-esi/</guid>
          <description>&lt;h2 id=&quot;varnish&quot;&gt;Varnish&lt;/h2&gt;
&lt;p&gt;Varnish es un proxy que coloca entre el usuario y el (o los) servidor(es) web, siendo Varnish quien accesa el servidor web, manteniendo cache del contenido y manipulando los headers y tal vez también el contenido.&lt;br /&gt;
Varnish redirecciona el request ya sea hacia el cache interno, hacia un servidor web u otro servidor web.&lt;/p&gt;

&lt;p&gt;Debido a que varnish esta hecho para pocas cosas es muy eficiente haciendo lo que hace y permite jugar muy eficientemente con los requests.&lt;br /&gt;
Por ejemplo puede balancear los requests, o redirigir diferentes requests a un servidor u otro dependiendo de algun header, de alguna ruta o de algun tipo de archivo, o incluso de si un servidor funciona bien o da errores, en cuyo caso inclusive puede mantenerse dando una respuesta del cache mientras el servidor no funciona.&lt;/p&gt;

&lt;h2 id=&quot;varnish-para-liberar-al-servidor&quot;&gt;Varnish para liberar al servidor&lt;/h2&gt;
&lt;p&gt;Con varnish se puede hacer cosas muy interesantes, pero ahorita hablaremos de lo siguiente:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cacheo por tipos de archivo&lt;/li&gt;
  &lt;li&gt;Cacheo por rutas o patrones&lt;/li&gt;
  &lt;li&gt;Cacheo de paginas a usuarios anonimos&lt;/li&gt;
  &lt;li&gt;Cacheo de secciones de una pagina&lt;/li&gt;
  &lt;li&gt;Cacheo de una pagina con excepcion en secciones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Al configurar un varnish en frente de un servidor web podemos liberar al servidor web de muchisimos requests, incluso, si es un sitio enfocado a usuarios anonimos (como un blog, sitio de noticias, sitio informativo, etc) hasta podriamos hacer que el servidor web no reciba casi requests y todos sean servidos por el varnish.&lt;br /&gt;
Perfectamente podemos hablar de reducir los requests de 1.000 en una hora a 5 o 20, y lo mejor de todo, es que podrian aumentar los requests en esa hora a 10.000 o 100.000 y no aumentar ni un request al servidor web, reduciendo tambien los requests a la base de datos y aumentando la velocidad de respuesta de 1 segundo por request a unos milisegundos.&lt;/p&gt;

&lt;h2 id=&quot;configuracin-de-varnish&quot;&gt;Configuración de Varnish&lt;/h2&gt;
&lt;p&gt;No voy a entrar demasiado profundo en los detalles de la configuración, pero aquí esta la &lt;a href=&quot;https://www.varnish-cache.org/docs/trunk/index.html&quot;&gt;documentación&lt;/a&gt;&lt;br /&gt;
La configuración de varnish se encuentra el el archivo .vcl que tiene varios metodos para cada evento del flujo del request (algo como los hooks de drupal) donde se puede configurar o redireccionar el flujo del request.&lt;br /&gt;
Tal vez del que mas hablaremos será vlc_recv, que se da cuando inicial el procesamiento del request, en este punto tenemos la información de los headers del browser y podemos tomar decisiones de que hacer con el request, como indicar que pase directo (pass) o sea que no se utilice del cache, o que se revise el cache para saber si esta ahi y usar la version del cache si es valida (lookup), además tambien podemos alterar o agregar headers, o indicar si se debe procesar con ESI (Edge Server Includes).&lt;br /&gt;
Por ejemplo, podemos indicar que no se haga cache de un url de pruebas basandonos en el request url, esto para poder hacer pruebas sin que nuestros requests sean cacheados durante desarrollo:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;#bypass del demo site
if (req.url ~ &amp;quot;demo.mydomain.com&amp;quot;) {
  return (pass);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podemos indicar que siempre que haga cache de algun tipo de archivo basandonos en que el tipo de request sea GET (no POST) y en el url, de esta manera nos aseguramos de no enviar requests al servidor web que son siempre los mismos requests y que podemos dejar que varnish los cachee y descargamos de estos requests al servidor web:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;if (req.request == &amp;quot;GET&amp;quot; &amp;amp;&amp;amp; req.url ~ &amp;quot;.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|img|tga|wmf)$&amp;quot;) {
  return (lookup);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podemos crear un header de X-Forwarded-For:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;if (req.http.x-forwarded-for) {
  set req.http.X-Forwarded-For =
    req.http.X-Forwarded-For + “, ” + client.ip;
} else {
  set req.http.X-Forwarded-For = client.ip;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Podemos definir que no se haga cache para usuarios autenticados:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;if (req.http.Authorization || req.http.Cookie) {
  /* Not cacheable by default */
  return (pass);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;También podriamos enviar ciertos requests a un servidor diferente, por ejemplo enviar todas las imagenes de un servidor optimizado para requests estaticos:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;backend www {
  .host = &amp;quot;default.example.com&amp;quot;;
  .port = &amp;quot;80&amp;quot;;
}

backend images {
  .host = &amp;quot;images.example.com&amp;quot;;
  .port = &amp;quot;80&amp;quot;;
}

sub vcl_recv {
    if (req.request == &amp;quot;GET&amp;quot; &amp;amp;&amp;amp; req.url ~ &amp;quot;.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|img|tga|wmf)$&amp;quot;) {
        set req.backend = images;
        return (lookup);
    }
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;x-forwarded-for&quot;&gt;X-Forwarded-For&lt;/h2&gt;
&lt;p&gt;Cuando accesamos el servidor web a travez de un reverse proxy como varnish, la IP que llega al servidor es siempre la IP del reverse proxy, no la IP del usuario, y por lo tanto no podemos saber de cual IP viene el usuario, por eso se setea un header X-Forwarded-For que contenga la IP del usuario, y luego hay que ir a la configuracion de apache e indicar que la IP se busque de este header y lo mismo para Drupal.&lt;br /&gt;
En el archivo de configuración de apache suele haber algo asi:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
LogFormat &amp;quot;%v:%p %{X-Forwarded-For}i %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %O \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot;&amp;quot; vhost_combined
LogFormat &amp;quot;%{X-Forwarded-For}i %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %O \&amp;quot;%{Referer}i\&amp;quot; \&amp;quot;%{User-Agent}i\&amp;quot;&amp;quot; combined
LogFormat &amp;quot;%{X-Forwarded-For}i %l %u %t \&amp;quot;%r\&amp;quot; %&amp;gt;s %O&amp;quot; common&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En el archivo de configuración del site de drupal hay que descomentar lo siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;#39;reverse_proxy&amp;#39; =&amp;gt; TRUE,
&amp;#39;reverse_proxy_addresses&amp;#39; =&amp;gt; array(&amp;#39;10.176.87.35&amp;#39;), // La IP interna de su reverse proxy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Con esto Drupal sabra que debe reemplazar la IP por el valor del header.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Pressflow y Drupal 7, Distribuciones de rendimiento</title>
          <link>http://www.profesional.co.cr/es/book/pressflow-y-drupal-7-distribuciones-rendimiento/</link>
          <pubDate>Thu, 22 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/pressflow-y-drupal-7-distribuciones-rendimiento/</guid>
          <description>&lt;p&gt;Siempre hay una desición en cuanto a cuanto soporte dar hacia versiones anteriores o a los requisitos de un sistema o plataforma.  &lt;/p&gt;

&lt;p&gt;En el caso de Drupal 6 se había decidido mantener cierta compatibilidad en cuanto a PHP y la base de datos, el mantener esta compatibilidad hace que no se pudiera utilizar todo el potencial de PHP 5 o de la base de datos y además que habían funciones que en vez de utilizar la función nativa esta se implementaba en codigo wrapper en Drupal. &lt;br /&gt;
De aquí se deriva que en &lt;em&gt;Drupal 7&lt;/em&gt; se suba la barda y se decida un poco menos por el soporte de versiones y &lt;strong&gt;aumentar así el rendimiento de Drupal&lt;/strong&gt; &lt;a href=&quot;http://drupal.org/requirements&quot;&gt;requerimientos&lt;/a&gt;. &lt;br /&gt;
Pero mientras &lt;em&gt;Drupal 7&lt;/em&gt; aún estaba bajo desarrollo una empresa (FourKitchens) decide crear una distribución de Drupal 6 de alto rendimiento, haciendo back porting de algunas funcionalidad de Drupal 7, quitando soporte de algunas versiones de las tecnologias y haciendo algunas mejoras extra y llaman a esta distribución &lt;a href=&quot;http://fourkitchens.com/pressflow-makes-drupal-scale&quot;&gt;Pressflow&lt;/a&gt;, la cual se crea siempre una nueva versión para cada versión que se crea de &lt;em&gt;Drupal 6&lt;/em&gt;.   &lt;/p&gt;

&lt;p&gt;Entre las mejoras que se hacen estan:
- Soporte para replicación de datos en MySql
- Soporte de reverse proxys Varnish y Squid
- Optimización para MySql y quitando soporte de otras bases de datos
- Optimización para PHP 5 y quitando soporte de PHP 4&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El simple hecho de utilizar una distribución optimizada aumenta el rendimiento del sistema.&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Drupal y Content Delivery Network (CDN)</title>
          <link>http://www.profesional.co.cr/es/book/drupal-y-content-delivery-network-cdn/</link>
          <pubDate>Thu, 22 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/drupal-y-content-delivery-network-cdn/</guid>
          <description>&lt;h2 id=&quot;drupal-y-cdn&quot;&gt;Drupal y CDN&lt;/h2&gt;
&lt;p&gt;Dentro de un esquema parecido en cuanto al tipo de resultados esta el usar un CDN (Content Delivery Network) que consiste en colocar los archivos estaticos en un servidor o servicio que se dedica especificamente a proveer archivos y relegar al servidor web de estos requests, liberando probablemente más de un 80% de los requests que recibe el servidor web.&lt;/p&gt;

&lt;p&gt;Este es un árticulo que escribí en el 2009 sobre CDN: &lt;a href=&quot;http://www.profesional.co.cr/es/2009/12/03/tutorial-content-delivery-network-cdn-1469/&quot;&gt;Tutorial de Content Delivery Network&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;cdn-y-localizacin&quot;&gt;CDN y localización&lt;/h2&gt;
&lt;p&gt;Una ventaja que ofrecen algunos proveedores de CDN es también la posibilidad de tomar los archivos estaticos y replicarlos en diferentes servidores al rededor del mundo de manera que cuando un usuario los solicita el servicio busca el servidor más cercano y le brinda el archivo desde ahí disminuyendo el tiempo de entrega del archivo.&lt;/p&gt;

&lt;h2 id=&quot;diferentes-formas-de-lograr-cdn&quot;&gt;Diferentes formas de lograr CDN&lt;/h2&gt;
&lt;p&gt;Podemos hablar de diferentes formas de proveer CDN.&lt;br /&gt;
A travez de un reverse proxy, teniendo al menos un servidor de archivos estaticos y haciendo que el reverse proxy se encargue de enviar todos los request dinamicos a este servidor, este debe estar optimizado para archivos estaticos y podria responder a muchos mas requests.&lt;br /&gt;
Usando un servicio de CDN, hay varios proveedores, inclusive, podria ser que el proveedor de su hosting ya provea este servicio.&lt;br /&gt;
Usando un dominio o subdominio diferente para estos archivos y esto iria a otro servidor.  &lt;/p&gt;

&lt;p&gt;Esas son algunas manera de proveer el servidor de CDN, pero ahora la pregunta es como hacemos para indicarle a Drupal que ciertos archivos deben servirse desde otro servidor?&lt;br /&gt;
En este sentido hay algo importante a tomar en cuenta, y es si constantemente se estan agregando archivos estaticos o no, por ejemplo, si los usuarios pueden subir imagenes al sitio.&lt;br /&gt;
En caso de que no se esten agregando archivos estaticos es mas sencillo porque hay más opciones para lograr el CDN.&lt;br /&gt;
Veamos un poco algunas opciones:&lt;br /&gt;
Usando un modulo como &lt;a href=&quot;http://drupal.org/project/cdn&quot;&gt;CDN Integration&lt;/a&gt; en su opcion simple o &lt;a href=&quot;http://drupal.org/project/simplecdn&quot;&gt;Simple CDN&lt;/a&gt; o un &lt;a href=&quot;http://www.voxel.net/mod_cdn&quot;&gt;modulo en el apache&lt;/a&gt;, o el reverse proxy y lo que se hace es que para ciertos tipos o rutas de archivos se obtienen de cierto servidor en vez del servidor web, esto se puede hacer duplicando todos los archivos estaticos del servidor a este otro servidor, pero solo funciona si no se estan agregando más archivos constantemente.&lt;br /&gt;
Otra opción para el caso de que no se estén agregando archivos dinámicamente, puede ser sincronizar los archivos al CDN en momentos específicos como cuando se hacen releases, para esto se puede utilizar rsync, software de deployment, o algunas librerías que interactúan con los diferentes servicios de CDN.&lt;br /&gt;
En caso de que se estén agregando archivos dinámicamente una opción es usar FileConveyor, un proyecto parte del CDN integration module. Este es un servicio que usa su propia base de datos y escucha los cambios en los directorios y crea una cola de archivos a subir y los va subiendo, parchea Drupal para devolver los paths remotos para archivos en el CDN y paths locales para los que aun no se han subido.  &lt;/p&gt;

&lt;p&gt;Articulo relacionado con este tema: &lt;a href=&quot;http://www.profesional.co.cr/es/2009/12/03/tutorial-content-delivery-network-cdn-1469&quot;&gt;Tutorial de Content Delivery Network&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>El cache de Drupal</title>
          <link>http://www.profesional.co.cr/es/book/cache-drupal/</link>
          <pubDate>Thu, 22 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/cache-drupal/</guid>
          <description>&lt;p&gt;Drupal tiene un cache que por defecto se guarda en la base de datos.&lt;br /&gt;
Este cache funciona en modo de llave/valor y en el se guarda aquello que el core o cada modulo considera que debe ser cacheado en vez de evaluarse en cada llamada.&lt;/p&gt;

&lt;p&gt;5ambién hay caches mas específicos como el de los bloques, forms, menu, páginas, rutas, etc; los bloques se cachean a diferentes niveles dependiendo de su uso, se pueden cachear por usuario, por role, por página, o global.&lt;/p&gt;

&lt;h2 id=&quot;para-que-cachear&quot;&gt;Para que cachear?&lt;/h2&gt;
&lt;p&gt;Si por ejemplo tenemos un bloque que muestra una información de los puntos del usuario y esta información la obtenemos haciendo un calculo pesado o haciendo varios otros requests es mas económico guardar el calculo por un tiempo definido o por sesión.&lt;br /&gt;
Otro ejemplo puede ser el tipo de cambio, este no se ocupa buscar cada vez, se puede cachear por un tiempo definido.  &lt;/p&gt;

&lt;p&gt;Al eliminar algunos requests o procesamiento extra por cachear contenido que no se require actualizar tan seguido podemos reducir drasticamente la carga del servidor y el tiempo, aumentando así el rendimiento.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Drupal y los recursos del servidor web</title>
          <link>http://www.profesional.co.cr/es/book/drupal-y-recursos-del-servidor-web/</link>
          <pubDate>Fri, 09 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/drupal-y-recursos-del-servidor-web/</guid>
          <description>&lt;p&gt;El servidor tiene recursos limitados y por tanto una cantidad limitada de solicitudes que puede atender simultáneamente.&lt;/p&gt;

&lt;h2 id=&quot;recursos-del-servidor&quot;&gt;Recursos del servidor&lt;/h2&gt;
&lt;p&gt;El servidor web puede manejar una cantidad limitada de request simultaneos, ya sean dinámicos o estáticos. En el caso de Drupal un request dinámico es bastante costoso, un solo request necesita abrir muchos archivos de codigo, templates, crear muchas variables, abrir conexiones a base de datos y traer datos de las bases y mantener algunos en memoria u otros procesarlos, podriamos hablar facilmente de unos 30 megas de memoria en un request y bastante procesamiento.&lt;br /&gt;
A diferencia de los request estaticos en los cuales se suele solamente abrir un archivo y redireccionar estos datos al output, lo cual no se compara en cuanto a nivel de procesamiento y memoria, pero el detalles es que una instancia que maneja request no se suele crear y destruir con cada request porque esto tambien es costoso, por lo que se suelen reutilizar (es parte de la configuracion del server), esto hace que el mismo proceso que atiende un request dinamico sea el mismo que atiende un request estatico, por lo que en un servidor tenemos un limite fijo de procesos que podemos atender simultaneamente.&lt;/p&gt;

&lt;h2 id=&quot;requests-estticos-y-dinmicos&quot;&gt;Requests estáticos y dinámicos&lt;/h2&gt;
&lt;p&gt;Ahora, porque debe importarnos los request estaticos? Para empezar, una pagina comunmente se compone de 1 request dinamico que entrega el HTML y unos 20-80 requests estaticos (css, js, imagenes).&lt;br /&gt;
Si lo vemos desde esa perspectiva, el servidor mantiene ocupados bastantes recursos en responder requests estaticos que no cambian usualmente o de usuario en usuario.&lt;/p&gt;

&lt;h2 id=&quot;secciones-de-los-requests-dinamicos&quot;&gt;Secciones de los requests dinamicos&lt;/h2&gt;
&lt;p&gt;En algunas tecnologias se usa el termino Hot Spot (o punto caliente) para definir un segmento que tendria mucho impacto en ser mejorado, ya sea porque se ejecuta muy frecuentemente o porque es muy pesado.&lt;br /&gt;
En Drupal hay secciones en las paginas que son mas pesados que otros, y a veces estos no cambian en un lapso de tiempo o en una session.&lt;br /&gt;
Tambien hay paginas en las que lo unico que cambia de usuario a usuario es una pequeña seccion.&lt;br /&gt;
Si tomamos esto en cuenta nos podriamos ver beneficiados con ser selectivos a la hora de hacer cacheo, ya sea cacheando secciones especificas o cacheando todo menos una seccion.&lt;/p&gt;

&lt;h2 id=&quot;anonimos-y-autenticados&quot;&gt;Anonimos y Autenticados&lt;/h2&gt;
&lt;p&gt;En cuanto a las posibilidades de cacheo hay una gran diferencia entre usuarios anonimos y autenticados.&lt;br /&gt;
En el caso de usuarios autenticados, es normal que parte de la informacion desplegada cambie para cada usuario, desde cosas tan sencillas como el nombre del usuario en alguna parte de la pagina hasta el contenido completo y el tema.&lt;br /&gt;
Pero, en cuanto a usuarios anonimos es otra historia, los usuarios anonimos no se pueden distinguir (usualmente, aunque si podemos saber su geo localizacion, browser, OS, etc, pero eso es otra historia), por lo que usualmente se despliega el mismo contenido para todos los usuarios anonimos.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>¿Como optimizar Drupal para alto rendimiento?</title>
          <link>http://www.profesional.co.cr/es/book/como-optimizar-drupal-para-alto-rendimiento/</link>
          <pubDate>Fri, 09 Sep 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/book/como-optimizar-drupal-para-alto-rendimiento/</guid>
          <description>&lt;p&gt;A grandes razgos hay varias formas de optimizar Drupal y lo recomendable es utilizar varias de estas para un resultado óptimo, pero no solo se trata de optimizar por optimizar, sino encontrar cuales optimizaciones son las que lograrian mayor beneficio para cada caso, por eso mi intencion tambien es discutir en cuales situaciones se debe utilizar cada metodo.&lt;/p&gt;

&lt;p&gt;En estos días estaré dando una charla sobre este tema, pero también quiero escribir la guía aquí en modo de libro.&lt;/p&gt;

&lt;p&gt;Primero, la razón de hacer optimizaciones en Drupal se debe a algo muy simple, todo el poder de Drupal no viene de gratis, el que muchas cosas esten listas para ser utilizadas en core o usando modulos, y todo el esquema modular de Drupal tiene un costo en rendimiento, no es lo mismo hacer una pagina sencilla que haga poco y escribirla en pocas lineas de codigo, haciendo solo uno o 2 queries a la base de datos que tener todo un sistema complejo que debe cargar modulos, lenguajes, permisos, etc, donde para el despliegue de cualquier pagina sencilla implica abrir muchos archivos de codigo (decenas o mas bien cientos) y hacer decenas de queries a la base de datos.&lt;/p&gt;

&lt;p&gt;Dentro de las variables a analizar para esto hay que considerar varios factores:
- La version de Drupal (dependiendo de la version (5, 6 o 7) hay limitaciones en cuanto a lo que se puede hacer o pasos extra que se deben tomar para hacer algo que en otra version es mas sencillo.
- Los recursos del servidor, hay tecnicas que aunque dan gran resultados pueden requerir mayores recursos del servidor y si este no tiene los recursos necesarios la tecnica mas bien podria bajar el rendimiento.
- Cual es el uso publico del sitio y el uso de usuarios logueados en el sitio
- A que esta enfocado el uso del sitio y las caracteristicas que se le agregan o activan al sitio
- La cantidad de hits que recibe el sitio&lt;/p&gt;

&lt;p&gt;Para optimizar hay varias formas de hacerlo y cada una con diferentes tecnicas para lograrlo.
- Reducir la cantidad de requests estaticos al servidor (reverse proxy, CDN, cache, etc)
- Reducir la cantidad de request (parciales o totales) dinamicos al servidor (precompiladores y cacheadores de codigo, caches totales o parciales, ajax, etc)
- Optimizar el servidor web (configuracion, benchmark)
- Optimizar el servidor de base de datos (configuracion, benchmark)
- Optimizar el codigo (Aqui hay varias tecnicas mas avanzadas, como creacion de modulos custom para alterar algunas funcionalidades o reemplazarlas y en casos extremos parches)&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Bits, Bytes, Nibles, Sets, Enums, Flags en PHP y MySQL en pro de eficiencia</title>
          <link>http://www.profesional.co.cr/es/2011/04/25/bits-bytes-nibles-sets-enums-flags-php-mysql-y-drupal-pro-eficiencia-1476/</link>
          <pubDate>Mon, 25 Apr 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2011/04/25/bits-bytes-nibles-sets-enums-flags-php-mysql-y-drupal-pro-eficiencia-1476/</guid>
          <description>&lt;p&gt;Es posible sacar más provecho al espacio y los datos en la base de datos y el codigo, y es de hecho muy importante, para algunos enfoques se puede utilizar datos a nivel de bits de manera eficiente, tanto en el codigo PHP, MySQL y en Drupal.&lt;/p&gt;

&lt;p&gt;Antes de mejorar algo o sacarle más provecho es importante entenderlo, para esto vamos a hacer un repaso de algebra booleana.&lt;br /&gt;
Un Byte son 8 bits, 1 byte (tiny int en mysql) nos permite guardar 256 valores diferentes, 2 Bytes (smallint en mysql) nos dan 65.536 valores diferentes y 4 Bytes (int en mysql) nos dan 4.294.967.296 valores diferentes y el BigInt usando 8 Bytes.&lt;br /&gt;
También algunos engines soportan el uso de Bit como tipo de dato, soportando hasta 64 bits por tabla.&lt;br /&gt;
Además, esta los tipos Enum y Set.&lt;/p&gt;

&lt;h2 id=&quot;enum&quot;&gt;ENUM&lt;/h2&gt;
&lt;p&gt;El ENUM puede contener hasta 65.535 valores diferentes (y el vacio o cero) y esta catalogado dentro de los tipos de datos de string por la manera en la que se utiliza, ya que cada valor esta asociado a un string y se utiliza como si se entuviera ingresando o sacando strings que dentro del engine son representados por un valor numerico.&lt;br /&gt;
Al final de cuentas, cualquier tipo numerico, inclyendo el Bit puede ser utilizado de la misma manera que un Enum, con la unica diferencia que el valor que representa debera ser interpretado en la aplicación y no es tan legible en la base de datos.&lt;br /&gt;
La manera propuesta en ese caso, es usar un numero para representar un estado, teniendo solamente 1 valor al mismo tiempo salvado por cada dato, lo más usual es utilizar tiny o small ints ya que no se suelen manejar grandes cantidades de flags o estados.  &lt;/p&gt;

&lt;p&gt;Un ejemplo de esto es utilizar un campo en la base de datos para indicar el estado actual de una cuenta bancaria, donde digamos que tenemos los siguientes estados:   &lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Estado&lt;/th&gt;&lt;th&gt;Valor numerico&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;En revision&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Denegada&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Activa&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Suspendida&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Inactiva&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Una cuenta puede contener solo uno de estos valores al mismo tiempo y por eficiencia utilizamos ya sea un Enum que se representa como un valor numerico en la base de datos o un tiny int y en nuestra aplicacion interpretamos cada valor numerico como un estado.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE Cuenta (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -- Mas campos
    Estado ENUM(&amp;#39;En revision&amp;#39;, &amp;#39;Denegada&amp;#39;, &amp;#39;Activa&amp;#39;, &amp;#39;Suspendida&amp;#39;, &amp;#39;Inactiva&amp;#39;) NOT NULL
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y se puede utilizar algo asi:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
// Actualice el estado de la cuenta
$estado = &amp;#39;Activa&amp;#39;;
$cuenta = 123;
$connection-&amp;gt;query(&amp;quot;UPDATE Cuenta SET Estado = &amp;#39;$estado&amp;#39; WHERE Id = $cuenta&amp;quot;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Que a nivel de espacio y de datos es equivalente a lo siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE Cuenta (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -- Mas campos
    Estado TINYINT NOT NULL
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y se puede utilizar algo asi:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
define(&amp;#39;ESTADO_EN_REVISION&amp;#39;, 0);
define(&amp;#39;ESTADO_DENEGADA&amp;#39;, 1);
define(&amp;#39;ESTADO_ACTIVA&amp;#39;, 2);
define(&amp;#39;ESTADO_SUSPENDIDA&amp;#39;, 3);
define(&amp;#39;ESTADO_INACTIVA&amp;#39;, 4);
$estado = ESTADO_ACTIVA;
$cuenta = 123;
$connection-&amp;gt;query(&amp;quot;UPDATE Cuenta SET Estado = $estado WHERE Id = $cuenta&amp;quot;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;set&quot;&gt;SET&lt;/h2&gt;
&lt;p&gt;Ahora, esta el otro tipo de uso, que consta de utilizar varios valores simultaneos enmascarados en un mismo dato.&lt;/p&gt;

&lt;p&gt;Probablemente el ejemplo de uso mas claro es el tipo Set que puede contener 64 valores simultaneos, al utilizar un tipo SET de MySql, se define los diferentes valores que puede contener, se define en strings que son representados por valores numericos de exponente 2, esto permite que cada valor pueda coexistir con los demas ya que cada valor ocupa un bit binario en una posicion diferente.&lt;/p&gt;

&lt;p&gt;Tomemos como ejemplo caracteristicas de un producto el cual puede tener los siguientes estados simultaneamente:&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;Estado&lt;/th&gt;&lt;th&gt;Valor Binario&lt;/th&gt;&lt;th&gt;Valor Numerico&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Activo&lt;/td&gt;&lt;td&gt;00000001&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Excento&lt;/td&gt;&lt;td&gt;00000010&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Perecedero&lt;/td&gt;&lt;td&gt;00000100&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;En Descuento&lt;/td&gt;&lt;td&gt;00001000&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Nota:&lt;/em&gt; Los valores decimales aumentan en exponente 2, o sea 2 elevado a la posicion del digito.&lt;/p&gt;

&lt;p&gt;Como se puede notar de sus valores binarios estos valores puede coexistir al mismo tiempo, por ejemplo, si aplicamos el operador binario “O” (OR) a un par de valores, digamos, que el producto esta activo y en descuento:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;00000001 | 00001000 = 00001001&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;o que es lo mismo 1+8=9&lt;/p&gt;

&lt;p&gt;Y a este podemos agregarlo un estado mas en cualquier momento:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;00001001 | 00000010 = 00001011&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Además con la operacion “O Exclusivo” (XOR) podemos remover cualquier estado, por ejemplo, quitemos el estado de activo:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;00001011 ^ 00000001 = 00001010&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esto se puede implementar de la siguiente manera:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE Producto (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -- Mas campos
    Estado SET(&amp;#39;Activo&amp;#39;, &amp;#39;Excento&amp;#39;, &amp;#39;Perecedero&amp;#39;, &amp;#39;En Descuento&amp;#39;) NOT NULL
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y utilizarse algo asi:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
// Busque producto que tenga X estado usando FIND_IN_SET
$estado = &amp;#39;Activo&amp;#39;;
$connection-&amp;gt;query(&amp;quot;SELECT * FROM Producto WHERE FIND_IN_SET(&amp;#39;$estado&amp;#39;, Estado)&amp;quot;);
// Busque producto con X estado usand Y BINARIO (AND)
$estado = 1;
$connection-&amp;gt;query(&amp;quot;SELECT * FROM Producto WHERE Estado &amp;amp; $estado&amp;quot;);
// En el select, lo que devuelve la base de datos es un string separado por comas para los diferentes valores.
// Agregue un estado a un producto
$producto = 123;
$connection-&amp;gt;query(&amp;quot;UPDATE Producto SET Estado = Estado | 1 WHERE Id = $producto&amp;quot;);
$connection-&amp;gt;query(&amp;quot;UPDATE Producto SET Estado = &amp;#39;Activo,Excento&amp;#39; WHERE Id = $producto&amp;quot;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Que es equivalente a lo siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE Producto (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -- Mas campos
    Estado TINYINT NOT NULL
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;script src=&quot;https://gist.github.com/nestormata/c4e806d395b09f2799c2.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;Esta es una manera de reducir el tamaño de los datos en la base de datos de manera eficiente.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch</title>
          <link>http://www.profesional.co.cr/es/2011/03/23/como-utilizar-videos-tomados-otras-camaras-imovie-app-para-iphone-ipad-o-ipod-touch-1475/</link>
          <pubDate>Wed, 23 Mar 2011 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2011/03/23/como-utilizar-videos-tomados-otras-camaras-imovie-app-para-iphone-ipad-o-ipod-touch-1475/</guid>
          <description>&lt;p&gt;Recientemente compré el &lt;strong&gt;iPod Touch&lt;/strong&gt; de 4ta generación (también aplica al &lt;strong&gt;iPad&lt;/strong&gt; y al &lt;strong&gt;iPhone&lt;/strong&gt;) e intenté usar videos que habia tomado previamente en mi camara, pero el &lt;strong&gt;iMovie app&lt;/strong&gt; no me muestra estos videos para utilizarlos, solo me muestra los que se tomaron con el mismo iPod Touch, aquí les enseñaré como lograr usar otros videos en el &lt;strong&gt;iMovie app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El problema de que el &lt;strong&gt;iMovie app&lt;/strong&gt; no te permita elegir videos no tomados con el &lt;strong&gt;iPod Touch (o el iPad o iPhone)&lt;/strong&gt; realmente radica en una restricción de formato, el formato del video no solo debe ser un formato compatible para visualizar en el &lt;strong&gt;iPod Touch o iPad o iPhone&lt;/strong&gt;, sino que debe tener el mismo formato con el que se crean los videos en el dispositivo, o sea que si se convierte cualquier video al formato correcto puede ser utilizado en &lt;strong&gt;iMovie&lt;/strong&gt; para crear y editar tus propios videos.&lt;br /&gt;
Les enseñaré 2 maneras de lograrlo, la primera desde el mismo dispositivo y la segunda desde la computadora, que en mi caso es una PC, pero el proceso puede ser logrado desde cualquier computadora.  &lt;/p&gt;

&lt;h2 id=&quot;desde-el-mismo-dispositivo-ipod-touch-iphone-or-ipad&quot;&gt;Desde el mismo dispositivo (iPod Touch, iPhone or iPad)&lt;/h2&gt;
&lt;p&gt;Se puede utilizar otro app de edición de video que permita tomar un video cualquiera de su colección de videos, editarlo y exportarlo.&lt;br /&gt;
Voy a explicar como hacerlo usando ReelDirector app, que por cierto es una buena aplicación para editar videos parecido al iMovie&lt;/p&gt;

&lt;div class=&quot;small-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/reeldirector.png&quot; alt=&quot;ReelDirector - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;58&quot; height=&quot;58&quot; /&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;Primero, necesita convertir su video a un formato compatible con el iphone/ipod/ipad para poder importarlo al dispositivo, para esto puede utilizar una aplicación gratis como &lt;a href=&quot;http://handbrake.fr/&quot;&gt;Handbreadk&lt;/a&gt;, que tiene presets para exportar a la mayoria de los dispositivos comunes.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Coloque el video convertido en una de sus librerias que se sincronizan con el dispositivo, marque la opción de sincronizar videos y sincronice.&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/001_import_videos.png&quot; alt=&quot;Importar videos - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;523&quot; height=&quot;132&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Cree un nuevo projectos en ReelDirector y agregue el video que importó, en el caso de ReelDirector el mantendrá el audio tal cual venia en el video original al momento de salvar el projecto y esto probablemente hará que no se pueda utilizar el video en iMovie, para eso remueva el audio del video en el proyecto.&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/002_create_proejct.png&quot; alt=&quot;Cree un projecto en ReelDirector - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;220&quot; height=&quot;98&quot; /&gt;&lt;/div&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/003_set_project_settings.png&quot; alt=&quot;Defina las propiedades del projecto en ReelDirector - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;241&quot; height=&quot;123&quot; /&gt;&lt;/div&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/005_select_video_type.png&quot; alt=&quot;Agregue su video en ReelDirector - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;220&quot; height=&quot;330&quot; /&gt;&lt;/div&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/007_choose_video.png&quot; alt=&quot;Seleccione el video a importar en ReelDirector - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;241&quot; height=&quot;190&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Salve, renderice y exporte el video.&lt;/li&gt;
  &lt;li&gt;Ahora ya puede utilizar el video en su proyecto de iMovie (sin el audio original)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;desde-su-computadora-usando-un-convertidor-de-video&quot;&gt;Desde su computadora usando un convertidor de video&lt;/h2&gt;
&lt;p&gt;Usted necesitará un buen convertidor de video que le permita escoger en una manera customizada no solo el formato del video, sino también del audio, en mi caso utilicé Adobe Media Encoder&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Agregue el video que quiere convertir&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b002_adobe_media_encoder.png&quot; alt=&quot;Agruegue el video a convertir - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;358&quot; height=&quot;374&quot; /&gt;&lt;/div&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b003_select_video.png&quot; alt=&quot;Seleccione el video a ser convertido - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;450&quot; height=&quot;333&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ingrese a “settings” para definir las opciones de los codecs&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b004_go_to_settings.png&quot; alt=&quot;Ingrese a settings - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;460&quot; height=&quot;263&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;En la opción del formato elija “QuickTime”&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b005_settings_quicktime.png&quot; alt=&quot;Seleccione QuickTime en el formato - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;405&quot; height=&quot;57&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;En la pestaña de Video elija el codec = “H.264”&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b006_settings_video_h264.png&quot; alt=&quot;Elija video codec H.264 - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;420&quot; height=&quot;109&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;En la pestaña de Audio elija Audio Codec = “AAC”, Sample Rate = 44100 Hz y Channels = “Mono”&lt;/p&gt;

    &lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/b007_settings_audio.png&quot; alt=&quot;Elija audio codec AAC - Como utilizar videos tomados con otras camaras en iMovie app para iPhone, iPad o iPod Touch&quot; width=&quot;426&quot; height=&quot;274&quot; /&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Exporte su video, y ahora este tiene el formato que le pertirá utilizarlo en iMovie.&lt;/li&gt;
  &lt;li&gt;Coloque su video en alguna de sus librerias de imagenes que se sincronizan con su dispositivo y luego en iMovie seleccione su video, que probablemente estará en el inicio de la lista por su fecha de creación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Personalmente prefieron la segunda opción, es una buena opción para utilizar esos videos que tomamos con otras camaras o dispositivos y tener la posibilidad de usarlos en iMovie para crear y editar tus propios videos.&lt;br /&gt;
Disfruten y dejenme saber si encuentran otra herramienta que hagan las cosas más fáles o que sea gratis para compartirla con los demás.&lt;/p&gt;

&lt;p&gt;-Nestor&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
        <item>
          <title>Como usar diferentes web.config para cada ambiente - Transformaciones de web.config</title>
          <link>http://www.profesional.co.cr/es/2010/11/04/como-usar-diferentes-webconfig-para-cada-ambiente-transformaciones-webconfig-1473/</link>
          <pubDate>Thu, 04 Nov 2010 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2010/11/04/como-usar-diferentes-webconfig-para-cada-ambiente-transformaciones-webconfig-1473/</guid>
          <description>&lt;p&gt;En &lt;em&gt;.Net framework 4 (Visual Studio 2010)&lt;/em&gt; ahora hay una funcionalidad que permite tener &lt;em&gt;diferentes configuraciones del web.config&lt;/em&gt; para cada ambiente de desarrollo, pruebas y/o producción. Una solución para un problema de siempre.&lt;/p&gt;

&lt;p&gt;Este es un problema de hace tiempo y que por fin Microsoft se decidió a darnos una herramienta para solucionarlo, he visto diferentes implementaciones de esta solución efectuadas por los programadores, pero recomiendo el uso de esta funcionalidad ya que esta disponible en &lt;em&gt;Visual Studio 2010&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El problema consiste en que para los que desarrollan web en .Net la configuración se suele y se recomienda que este en el &lt;em&gt;web.config&lt;/em&gt;, pero usualmente esta configuración debe ser &lt;em&gt;diferente para cada ambiente&lt;/em&gt;, por ejemplo, para el ambiente local, para un servidor de pruebas, uno de staging y uno o varios de producción, y es un poco complicado resolver como tener &lt;em&gt;diferentes web.config para cada ambiente&lt;/em&gt; y que esto no implique algo manual para evitar una equivocación a la hora de publicarse la aplicación en cada uno de los ambientes.&lt;/p&gt;

&lt;p&gt;Para solucionar esto, &lt;em&gt;Visual Studio 2010&lt;/em&gt; ahora viene con una funcionalidad que permite &lt;em&gt;transformar el web.config&lt;/em&gt; durante el proceso de &lt;em&gt;publicación&lt;/em&gt; para modificar la configuración para cada ambiente, manteniendo &lt;em&gt;automaticamente diferentes web.config en cada ambiente&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;pasos&quot;&gt;Pasos:&lt;/h3&gt;
&lt;p&gt;Primero, no cree el proyecto como un sitio web (“Web Site”), ya que este tipo de proyecto no tiene esta caracteristica, debe crear el proyecto como una aplicación web ASP.Net (“ASP.Net Web Application”).&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_1_0.gif&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Creación de proyecto&quot; width=&quot;597&quot; height=&quot;412&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Al hacer esto notará que se crean unos archivos debajo del Web.config (en el Solution Explorer), cada uno de estos correspondiente a cada una de las configuraciones del Configuration Manager.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_2.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Diferentes web.config&quot; width=&quot;272&quot; height=&quot;103&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_3.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Diferentes web.config&quot; width=&quot;262&quot; height=&quot;572&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ahora vaya al Configuration Manager para crear una nueva configuración para un servidor de producción, asegurese de marcar &lt;em&gt;“Create new project configurations”&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_4.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Cree nueva configuración de proyecto&quot; width=&quot;374&quot; height=&quot;185&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_5.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Cree nueva configuración de proyecto&quot; width=&quot;409&quot; height=&quot;296&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_6.gif&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Cree nueva configuración de proyecto&quot; width=&quot;498&quot; height=&quot;303&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Esto crea una nueva configuración.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_7.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Nueva configuración de proyecto creada&quot; width=&quot;409&quot; height=&quot;296&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ahora puede dar click derecho sobre el archivo de Web.config y usar la opción “Add Config Transformations” que agregará un archivo de transformación por cada configuración creada que aun no tenga un archivo de transformación.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_8.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Agregué transformaciones de configuración&quot; width=&quot;324&quot; height=&quot;270&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_9.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Diferentes transformaciones para el web.config&quot; width=&quot;266&quot; height=&quot;571&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Cree una nueva configuración de publicación.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_10.png&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Creación de configuración de publicación&quot; width=&quot;344&quot; height=&quot;62&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/webconfig_transformation_11.gif&quot; alt=&quot;Visual Studio 2010 transformación de web.config para diferentes ambientes - Creación de configuración de publicación&quot; width=&quot;286&quot; height=&quot;410&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;ejemplo-de-webconfig&quot;&gt;Ejemplo de web.config&lt;/h2&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;configuration&amp;gt;
	&amp;lt;appSettings&amp;gt;
		&amp;lt;add key=&amp;quot;APIKey&amp;quot; value=&amp;quot;5200eb9e591cc4a19178f8fac1c210fc&amp;quot;/&amp;gt;
		&amp;lt;add key=&amp;quot;Secret&amp;quot; value=&amp;quot;e957123205f4a7f7a95e2d352bcaf444&amp;quot;/&amp;gt;
		&amp;lt;add key=&amp;quot;ServiceBase&amp;quot; value=&amp;quot;http://localhost:49396/&amp;quot;/&amp;gt;
		&amp;lt;add key=&amp;quot;Callback&amp;quot; value=&amp;quot;http://localhost:26813/101FTB/&amp;quot;/&amp;gt;
	&amp;lt;/appSettings&amp;gt;
	&amp;lt;connectionStrings&amp;gt;
		&amp;lt;add name=&amp;quot;MyDBConnectionString&amp;quot; connectionString=&amp;quot;Data Source=localhost;Initial Catalog=FreeTechBooks;User ID=Guest&amp;quot; providerName=&amp;quot;System.Data.SqlClient&amp;quot;/&amp;gt;
	&amp;lt;/connectionStrings&amp;gt;
  ...
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;ejemplo-de-transformacin-de-webconfig-para-produccin-webconfigproduccion&quot;&gt;Ejemplo de transformación de web.config para producción (web.config.produccion)&lt;/h2&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;configuration xmlns:xdt=&amp;quot;http://schemas.microsoft.com/XML-Document-Transform&amp;quot;&amp;gt;
    &amp;lt;appSettings&amp;gt;
        &amp;lt;add value=&amp;quot;a44a569d89f09862bdeac3e9e7c155aa&amp;quot; xdt:Transform=&amp;quot;SetAttributes(value)&amp;quot; xdt:Locator=&amp;quot;Condition(@key=&amp;#39;APIKey&amp;#39;)&amp;quot;/&amp;gt;
        &amp;lt;add value=&amp;quot;9a6e6fbda2558fad51f25b7f62bad80d&amp;quot; xdt:Transform=&amp;quot;SetAttributes(value)&amp;quot; xdt:Locator=&amp;quot;Condition(@key=&amp;#39;Secret&amp;#39;)&amp;quot;/&amp;gt;
        &amp;lt;add value=&amp;quot;http://www.mysitelive.com/&amp;quot; xdt:Transform=&amp;quot;SetAttributes(value)&amp;quot; xdt:Locator=&amp;quot;Condition(@key=&amp;#39;ServiceBase&amp;#39;)&amp;quot;/&amp;gt;
        &amp;lt;add value=&amp;quot;http://fbapps.mysitelive.com/myapplive/&amp;quot; xdt:Transform=&amp;quot;SetAttributes(value)&amp;quot; xdt:Locator=&amp;quot;Condition(@key=&amp;#39;Callback&amp;#39;)&amp;quot;/&amp;gt;
    &amp;lt;/appSettings&amp;gt;
    &amp;lt;connectionStrings&amp;gt;
      &amp;lt;add name=&amp;quot;MyDBConnectionString&amp;quot; 
        connectionString=&amp;quot;Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True&amp;quot; 
        xdt:Transform=&amp;quot;SetAttributes&amp;quot; xdt:Locator=&amp;quot;Match(name)&amp;quot;/&amp;gt;
    &amp;lt;/connectionStrings&amp;gt;
  &amp;lt;system.web&amp;gt;
  &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Hay diferentes formas de transformar el web.config, este es un ejemplo sencillo que modifica el value para unos settings y el tag completo para el connectionString.&lt;/p&gt;

&lt;p&gt;En el momento en que se hace la publicación Visual Studio modifica el archivo que pone en el servidor.&lt;/p&gt;

&lt;p&gt;Para más información de las transformaciones puede leer aquí: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd465326%28VS.100%29.aspx&quot;&gt;Referencia&lt;/a&gt;&lt;/p&gt;

</description>
        </item>
      
    
      
    
      
        <item>
          <title>Como definir el tamaño de un indice en el Database Schema de Drupal</title>
          <link>http://www.profesional.co.cr/es/2010/06/04/como-definir-tama-o-un-indice-database-schema-drupal-1472/</link>
          <pubDate>Fri, 04 Jun 2010 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2010/06/04/como-definir-tama-o-un-indice-database-schema-drupal-1472/</guid>
          <description>&lt;p&gt;Considero que se debe ser muy cuidadoso y detallado a la hora de definir las bases de datos en un proyecto, es ahi uno de los puntos que garantizaran el éxito o el fracaso en términos de eficiencia.&lt;/p&gt;

&lt;p&gt;Drupal 6 y posterior tiene una conveniente manera de definir las tablas sin usar la sintaxis de un servidor de base de datos especifico, pero esto a veces viene con un sacrificio en la flexibilidad de lo que se puede hacer, como por ejemplo definir el tamaño de un indice de texto, así que a continuación explico como lograr esto.&lt;br /&gt;
En algunos casos usted podría tener un campo de texto (char) en su tabla y quiere indexar sobre ese campo pero no es necesario usar todo el largo del texto puesto que con solo los primeros caracteres se obtiene suficiente eficiencia sin sacrificar el tamaño del indice haciendolo muy grande.  &lt;/p&gt;

&lt;p&gt;Para lograr esto en MySql se haría algo como lo siguiente:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;CREATE TABLE my_table (
  an_id int(10) unsigned NOT NULL AUTO_INCREMENT,
  other_id int(10) unsigned NOT NULL,
  name varchar(30) NOT NULL,
  PRIMARY KEY (an_id),
  UNIQUE KEY unique_key_name (an_id, name),
  KEY limited_length_text_index (name(10)) -- Esto limita el tamaño del indice a solo los primero 10 caracteres
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pero, para indicarle a Drupal a travez del esquema de base de datos (database schema) hay que hacer un pequeño truco de la siguiente manera:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&amp;lt;?php
$schema[&amp;#39;my_table&amp;#39;] = array(
  &amp;#39;fields&amp;#39; =&amp;gt; array(
    &amp;#39;an_id&amp;#39; =&amp;gt; array(
      &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;serial&amp;#39;,
      &amp;#39;unsigned&amp;#39; =&amp;gt; TRUE,
      &amp;#39;not null&amp;#39; =&amp;gt; TRUE,
    ), 
    &amp;#39;other_id&amp;#39; =&amp;gt; array(
      &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;int&amp;#39;, 
      &amp;#39;unsigned&amp;#39; =&amp;gt; TRUE,
      &amp;#39;not null&amp;#39; =&amp;gt; TRUE,
    ),                                                                                                                                                        
    &amp;#39;name&amp;#39; =&amp;gt; array(
      &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;char&amp;#39;,
      &amp;#39;not null&amp;#39; =&amp;gt; TRUE,
      &amp;#39;length&amp;#39; =&amp;gt; 30,
    ),
  ),
  &amp;#39;indexes&amp;#39; =&amp;gt; array(
    /* Esto limita el tamaño del indice a solo los primero 10 caracteres */
    &amp;#39;limited_length_text_index&amp;#39; =&amp;gt; array(&amp;#39;fields&amp;#39; =&amp;gt; array(&amp;#39;name&amp;#39;, 10)),
  ),
  &amp;#39;unique keys&amp;#39; =&amp;gt; array(
    &amp;#39;unique_key_name&amp;#39; =&amp;gt; array(&amp;#39;an_id&amp;#39;, &amp;#39;name&amp;#39;),
  ),
  &amp;#39;primary key&amp;#39; =&amp;gt; array(&amp;#39;an_id&amp;#39;),
);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Espero que este pequeño tutorial les pueda ayudar a diseñar bases de datos eficientes en sus proyectos o modulos.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>De sangre y entrega, vivamos el voto en las elecciones de Costa Rica con responsabilidad</title>
          <link>http://www.profesional.co.cr/es/2010/02/07/sangre-y-entrega-vivamos-voto-las-elecciones-costa-rica-responsabilidad-1470/</link>
          <pubDate>Sun, 07 Feb 2010 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2010/02/07/sangre-y-entrega-vivamos-voto-las-elecciones-costa-rica-responsabilidad-1470/</guid>
          <description>&lt;p&gt;En el mundo se han librado batallas y derramado la sangre por la consigna de la libertad, por la capacidad de elegir libremente, de decidir.&lt;/p&gt;

&lt;p&gt;Muchos se han puesto al frente sabiendo que no se verá más el sol, pero con la esperanza que sus similares puedan llamarse libres.&lt;br /&gt;
En &lt;strong&gt;Costa Rica&lt;/strong&gt;, aunque hace muchos años que se emite el &lt;strong&gt;sufragio&lt;/strong&gt;, también se han librado batallas y derramado la sangre.&lt;br /&gt;
La evolución del &lt;strong&gt;sufragio&lt;/strong&gt; no ha sido sencilla, ni de la noche a la mañana, lo que hoy tenemos en &lt;strong&gt;Costa Rica&lt;/strong&gt;, esa &lt;strong&gt;libertad&lt;/strong&gt; de &lt;strong&gt;elegir&lt;/strong&gt;, la capacidad de cada uno y de todos de &lt;strong&gt;decidir&lt;/strong&gt; quien nos &lt;strong&gt;gobernará&lt;/strong&gt; cada 4 años, no fue algo sencillo.&lt;br /&gt;
Una &lt;strong&gt;historia&lt;/strong&gt; larga y compleja antecede este día, una &lt;strong&gt;historia&lt;/strong&gt; dolida y llorada, pero al mismo tiempo festejada y vivida.&lt;br /&gt;
La fiesta de la democracia, como a veces se le llama a este día, ha sido algo que ha evolucionado, y no deja de hacerlo.&lt;br /&gt;
Con un pueblo como testigo, cada uno de los &lt;strong&gt;costarricenses&lt;/strong&gt;, salen hoy a &lt;strong&gt;votar&lt;/strong&gt;, a emitir su &lt;strong&gt;libertad&lt;/strong&gt;, a exigir su &lt;strong&gt;derecho&lt;/strong&gt;.&lt;br /&gt;
Es bonito exigir nuestros &lt;strong&gt;derechos&lt;/strong&gt;, pero nos volvemos niños malcriados cuando se trata de &lt;strong&gt;enfrentar&lt;/strong&gt; nuestras &lt;strong&gt;responsabilidades&lt;/strong&gt;, somos buenos &lt;strong&gt;quejandonos&lt;/strong&gt;, pero no nos gusta cuando nos &lt;strong&gt;encaran&lt;/strong&gt; nuestra falta de &lt;strong&gt;responsabilidad&lt;/strong&gt;.&lt;br /&gt;
En un día como hoy, no se trata solo de ir a &lt;strong&gt;votar&lt;/strong&gt;, se trata de &lt;strong&gt;pensar&lt;/strong&gt;, &lt;strong&gt;analizar&lt;/strong&gt;, y tomar una &lt;strong&gt;decisión responsable&lt;/strong&gt;, se trata de &lt;strong&gt;elegir el rumbo que tomará nuestro país&lt;/strong&gt; en los próximos años.&lt;br /&gt;
Por lo que se escucha, me hace pensar que la mayor parte de los &lt;strong&gt;votos&lt;/strong&gt; de hoy o ausencia de ellos, se dará, en &lt;strong&gt;abstención y votos nulos&lt;/strong&gt;, de aquellos que no tienen un &lt;strong&gt;sentido de responsabilidad&lt;/strong&gt;, de aquellos que se &lt;strong&gt;quejan&lt;/strong&gt; que el &lt;strong&gt;país va mal&lt;/strong&gt;, pero cuando se les da en las manos la &lt;strong&gt;herramienta&lt;/strong&gt; para &lt;strong&gt;cambiar el rumbo&lt;/strong&gt; de las cosas, lo tiran al piso y se hacen los enojados, &lt;strong&gt;dan la espalda y siguen quejandose&lt;/strong&gt;.&lt;br /&gt;
Otros en cambio, van a &lt;strong&gt;votar&lt;/strong&gt;, y no votan nulo, votan por aquel &lt;strong&gt;“que no ganará”&lt;/strong&gt;, para no tener en su &lt;strong&gt;“conciencia”&lt;/strong&gt; que &lt;strong&gt;eligieron&lt;/strong&gt; a alguien que quedó presidente y no hizo un &lt;strong&gt;buen trabajo&lt;/strong&gt;, &lt;strong&gt;cobardes&lt;/strong&gt; son, y no tengo otra palabra para definirlos, les gusta &lt;strong&gt;quejarse&lt;/strong&gt;, y lo harán, y para ello evitar tomar un papel importante en la &lt;strong&gt;decisión&lt;/strong&gt; para no ser &lt;strong&gt;“señalados”&lt;/strong&gt;.&lt;br /&gt;
Entre los que quedan, queda la &lt;strong&gt;“masa”&lt;/strong&gt;, aquellos &lt;strong&gt;incapaces de pensar críticamente una decisión&lt;/strong&gt;, aquellos con el &lt;strong&gt;cerebro atrofiado&lt;/strong&gt; y con la unica capacidad de ver televisión en su tiempo libre, aquellos que &lt;strong&gt;no se dan a la tarea&lt;/strong&gt; de &lt;strong&gt;investigar y pensar&lt;/strong&gt;, cual será la mejor &lt;strong&gt;decisión&lt;/strong&gt; para nuestro país y al final, para &lt;strong&gt;ellos mismos&lt;/strong&gt;, aquellos que, con un &lt;strong&gt;saludo&lt;/strong&gt; desde un podio, con una &lt;strong&gt;sonrisa&lt;/strong&gt;, o con un &lt;strong&gt;slogan pegajoso&lt;/strong&gt; quedan convencidos de la innata &lt;strong&gt;capacidad&lt;/strong&gt; de un postulante para &lt;strong&gt;gobernar&lt;/strong&gt; de la mejor manera, sentarse a &lt;strong&gt;analizar&lt;/strong&gt; no es una tarea que les importe, es más sencillo hacer caso a los anuncios y con eso quedan &lt;strong&gt;satisfechos&lt;/strong&gt; de que tomaron la mejor &lt;strong&gt;decisión&lt;/strong&gt;, una &lt;strong&gt;decisión&lt;/strong&gt; a la deriva, una &lt;strong&gt;decisión&lt;/strong&gt; al viento, a lo que caiga, con la misma validez que &lt;strong&gt;tirar una moneda al aire y ver que pasa&lt;/strong&gt;, así de &lt;strong&gt;importante&lt;/strong&gt; es el &lt;strong&gt;país&lt;/strong&gt; y el &lt;strong&gt;futuro&lt;/strong&gt; para estos.&lt;br /&gt;
Pero hay aun un peor &lt;strong&gt;patriota&lt;/strong&gt;, aquel que sí lo piensa, aquel que sí lo &lt;strong&gt;analiza&lt;/strong&gt;, y muy friamente, pensando solo en su &lt;strong&gt;conveniencia individual&lt;/strong&gt;, aquel que se presta para el juego de &lt;strong&gt;votar&lt;/strong&gt; por el que &lt;strong&gt;mejor postor&lt;/strong&gt;, por aquel que le de un &lt;strong&gt;beneficio&lt;/strong&gt; directo y por debajo, de si me &lt;strong&gt;regalan&lt;/strong&gt; algo, si me dan un &lt;strong&gt;bono&lt;/strong&gt;, si me dan un &lt;strong&gt;puesto&lt;/strong&gt;, de si me &lt;strong&gt;pagan por votar&lt;/strong&gt;, aquel que no piensa en el &lt;strong&gt;futuro&lt;/strong&gt; ni en su &lt;strong&gt;país&lt;/strong&gt;, aquel que se olvida de la &lt;strong&gt;inflación&lt;/strong&gt; y de la &lt;strong&gt;inseguridad&lt;/strong&gt;, del &lt;strong&gt;futuro&lt;/strong&gt; de sus &lt;strong&gt;hijos&lt;/strong&gt; y piensa en el momento, piensa en el disfrute inmediato de un beneficio &lt;strong&gt;no ganado&lt;/strong&gt;, &lt;strong&gt;más casi, robado&lt;/strong&gt;, uno más de los &lt;strong&gt;pequeños corruptos&lt;/strong&gt;.&lt;br /&gt;
Después de grandes porcentajes de &lt;strong&gt;patriotas&lt;/strong&gt; que &lt;strong&gt;votan&lt;/strong&gt; por todas las &lt;strong&gt;razones equivocadas&lt;/strong&gt; o que simplemente no lo hacen, nos quedan unos pocos, que sí piensa, sí se dan &lt;strong&gt;responsablemente&lt;/strong&gt; a la tarea de &lt;strong&gt;investigar&lt;/strong&gt; y &lt;strong&gt;analizar&lt;/strong&gt; la mejor &lt;strong&gt;decisión&lt;/strong&gt; posible, tal vez se equivoquen, tal vez no vean algo, o tal vez simplemente creyeron las palabras escritas por quien no debieron creer, pero no importa, porque al menos &lt;strong&gt;lucharon&lt;/strong&gt;, al menos se &lt;strong&gt;esforzaron responsablemente&lt;/strong&gt;, al menos se lanzaron al agua con un poco de &lt;strong&gt;preparación&lt;/strong&gt;, &lt;strong&gt;sin importar el resultado ni por quien voten&lt;/strong&gt;, estos fueron &lt;strong&gt;heroes&lt;/strong&gt;, fueron &lt;strong&gt;verdaderos patriotas&lt;/strong&gt;, que &lt;strong&gt;supieron valorar los esfuerzos y la sangre de nuestros antepasados&lt;/strong&gt;.&lt;br /&gt;
Estos patriotas serán los que aunque su &lt;strong&gt;elección&lt;/strong&gt; no gane, ya ellos &lt;strong&gt;ganaron&lt;/strong&gt;, pues han dado de si para tomar una &lt;strong&gt;decisión responsable&lt;/strong&gt;.&lt;br /&gt;
Si te importa tu país, sal a &lt;strong&gt;votar&lt;/strong&gt;, si, a ejercer tu derecho, pero a la vez, hazte &lt;strong&gt;responsable&lt;/strong&gt;, asume la &lt;strong&gt;responsabilidad&lt;/strong&gt; que tu &lt;strong&gt;derecho&lt;/strong&gt; y tu &lt;strong&gt;decisión&lt;/strong&gt; acarrean, &lt;strong&gt;decide responsablemente&lt;/strong&gt;, &lt;strong&gt;no importa por quién votes, siempre y cuando lo hagas, y lo hagas a sabiendas de que lo estudiaste muy bien&lt;/strong&gt;, para que un mejor &lt;strong&gt;futuro&lt;/strong&gt; venga tanto para tí, como para todos.&lt;br /&gt;
Si te van a engañar, que por lo menos tengan que esforzarse, aquí estan los enlaces a los planes de gobierno de los 3 partidos más grandes, de los que pude encontrar los planes de gobierno.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laura Chinchilla, Liberación Nacional, plan de gobierno 2010-2014&lt;/strong&gt;: &lt;a href=&quot;http://www.pln.or.cr/docs/plangobierno2010_2014.pdf&quot;&gt;Plan&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Otto Guevara, Movimiento Libertario, plan de gobierno 2010-2014&lt;/strong&gt;: &lt;a href=&quot;http://ottoguevara2010.com/Plan%20Gobierno%20Movimiento%20Libertario.pdf&quot;&gt;Plan&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Ottón Solís, Partido Acción Ciudadana, convocatoria a la ciudadania 2010-2014&lt;/strong&gt;: &lt;a href=&quot;http://otton.cr/downloads/ConvocatoriaCiudadana.pdf&quot;&gt;Plan&lt;/a&gt;  &lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Tutorial de Content Delivery Network (CDN)</title>
          <link>http://www.profesional.co.cr/es/2009/12/03/tutorial-content-delivery-network-cdn-1469/</link>
          <pubDate>Thu, 03 Dec 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/12/03/tutorial-content-delivery-network-cdn-1469/</guid>
          <description>&lt;h3 id=&quot;introduccin&quot;&gt;Introducción&lt;/h3&gt;
&lt;p&gt;Hace años las computadoras no solían tener la cantidad de recursos que tienen actualmente, por lo que se debía ser muy cuidadoso con el uso responsable y eficiente de los servidores.&lt;/p&gt;

&lt;p&gt;Con el tiempo y el aumento de los recursos en los sistemas muchos programadores fueron creciendo en un ambiente en el que no requerían ser tan &lt;strong&gt;eficientes&lt;/strong&gt;, pero actualmente los sistemas se han vuelto más móviles y por tanto más pequeños y no tan potentes como lo que estábamos acostumbrados, y también los sistemas han migrado mucho más enfocados a web por lo que la cantidad de usuarios accediendo a los servidores es mucha.&lt;br /&gt;
Esto nos trae a que en la actualidad estemos forzados otra vez (por dicha) a tener la necesidad de ser &lt;strong&gt;eficientes&lt;/strong&gt; en cuanto a la &lt;strong&gt;utilización&lt;/strong&gt; de los &lt;strong&gt;recursos&lt;/strong&gt;.&lt;br /&gt;
En un sistema web de alta demanda la gran cantidad de &lt;strong&gt;recursos&lt;/strong&gt; de un &lt;strong&gt;servidor&lt;/strong&gt; se ve &lt;strong&gt;dividida&lt;/strong&gt; entre la &lt;strong&gt;cantidad&lt;/strong&gt; de &lt;strong&gt;usuarios&lt;/strong&gt; &lt;strong&gt;accediendo&lt;/strong&gt; &lt;strong&gt;simultáneamente&lt;/strong&gt;, lo cual crea una cantidad limitada de recursos por cada usuario.  &lt;/p&gt;

&lt;h3 id=&quot;qu-es-cdn&quot;&gt;Qué es CDN?&lt;/h3&gt;
&lt;p&gt;Una &lt;strong&gt;red de distribución de contenido&lt;/strong&gt; es una &lt;strong&gt;colección de servidores web distribuidos alrededor de multiples localizaciones para distribuir contenido más eficientemente&lt;/strong&gt; a los usuarios. El servidor seleccionado para distribuir el contenido a un específico usuario se basa normalmente en la medida de proximidad de la red.&lt;br /&gt;
Los &lt;strong&gt;CDN’s&lt;/strong&gt; son &lt;strong&gt;servidores&lt;/strong&gt; utilizados específicamente para distribuir &lt;strong&gt;contenido estático&lt;/strong&gt;, siendo este el más sencillo de distribuir independiente de la plataforma, el conjunto de servidores se visualiza como una &lt;strong&gt;nube&lt;/strong&gt;, los datos se encuentran__ distribuidos y replicados__ dentro de esta nube de servidores de manera que cualquiera de los servidores pueda entregar el mismo contenido cuando se le solicite.  &lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/cdn_cloud.png&quot; alt=&quot;CDN Cloud y como funciona&quot; width=&quot;599&quot; height=&quot;458&quot; /&gt;&lt;/div&gt;

&lt;h3 id=&quot;por-qu-debera-usar-cdn&quot;&gt;Por qué debería usar CDN?&lt;/h3&gt;
&lt;p&gt;Al utilizar &lt;strong&gt;CDN’s&lt;/strong&gt; se le entrega al usuario el &lt;strong&gt;contenido estático&lt;/strong&gt; de manera más &lt;strong&gt;eficientemente&lt;/strong&gt;, en beneficio de la &lt;strong&gt;velocidad&lt;/strong&gt; con que el usuario final percibe la respuesta total de la página.&lt;br /&gt;
Además de mejorar la experiencia del usuario, al utilizar un &lt;strong&gt;CDN&lt;/strong&gt; para &lt;strong&gt;distribuir el contenido estático&lt;/strong&gt; se está a su vez &lt;strong&gt;liberando a él o los servidores de aplicacione__s de la carga de procesar una gran parte de estas solicitudes que normalmente son más del 80% o 90% de la __cantidad de solicitudes&lt;/strong&gt; que se hacen al servidor, permitiendo así al servidor de aplicaciones utilizar toda su capacidad para procesar las solicitudes dinámicas.  &lt;/p&gt;

&lt;h3 id=&quot;funcionamiento-de-los-servidores-web&quot;&gt;Funcionamiento de los servidores web&lt;/h3&gt;
&lt;p&gt;Independientemente de la plataforma, los servidores web trabajan en &lt;strong&gt;memoria&lt;/strong&gt; y debido a que los &lt;strong&gt;recursos&lt;/strong&gt; de los &lt;strong&gt;servidores&lt;/strong&gt; son &lt;strong&gt;limitados&lt;/strong&gt; el servidor solo puede &lt;strong&gt;procesar&lt;/strong&gt; un &lt;strong&gt;numero máximo de solicitudes eficientemente&lt;/strong&gt; y un numero máximo de solicitudes antes de colapsar o de dejar de procesarlas.&lt;br /&gt;
Cada solicitud que ingresa al servidor es &lt;strong&gt;atendida en una cola&lt;/strong&gt; la cual puede crecer exponencialmente si el servidor no es capaz de ir liberando la cola con la misma velocidad con la que ingresan solicitudes a esta cola.&lt;br /&gt;
Hay &lt;strong&gt;solicitudes&lt;/strong&gt; que son más fáciles de resolver para el servidor que otras, esto normalmente depende de la cantidad de &lt;strong&gt;archivos y handlers&lt;/strong&gt; que deba abrir para esa solicitud y si lo que requiere esta o no en un &lt;strong&gt;cache&lt;/strong&gt;. Dentro de los handlers están también las &lt;strong&gt;conexiones a bases de datos y/u otros sistemas&lt;/strong&gt;, como &lt;strong&gt;sockets&lt;/strong&gt; o solicitudes a servidores &lt;strong&gt;externos&lt;/strong&gt;.&lt;br /&gt;
Dependiendo de la cantidad y tipo de recursos que se están accediendo además de recursos toma tiempo, lo que hace que las solicitudes en cola tengan que esperar más acumulándose aun más el tiempo que estas y las que siguen deberán esperar.&lt;br /&gt;
Además de esto, existen filtros o procesos previos o posteriores a cada solicitud que agregan tiempo y consumo de recursos a cada uno de las solicitudes.&lt;br /&gt;
Por el &lt;strong&gt;costo&lt;/strong&gt; que tiene crear e &lt;strong&gt;inicializar&lt;/strong&gt; cada &lt;strong&gt;recurso nuevo&lt;/strong&gt;, los servidores además suelen crear &lt;strong&gt;pilas de recursos&lt;/strong&gt;, como pilas de conexiones a bases de datos o pilas de procesos pre-inicializados para atender a las solicitudes.&lt;br /&gt;
Cada uno de estos procesos tomará la cantidad de memoria que requiera para efectuar lo que la solicitud requiere y si este proceso se recicla es probable que mantenga su uso de memoria aun cuando no todos los procesos que atienda requieran esa misma cantidad de memoria, esto conlleva que cuando se sirven diferentes tipos de solicitudes mezcladas la cantidad de memoria que utilicen los procesos será el del proceso que más requiera memoria, lo cual limita aun más la capacidad de procesar solicitudes más sencillas en sacrificio de poder atender las solicitudes más complejas.&lt;br /&gt;
De aquí que cuando se &lt;strong&gt;separan los tipos de solicitudes en servidores diferentes queda cada servidor optimizado para ese tipo de solicitudes&lt;/strong&gt;, permitiéndole trabajar de &lt;strong&gt;manera más eficiente&lt;/strong&gt; y darle un uso mucho más eficaz a los recursos del servidor.  &lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/memoria_servidor_compartido.png&quot; alt=&quot;representacion de uso de memoria de servidor web, cdn funcionamiento&quot; width=&quot;560&quot; height=&quot;464&quot; /&gt;&lt;/div&gt;

&lt;h3 id=&quot;funcionamiento-del-esquema-de-cdn&quot;&gt;Funcionamiento del esquema de CDN&lt;/h3&gt;
&lt;p&gt;Para trabajar con un &lt;strong&gt;CDN&lt;/strong&gt; en el concepto básico lo que se requiere es que las referencias hacia los archivos estáticos que se encuentran en la aplicación web estén apuntando hacia el &lt;strong&gt;CDN&lt;/strong&gt; y que este contenga estos archivos.&lt;br /&gt;
Un &lt;strong&gt;CDN&lt;/strong&gt; normalmente recibe los archivos y los replica dentro de los diferentes servidores y se balancea la carga entre los diferentes servidores.&lt;br /&gt;
Existen algunos servicios de &lt;strong&gt;CDN&lt;/strong&gt; que simplifican un poco más el concepto extrayendo ellos los archivos del servidor dinámico ya sea la primera vez que se intenta accesar al archivo o posterior a que se vence el archivo.  &lt;/p&gt;

&lt;h3 id=&quot;conclusiones&quot;&gt;Conclusiones&lt;/h3&gt;
&lt;p&gt;Los &lt;strong&gt;CDN’s&lt;/strong&gt; nos ayudan a &lt;strong&gt;disminuir la carga de los servidores de aplicaciones&lt;/strong&gt; dándoles la oportunidad de trabajar más &lt;strong&gt;eficientemente&lt;/strong&gt; y para lo que fueron destinados, permite además que los exploradores de los &lt;strong&gt;usuarios obtenga los archivos estáticos de una manera más eficiente&lt;/strong&gt;.&lt;br /&gt;
Debido a que los archivos estáticos son por mucho la mayoría de los archivos que suelen servirse en cada aplicación web, el uso de &lt;strong&gt;CDN’s&lt;/strong&gt; suelen dar un &lt;strong&gt;incremento en la eficiencia bastante dramático&lt;/strong&gt;. &lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Como configurar OpenDNS, que hago cuando tengo problemas de DNS</title>
          <link>http://www.profesional.co.cr/es/2009/12/01/como-configurar-opendns-que-hago-cuando-tengo-problemas-dns-1466/</link>
          <pubDate>Tue, 01 Dec 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/12/01/como-configurar-opendns-que-hago-cuando-tengo-problemas-dns-1466/</guid>
          <description>&lt;p&gt;Si sueles tener problemas de &lt;strong&gt;DNS&lt;/strong&gt;, si vives en &lt;strong&gt;Costa Rica&lt;/strong&gt; probablemente de vez en cuando los tienes con el &lt;strong&gt;ICE, RACSA o CableModem&lt;/strong&gt;, o simplemente quieres tener más &lt;strong&gt;control para restringir accesso a páginas o sitios con contenidos obsenos&lt;/strong&gt; o quieres estar un poco más seguro en contra del &lt;strong&gt;phishing&lt;/strong&gt;, entonces &lt;strong&gt;OpenDNS&lt;/strong&gt; es una buena opcción.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/images/opendns.gif&quot; alt=&quot;OpenDNS como configurarlo&quot; width=&quot;93&quot; height=&quot;37&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;qu-es-un-dns&quot;&gt;¿Qué es un DNS?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;DNS es la nomenclatura de Domain Name Server&lt;/strong&gt;, cuando usas internet siempre tienes por lo menos 1 DNS asignado, este es un servidor que se encarga de traducir cada &lt;strong&gt;dominio&lt;/strong&gt; (por ejemplo nestor.profesional.co.cr) por una &lt;strong&gt;dirección IP&lt;/strong&gt; (por ejemplo 67.23.36.248) que es la dirección de como llegar al servidor de internet que buscas.&lt;br /&gt;
Ocasionalmente el DNS de tu proveedor de internet puede fallar y como resultado aunque tengas conexión a internet no puedes ingresar a ninguna página debido a que tu computadora no sabe como traducir el dominio a una dirección IP.&lt;/p&gt;

&lt;h2 id=&quot;qu-es-opendns&quot;&gt;¿Qué es OpenDNS?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;OpenDNS&lt;/strong&gt; es una serie de &lt;strong&gt;servidores DNS&lt;/strong&gt; optimizados, balanceados y distribuidos de muy alta confiabilidad y con la opción de ser utilizados de manera gratuita para reemplazar los DNS’s que te asigna tu proveedor de internet.&lt;br /&gt;
Además de ser más confiables y con mejor velocidad de respuesta, tienen opciones adicionales, puedes simplemente configurarlos y listo, pero también puedes crear una cuenta con ellos y te daría la oportunidad de configurar opciones o pagar y tener aun más opciones.&lt;br /&gt;
Dentro de las opciones que te ofrecen esta la de &lt;strong&gt;filtrado de dominios&lt;/strong&gt; y &lt;strong&gt;revisión del historial de páginas visitadas&lt;/strong&gt;. La opción de filtrado te permite indicar si debe negarse el acceso a páginas pornograficas y sitios de &lt;strong&gt;phishing&lt;/strong&gt;, o si además filtrar sitios de cracks y hacks y cosas así, o además filtrar todo acceso a redes sociales y sitios de este tipo o simplemente no filtrar nada, esto puede ayudarte a filtrar y asegurar más las computadoras de tu casa u oficina. Las opciones pagadas te dan más opciones muy utiles como para oficinas.  &lt;/p&gt;

&lt;h2 id=&quot;como-configuro-opendns&quot;&gt;¿Como configuro OpenDNS?&lt;/h2&gt;
&lt;p&gt;La mejor opción sería configurarlo en tu router para que con solo configurarlo una vez todas las computadoras de la casa automaticamente queden configuradas, esto es un poco variable dependiendo del router y tienes que tener la clave, si usas el ICE o Racsa es probable que no tengas acceso al modem de internet que normalmente estaria en http://192.168.0.1, si tienes un router inhalambrico, tienes la clave de este y sabes la dirección IP entonces puedes ingresar a la parte administrativa del router y configurar los &lt;strong&gt;Static DNS&lt;/strong&gt; con las direcciónes que ya te daré.  &lt;/p&gt;

&lt;p&gt;Si todo esto que te he dicho de routers suena muy complicado o no tienes acceso, puedes configurarlo directamente en tu computadora:
### Windows XP:
- Ir a “Inicio” -&amp;gt; “Panel de control” -&amp;gt; “Conexiones de Red” o “Red”
- Ahi verás al menos una conexión, ya sea que uses inhalambrica o por cable de red, elije la que usas y abrela.
- Aparece una ventana con información, haz click en el boton de “Propiedades”
- Busca la opción “Protocolo de Internet (TCP/IPv4)” y seleccionalo.
- Luego haz click en el boton “Propiedades”.
- En la parte de abajo selecciona la opción que dice algo como “Utilizar las siguientes direcciones para el servidor DNS” y abajo de este escribir las siguientes 2 direcciones IP:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;208.67.222.222 
208.67.220.220&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Luego dale &lt;code&gt;OK&lt;/code&gt; y listo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;windows-vistawindows-7&quot;&gt;Windows Vista/Windows 7:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Ir a “Inicio” -&amp;gt; “Panel de control” -&amp;gt; “Redes e Internet” -&amp;gt; “Ver estado de red y tareas”&lt;/li&gt;
  &lt;li&gt;Ahi verás al menos una conexión de red, ya sea que uses inhalambrica o por cable de red, elije la que usas y dale “Ver estado”&lt;/li&gt;
  &lt;li&gt;Aparece una ventana con información, haz click en el boton de “Propiedades”&lt;/li&gt;
  &lt;li&gt;Busca la opción “Protocolo de Internet (TCP/IPv4)” y seleccionalo.&lt;/li&gt;
  &lt;li&gt;Luego haz click en el boton “Propiedades”.&lt;/li&gt;
  &lt;li&gt;En la parte de abajo selecciona la opción que dice algo como “Utilizar las siguientes direcciones para el servidor DNS” y abajo de este escribir las siguientes 2 direcciones IP: &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;208.67.222.222 
208.67.220.220&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Luego dale &lt;code&gt;OK&lt;/code&gt; y listo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero esto pueda ser de ayuda a más de una persona.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;dnss-de-opendns&quot;&gt;DNS’s de OpenDNS:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;208.67.222.222
208.67.220.220
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://www.opendns.com&quot;&gt;Página de OpenDNS&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.opendns.com/support/category/3&quot;&gt;Más información de como configurar OpenDNS en diferentes plataformas y sistemas&lt;/a&gt;&lt;/p&gt;

</description>
        </item>
      
    
      
    
      
        <item>
          <title>Credomatic, BAC San José o GE Money en Costa Rica y su Servicio al Cliente</title>
          <link>http://www.profesional.co.cr/es/2009/08/17/credomatic-bac-san-jos-o-ge-money-costa-rica-y-su-servicio-al-cliente-1462/</link>
          <pubDate>Mon, 17 Aug 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/08/17/credomatic-bac-san-jos-o-ge-money-costa-rica-y-su-servicio-al-cliente-1462/</guid>
          <description>&lt;p&gt;&lt;img width=&quot;241&quot; height=&quot;33&quot; border=&quot;0&quot; align=&quot;left&quot; src=&quot;https://www.bac.net/bacsanjose/img/fhcrcbac.gif&quot; alt=&quot;Credomatic, BAC San José, GE Money Costa Rica Servicio al Cliente&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Si usted es o ha sido cliente de &lt;strong&gt;Credomatic, el BAC San José o GE Money&lt;/strong&gt; sabrá que a pesar de ser probalemente el mejor y más grande &lt;strong&gt;banco privado&lt;/strong&gt; en Costa Rica y con una gran presencia en Centroamerica, eso no ha evitado muchas veces que nos brinden un mal servicio. Quisiera ser lo más objetivo posible al intentar hacer un analisis de esta institución financiera, así que iniciaré nombrando lo que puedo y conozco positivo.&lt;/p&gt;

&lt;h3 id=&quot;ventajas&quot;&gt;Ventajas:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;El más grande banco privado&lt;/strong&gt;, con esto me refiero a la cantidad de sucursales, cajeros y capacidad de atender a la gran cantidad de clientes que poseen, es muy facil encontrar una sucursal o un cajero automático del BAC San José o Credomatic muy cerca de donde sea que vivamos o trabajemos, esto no quiere decir que le gane a la cantidad de sucursales de los bancos estatales.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Kioscos electronicos&lt;/strong&gt; en muchas de las sucursales, estos dispositivos muy parecidos a los cajeros automáticos dan la posibilidad de hacer una gran cantidad de tramites sin requerir internet o un empleado del banco, por alguna razón diría que son muy poco conocidos y utilizados por sus clientes, estos podrian salvarle de algunas filas y de perder el tiempo.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ventajas corporativas&lt;/strong&gt;, el enfoque que tienen los servicios corporativos es bastante apreciable, normalmente saben bien como ganarse la confianza de las empresas ofreciendo ventajas atractivas y hasta dispuestos a proveer beneficios extras personalizados para algunas empresas de gran tamaño.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Sistema en linea&lt;/strong&gt;, la sucursal electrónica, es a mi parecer la mejor de todos los bancos privados, probablemente superada solamente por el sistema en linea del Banco Nacional. Este sistema provee opciones para practicamente todo tipo de transferencias y consultas comunes, incluso las corporativas, además de una gran customización de seguridad y mancomunación para las empresas, pago de planillas y proveedores y etc.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fortaleza de los sistemas&lt;/strong&gt;, los sistemas de credomatic y el BAC San José estan muy bien planteados y seguros, además de que el acceso a datos sensibles esta muy bien protegido incluso de manera interna.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Presencia internacional&lt;/strong&gt;, la presencia de esta institución financiera en una gran parte de america, principalmente Centroamerica provee un gran beneficio para las empresas que tengan presencia o negocios internaciones.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Diferentes metodos de acceso a atención al cliente&lt;/strong&gt;, además de la atención teléfonica existen varias formas de acceso a información o de comunicarse con ellos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Productos especiales&lt;/strong&gt;, diferentes productos especiales como mensajes a su celular cuando ciertas transacciones se hacen, token de seguridad, taza cero, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;desventajas&quot;&gt;Desventajas:&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tiempo de respuesta en atención al cliente&lt;/strong&gt;, en mi experiencia el tiempo que suelo esperar en el teléfono a la hora de llamar a servicio al cliente es solamente peor en Aval/Banco Uno, a veces simplemente no entiendo como llega a pasar esto.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Burocracia&lt;/strong&gt;, cuando he requerido solucionar algun problema me he visto varias veces obligado a pasar de persona en persona o incluso exigir que la persona en el teléfono se encargue de hablar con aquel que realmente tiene la capacidad o permisos para resolver el problema causado por ellos.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Largas filas en plataforma&lt;/strong&gt;, a pesar de contar con sistemas electronicos de filas con prioridad basados en la condición del cliente y del tipo de trámite, a la hora de que cada cliente llega al escritorio de plataforma, me parece impresionante que cada trámite comun que atienden tengan que levantarse unas 5 veces mínimo de su asiento para ir a traer diferentes documentos, formularios o consultar con un supervisor u otro personal, es muy claro que este es un punto que no sería difícil de optimizar si mantuvieras más de las cosas que necesitan a la mano del agente o incluso mayor información o permisos, no se, buscar la manera de reducir la cantidad de veces que debe salir de su asiento y de paso la distancia que deben recorrer para ir por aquello.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Llamadas de mercadeo&lt;/strong&gt;, soy yo o realmente cansan estas llamadas de mercadeo de tarjetas incluyendo a numeros no ingresados nunca a los sistemas de ellos (lo cual me llega a deducir que es practicamente un hecho que compran información de clientes), acaso no entenderán cuando se les dice “no me llamen más” e insisten en hacerlo una y otra vez, no podriamos hacer una ley para regular esto como se hace en otros paises.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Si usted esta en el extrangero&lt;/strong&gt; y tiene cuentas con ellos, revise mil y una vez con ellos todo lo que necesita para accesar a su dinero desde afuera del país, no tienen idea del gasto en llamadas internacionales que incurrí aun después de firmar mil formularios para habilitación de los servicios internacionales, SINPE y otros y que estando afuera tuve que hacer mil llamadas por casí 2 semanas para poder tener los accesos que solicité antes de salir del país.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Desatención a pequeñas empresas o PyMes&lt;/strong&gt;, el trato que le dan a las Pymes me impresiona, debería tener un poco más de atención, ofrecer algo más, parece que el enfoque de ellos para tratarte bién es solamente empresas grandes o empresas viejas, pero si estas intentando empezar una pequeña empresa, no te van a ayudar mucho.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Políticas ridículas&lt;/strong&gt;, han sido muchas las veces que me topo con un “esa es nuestra política”, en cuanto a algunos productos como tarjetas, cuentas o la que más me acuerdo ahorita, la de procesamiento de tarjetas por internet donde piden un depósito de garantía de $50,000 (cincuenta mil dólares), si esto no es ridículo no se lo que es, esto se da porque por faltas de control en la seguridad de sus clientes les han metido varias estafas y ya fueron multados segun el agente que trabaja esta área, o sea, por errores en los procesos y chequeos del banco, nos ven feos a los empresarios, perdón, pero la forma seria incrementar su chequeo, requerimientos y poner límites, eso solucionaria el problema.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Suerte&lt;/strong&gt;, si, la suerte de toparse con algun intransigente empleado de esos que toda empresa tiene, varias veces he topado con esta suerte, la que nunca olvidaré la vez que una transferencia SINPE del mismo día falló y después de llamar a servicio al cliente me dijerón que ya era muy tarde para arreglarlo y que debia esperar a que se aplicará al siguiente día cobrandome eso sí, como si la hubieran hecho el mismo día, por lo cual pusé una queja, y al siguiente día la sorpresa de tener mi dinero congelado por haber puesto la queja y me pedian una carta para descongelarlo, a la fuerza tuvieron que descongelarlo de la misma manera que lo congelaron, o sea, sin cartas, lo que me enseño que de cuando en cuando con ellos se requiere retorcerles las b**** y forzarlos a hacer su trabajo.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Comisiones&lt;/strong&gt;, o sí, esas pequeñas letras en los contratos, más aquello que no estaba escrito en el contrato o que simplemente modificaron a voluntad sin previo aviso (como lo dice el contrato), como las comisiones por no utilizar la tarjeta un mínimo de veces por mes, o por hacer compras internacionales con las tarjetas internacionales (umm?). Perdón, eso no se lo dijo el agente?, bueno, así es.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En resumén, es una institución más a la que se le debe analizar antes de hacer negocios con ellos, para empresas probalemente tiene un gran puntaje a la hora de elegirla, para personas, en algunos casos será muy funcional, pero no en todos. Espero este pequeño análisis pueda servir de guía a algunas personas en cuanto a acudir a este banco.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Microsoft ya no puede vender Word en Estados Unidos</title>
          <link>http://www.profesional.co.cr/es/2009/08/13/microsoft-ya-no-puede-vender-word-estados-unidos-1461/</link>
          <pubDate>Wed, 12 Aug 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/08/13/microsoft-ya-no-puede-vender-word-estados-unidos-1461/</guid>
          <description>&lt;p&gt;Un juez de Texas dictaminó el martes que Microsoft no puede vender uno de sus productos emblemáticos, Word, en los Estados Unidos a causa de una infracción de patente.&lt;/p&gt;

&lt;p&gt;El Juez Leonard Davis, de los EE.UU. Tribunal de Distrito para el Distrito Este de Texas, ordenó un requerimiento judicial permanente que “Microsoft prohíbe la venta o importación en los Estados Unidos de los productos Microsoft Word que tienen la capacidad de apertura de archivos .XML, .DOCM .DOCX (archivos XML) que contiene código XML personalizado”, segun &lt;a href=&quot;http://www.i4i.com/collateral/05-26-09-Release-Jury_orders_Microsoft_to_pay_i4i.pdf&quot;&gt;un anuncio&lt;/a&gt; hecho por el demandante &lt;a href=&quot;http://www.i4i.com/&quot;&gt;i4i Inc&lt;/a&gt; basada en Toronto.&lt;/p&gt;

&lt;p&gt;XML es un lenguaje de marcas “que permite a los usuarios personalizar el formato subyacente de sus documentos de procesamiento de textos, por ejemplo, y hace legible a través de diferentes programas de procesamiento de textos. La capacidad de leer y escribir documentos XML es una característica integral de Microsoft Word.  &lt;br /&gt;
&lt;a href=&quot;http://c0178251.cdn.cloudfiles.rackspacecloud.com/archivos/20090811i4iinjunction.pdf&quot;&gt;Descargue el mandamiento judicial&lt;/a&gt; (PDF)&lt;/p&gt;

&lt;p&gt;En su denuncia &lt;a href=&quot;http://c0178251.cdn.cloudfiles.rackspacecloud.com/archivos/20090811i4iinjunction.pdf&quot;&gt;(ver denuncia PDF)&lt;/a&gt;, i4i alega que Microsoft violó voluntariamente sus patentes de 1998 (N º 5.787.449) en un método para leer XML. La empresa, cuyo sitio web se anuncia que los usuarios pueden “Crear y editar contenido XML en Microsoft Word,” ayuda a los clientes a trabajar con XML.&lt;/p&gt;

&lt;p&gt;i4i presentó la demanda en marzo de 2007, buscando una orden judicial y el pago de los daños y perjuicios. El Distrito Este de Texas es conocido por ser un refugio para los litigios sobre patentes.&lt;/p&gt;

&lt;p&gt;El mandamiento judicial &lt;a href=&quot;http://c0178251.cdn.cloudfiles.rackspacecloud.com/archivos/20090811i4icomplaint.pdf&quot;&gt;(ver documento PDF)&lt;/a&gt;, que se hace efectiva en 60 días, prohíbe a Microsoft la futurá venta de los productos Word a los que intencionalmente utilicen la tecnología patentada. También exhorta a Microsoft de efectuar pruebas, demostraciones, la comercialización o la oferta de soporte para los productos futuros.&lt;/p&gt;

&lt;p&gt;Davis también ordenó a Microsoft pagar i4i más de $ 290 millones en daños.&lt;/p&gt;

&lt;p&gt;“Estamos decepcionados por la decisión del tribunal,” dijo Kevin Kutz portavoz de Microsoft en una declaración. “Creemos que las pruebas demuestran claramente que no infringimos la patente de i4i y que esta no es válida. Vamos a apelar el veredicto.”&lt;/p&gt;

&lt;p&gt;Ahora quedará en ver lo que Microsoft pueda lograr en los tribunales en las audiencias y juicios a proseguir.&lt;/p&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Identidad</title>
          <link>http://www.profesional.co.cr/es/2009/08/03/identidad-1155/</link>
          <pubDate>Mon, 03 Aug 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/08/03/identidad-1155/</guid>
          <description>&lt;p&gt;Hoy despierto, abro los ojos, un día más, un dia después de acumular piedras a mis espaldas, llagas en mis hombros, dolor en mis piernas, el corazón mallugado y en la boca el sin sabor.&lt;/p&gt;

&lt;p&gt;La inercia me lleva y la manipulación me devuelve. &lt;br /&gt;
Una pregunta cuestionó mi existencia, una pregunta le quita la tinta a lo que veia, se notan ahora borrosos los colores, percibo ahora un poco los aromas, y es precisamente para sentir la pestilencia, para ver los contrastes y sentir el dolor. &lt;br /&gt;
Una pregunta me presiona a redefinir lo que sé. &lt;br /&gt;
Ayer la pregunta fue quien soy?, pero es la respuesta lo que me asusta, por más intento definirme, desconozco quien soy.  &lt;br /&gt;
Al ver al espejo descubro los hilos, veo a aquellos que manipularon mi vida, veo los agujeros que atraviesan mis articulaciones, dejando llagas y dolor. &lt;br /&gt;
Es el momento en que corto los hilos, pongo alcohol a las llagas, suelto la piedras y preparo la mochila.  &lt;br /&gt;
Ahora es cuando suelto la carga e inicio la busqueda, la más antigua, la legendaria; me busco a mí, al perdido, al extraviado, al que naufraga y ruega por ser encontrado.  &lt;br /&gt;
Quien soy? es mas que un puñado de letras en un documento, es mas que los garabatos de una firma en la esquina de algunos papeles, es más que un arbol genealogico torcido, es más que una agrupación celular formando un organismo, más aun, es más de lo que los demás ven y juzgan.  &lt;br /&gt;
Es lo que encuentro cuando vuelvo atras los ojos y veo adentro del alma, la cual ahora encuentro vacia.  &lt;br /&gt;
Mis gustos no eran mios, mis mañas no las aprendí yo, mis palabras eran prestadas, lo unico que encuentro propio son mis miedos, y es ahí donde la busqueda empieza.  &lt;br /&gt;
Zarpo del puerto del miedo, al oceano de mis temores, arpón en mano a conquistar las bestias que dejé libres hace mucho, con la fé de encontrar ahi una pista que me conduzca un pasó más. &lt;br /&gt;
Naufrago ahora mar abierto, para encontrar lo perdido debo perderme, busco ahora encontrame conmigo.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>GMail ya no es Beta</title>
          <link>http://www.profesional.co.cr/es/2009/07/07/gmail-ya-no-es-beta-494/</link>
          <pubDate>Tue, 07 Jul 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/07/07/gmail-ya-no-es-beta-494/</guid>
          <description>&lt;p&gt;Google GMail ha sido identificada como Beta desde su lanzamiento hace ya casi una decada, las razones de mantenerlo como Beta no son del todo conocidas, podria ser para no asumir una responsabilidad en caso de algun fallo, no crear falsas espectativas, por mercadeo o quien sabe, pero el hecho es que a partir de hoy ya no aparece la palabra Beta en el logo de GMail.&lt;/p&gt;

&lt;div class=&quot;article-main-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.comhttp://mail.google.com/mail/images/2/5/logo1.png&quot; width=&quot;143&quot; height=&quot;59&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Definitivamente con el tiempo este se ha convertido en un gran producto, me atrevería a decir incluso que es el web mail mas utilizado, además de gratuito y que además se ofrece como un servicio coorporativo, puede ser usado simplemente como un correo en el dominio de @gmail.com o en un dominio propietario. Es parte de una gran gama de servicios denominados google apps. &lt;br /&gt;
Es sin duda un servicio estable y confiable.
Habrá que ver que sorpresas nos tienen los muchachos de google además de solo remover la palabra Beta.&lt;/p&gt;

</description>
        </item>
      
    
      
        <item>
          <title>Reflexion de un padre</title>
          <link>http://www.profesional.co.cr/es/2009/06/22/reflexion-un-padre-21/</link>
          <pubDate>Mon, 22 Jun 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/06/22/reflexion-un-padre-21/</guid>
          <description>&lt;p&gt;Ayer festejé algo, algo que ocurrió, algo que soy, algo que siempre seré sin importar lo que pase.&lt;/p&gt;

&lt;p&gt;Pocas cosas en la vida son tan constantes como esta. &lt;br /&gt;
En la vida uno va y viene, uno cambia y vuelve, se modifica y evoluciona, uno aprende y olvida; pero tal vez esta es la unica o una de las pocas cosas que siempre seré. &lt;br /&gt;
Es algo en lo que intento crecer cada día y ser mejor, pero pase lo que pase siempre seré el padre de mis hijas, siempre será mía parte de esa responsabilidad de enseñarles a vivir en este mundo, de darles el ejemplo del que aprendan a amar, del que aprendan los valores. &lt;br /&gt;
No se trata de decirles, es cuestión de demostrarles que se puede vivir con integridad, que la vida no es fácil, pero si hermosa si aprendes a exprimirle el sabor.&lt;/p&gt;

&lt;p&gt;Escucharlas reir, sentirlas acurrucarase, un abrazo o una mirada, ellas definitivamente saben como hacerme feliz.&lt;/p&gt;

&lt;p&gt;Todo lo que me enseñan cada momento que estoy con ellas es de las cosas que me hacen sentir y vivir.&lt;/p&gt;

&lt;p&gt;Que sensación más hermosa es ser padre, tal vez, solo superado por la sensación de ser madre, un milagro reservado solo para ellas.&lt;/p&gt;

&lt;p&gt;Le doy gracias a Dios por los regalos que me dió, Barbara y Rebecca, las amo con mi vida.&lt;/p&gt;

</description>
        </item>
      
    
      
    
      
    
      
    
      
        <item>
          <title>Google sincroniza contactos y calendario con su iPhone/iPod Touch</title>
          <link>http://www.profesional.co.cr/es/2009/02/26/google-sincroniza-contactos-y-calendario-su-iphoneipod-touch-11/</link>
          <pubDate>Thu, 26 Feb 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/02/26/google-sincroniza-contactos-y-calendario-su-iphoneipod-touch-11/</guid>
          <description>&lt;p&gt;Google ha creado una interfaz de exchange para habilitar la sincronización entre sus contactos de Gmail y calendarios con su iPhone/iPod Touch. Enterese aquí: &lt;a href=&quot;http://www.google.com/mobile/apple/sync.html&quot;&gt;Google Sync&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;main-article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/sync-48x48.gif&quot; alt=&quot;Google Sync Calendar Contacts with iPhone/iPod Touch&quot; width=&quot;48&quot; height=&quot;48&quot; /&gt;&lt;/div&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/mobile_138740f_en.gif&quot; alt=&quot;Google Sync Calendar Contacts with iPhone/iPod Touch Warning erase data&quot; width=&quot;192&quot; height=&quot;282&quot; /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Advertencia:&lt;/strong&gt; En su primera sincronización con su iPhone/iPod Touch la información va a ser borrada, así que asegurese de respaldar la información en el Outlook o alguna aplicación similar.&lt;/p&gt;

&lt;p&gt;Esto brinda la posibilidad de sincronizar sus contactos y calendario sin tener que conectar su iPhone/iPod Touch a la computadora y si la necesidad de aplicaciones adicionales. &lt;br /&gt;
En mi caso, he estado usando el NemusSync (una applicación del jailbreak para sincronizar el calendario con el iPhone/iPod Touch) y el iTunes para sincronizar los contactos con Gmail, pero ahora esto abre una nueva, más confiable y sencilla forma de sincronizar. &lt;br /&gt;
También hay que tomar en cuenta que la configuración de esta interfaz no sincroniza el correo (para esto siga utilizando como lo ha hecho antes, por medio de la configuración normal de Gmail).   &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Recuerde respaldar su información.&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/mobile_138740d_en.gif&quot; alt=&quot;Google Sync Calendar Contacts with iPhone/iPod Touch&quot; width=&quot;192&quot; height=&quot;282&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/mobile_138740d_en.gif&quot; alt=&quot;Google Sync Calendar Contacts with iPhone/iPod Touch&quot; width=&quot;192&quot; height=&quot;282&quot; /&gt;&lt;/div&gt;

</description>
        </item>
      
    
      
        <item>
          <title>1825 Razones para sonreir y mas</title>
          <link>http://www.profesional.co.cr/es/2009/02/24/1825-razones-para-sonreir-y-mas-9/</link>
          <pubDate>Tue, 24 Feb 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/02/24/1825-razones-para-sonreir-y-mas-9/</guid>
          <description>&lt;p&gt;Hoy son 1825 días desde tu nacimiento, 1825 días de felicidad, 1825 días multiplicados por muchas razones para disfrutar cada día.&lt;/p&gt;

&lt;p&gt;No es hoy que recuerdo, es cada día el que siento, cada día que deseo estar a tu lado, y cada día que extraño cuando no estoy.&lt;/p&gt;
&lt;p&gt;Verte me hace sonreir, me hace quererte y amarte, abrazarte me da vida y despedirme me destroza.&lt;/p&gt;
&lt;p&gt;Quisiera acurrucarte cada noche para dormir, sentir tu calor y saber que duermes profundamente, que duermes tranquila sabiendo que estoy ahi.&lt;/p&gt;
&lt;p&gt;Darte los buenos días y la bienvenida a cada nuevo día quisiera, estar cuando caes para alentarte a levantarte, para decirte que cada problema no es más que aquello que te prepara para disfrutar los momentos que vienen, que tendrás hermosos momentos cada día.&lt;/p&gt;
&lt;p&gt;Son 5 años hace que Dios me enseño por segunda vez el milagro de la vida, 5 años hace que me premio con dejarme verte y tenerme en mis brazos, que entraste en mi vida.&lt;/p&gt;
&lt;p&gt;Dios me dio un responsabilidad, enseñarte lo que he aprendido en mi vida, para que tengas la oportunidad de disfrutar la tuya, enseñarte a vivir, a disfrutrar, a compartir, a dar, a contagiar al mundo de vida, a enseñar a los que esten a tu lado que la vida es hermosa, a dejar tu tambien tu legado en los que esten junto a ti, como ya lo haces conmigo.&lt;/p&gt;
&lt;p&gt;Hoy te llamé para desearte un muy feliz cumpleaños y darte mi bendición.&lt;/p&gt;
&lt;p&gt;Te amo con mi vida hija mia, tu tienes una parte de mi corazón contigo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Feliz cumpleaños Becci&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
      
    
      
    
      
        <item>
          <title>Como usar el iPod Touch como un teléfono VoIP con Skype, gTalk o live</title>
          <link>http://www.profesional.co.cr/es/2009/02/13/como-usar-ipod-touch-como-un-tel-fono-voip-skype-gtalk-o-live-6/</link>
          <pubDate>Fri, 13 Feb 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/02/13/como-usar-ipod-touch-como-un-tel-fono-voip-skype-gtalk-o-live-6/</guid>
          <description>&lt;p&gt;Cuando compré mi iPod Touch tenia la idea de usarlo con mi cuenta de Skype para llamar a Costa Rica sin tener que estar en mi laptop, así que compré un microfono para el iPod para hacerlo.&lt;/p&gt;

&lt;p&gt;El problema en ese momento fue que el microfono fue creado para el iPod Video o clasico, pero no trabajaba con el iPod Touch y para hacerlo funcionar requeria hacerle un trabajo tecnico. Las personas que lo habian hecho mostraban videos en YouTube hacerca de como desarmar el microfono y alterarlo para hacerlo funcionar con el iPod Touch además de como hacerlo trabjar con una de las aplicaciones del Jailbreak, pero en ese momento no estaba pensando hacer esto.&lt;/p&gt;

&lt;p&gt;La buena noticia es que después de las ultimas actualizaciones que Apple ha hecho al iPod Touch ya no se requiere alterar el microfono ni usar el Jailbreak para lograr usarlo como un teléfono VoIP.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/small_e3.jpg&quot; alt=&quot;Macally iVoiceIII Microphone for iPod Touch&quot; width=&quot;90&quot; height=&quot;90&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ahora, todo lo que necesita es un microfono que cuesta unos $30 dolares en internet &lt;strong&gt;(Macally iVoiceIII Microphone para el iPod)&lt;/strong&gt; y la applicación &lt;strong&gt;Nimbuzz&lt;/strong&gt;, la cual se puede obtener gratis en el app store.&lt;/p&gt;

&lt;p&gt;Una vez que tenga su microfono con usted y haya instalado la applicación puede configurar su cuenta de Skype, gTalk o Live (Microsoft Messenger), conectar su microfono y llamar a cualquier contacto de su lista (o telefonos si tiene Skype Credits) y listo!!… ah, y no olvide conectar sus audifonos si tiene un iPod Touch de primera generación como es mi caso.&lt;/p&gt;

&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/touch_IMG_00121_m.PNG&quot; alt=&quot;Nimbuzz VoIP from the iPod Touch&quot; width=&quot;160&quot; height=&quot;240&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/touch_IMG_00091_m.PNG&quot; alt=&quot;Nimbuzz iPod Touch calling options&quot; width=&quot;160&quot; height=&quot;240&quot; /&gt;&lt;/div&gt;
&lt;div class=&quot;article-image&quot;&gt;&lt;img src=&quot;http://3cca053a28a5db4d7e2d-9c64834929b7793a1eba90da107ff905.r73.cf1.rackcdn.com/sites/files/touch_IMG_00112_m.PNG&quot; alt=&quot;Nimbuzz iPod Touch VoIP phone during a call&quot; width=&quot;160&quot; height=&quot;240&quot; /&gt;&lt;/div&gt;
</description>
        </item>
      
    
      
        <item>
          <title>Mi nuevo blog</title>
          <link>http://www.profesional.co.cr/es/2009/02/12/mi-nuevo-blog-2/</link>
          <pubDate>Thu, 12 Feb 2009 00:00:00 -0500</pubDate>
          <author>Nestor Mata Cuhtbert &lt;nestor@profesional.co.cr&gt;</author>
          <guid>http://www.profesional.co.cr/es/2009/02/12/mi-nuevo-blog-2/</guid>
          <description>&lt;p&gt;Hoy estoy empezando mi nuevo blog.&lt;/p&gt;

&lt;p&gt;Aqui espero poner temas interesantes para todos.&lt;/p&gt;

&lt;p&gt;Nestor&lt;/p&gt;
</description>
        </item>
      
    
      
    

  </channel> 
</rss>
