<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://arquitectoit.com/atom.xml" rel="self" type="application/atom+xml" /><link href="https://arquitectoit.com/" rel="alternate" type="text/html" /><updated>2025-06-16T16:24:07+00:00</updated><id>https://arquitectoit.com/atom.xml</id><title type="html">Arquitecto IT</title><subtitle>Análisis de Tecnologías</subtitle><author><name>{&quot;name&quot;=&gt;nil, &quot;picture&quot;=&gt;nil, &quot;email&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;links&quot;=&gt;[{&quot;title&quot;=&gt;nil, &quot;url&quot;=&gt;nil, &quot;icon&quot;=&gt;nil}]}</name></author><entry><title type="html">Arquitectura Basada en Eventos (EDA)</title><link href="https://arquitectoit.com/eda/arquitectura-basada-en-eventos-eda/" rel="alternate" type="text/html" title="Arquitectura Basada en Eventos (EDA)" /><published>2024-07-22T00:00:00+00:00</published><updated>2024-07-22T00:00:00+00:00</updated><id>https://arquitectoit.com/eda/arquitectura-basada-en-eventos-eda</id><content type="html" xml:base="https://arquitectoit.com/eda/arquitectura-basada-en-eventos-eda/"><![CDATA[<h2 id="qué-es-una-arquitectura-basada-en-eventos-eda">¿Qué es una Arquitectura Basada en Eventos (EDA)?</h2>

<p>Una <strong>Arquitectura Basada en Eventos (EDA)</strong> o <strong>Event-Driven Architecture</strong> es un <strong>patrón de diseño de software</strong> en el cual se diseñan <em>servicios desacoplados que se relacionan mediante la publicación, consumo y enrutado de eventos</em>. También son conocidas como arquitectura orientada a eventos o arquitectura dirigida por eventos.</p>

<p>En una Arquitectura Basada en Eventos (EDA), <strong>un evento se define como un cambio de estado significativo en el sistema</strong> o en el entorno en el que nos encontremos. Será este cambio el que haga que los servicios reaccionen para dar una respuesta sobre dicho cambio.</p>

<p>Un <strong>cambio de estado</strong> puede ser cosas como <em>“Se ha añadido un producto al carrito de la compra”</em>, <em>“Se ha realizado una transferencia bancaria”</em>, <em>“El cliente ha cambiado sus datos de contacto”</em>,…</p>

<h2 id="modelos-tradicionales-versus-modelos-de-eventos">Modelos tradicionales versus Modelos de eventos</h2>

<p>Los modelos tradicionales de desarrollo son modelos síncronos, en estos modelos lo que encontramos es un <strong>servicio emisor</strong> que realiza una <strong>petición directa</strong> sobre un <strong>servicio receptor</strong> del cual espera una <strong>respuesta directa</strong>. Independientemente del tiempo que esta respuesta tarde.</p>

<p><img src="https://arquitectoit.com/images/eda/modelo-sincrono.png" alt="" /></p>

<p>Por otro lado, el modelo asíncrono que nos presenta una arquitectura basada en eventos versa en que el <strong>servicio emisor genera un evento</strong> el cual será <strong>atendido de forma desconectada</strong> o asíncrona por un <strong>servicio receptor.</strong> En este modelo el servicio emisor continua su ejecución independientemente de lo que tarde el servicio receptor en procesar la petición.</p>

<p><img src="https://arquitectoit.com/images/eda/modelo-asincrono.png" alt="" /></p>

<h2 id="funcionamiento-básico-de-una-arquitectura-basada-en-eventos-eda">Funcionamiento Básico de una Arquitectura Basada en Eventos (EDA)</h2>

<p>El funcionamiento básico de una Arquitectura Basada en Eventos (EDA) es que <strong>se produce o lanza un evento</strong> por parte de uno o mas <strong>Emisores (Publisher)</strong>. Esta emisión puede ser producida de forma manual, debido a una interacción de un usuario o bien puede ser emitido de forma automática cuando se produce una condición concreta en un sistema.</p>

<p><strong>El evento suele ser almacenado en un contenedor que se denomina Cola (Queue) o en Temas (Topics)</strong>. La cola va creciendo a medida que llegan los mensajes. En el caso de que la arquitectura basada en eventos ofrezca capacidades avanzadas como <em>filtrado, enrutado, agregación o correlación de eventos</em>, suele aparecer otra pieza que es el <strong>Bus de Mensajes (Message Broker)</strong>, el cual cuenta con las colas para almacenar los mensajes y con las capacidades mencionadas para su manipulación.</p>

<p>Una vez que tenemos un mensaje dentro de una cola o de un bus de mensajes tendremos <strong>los Consumidores (Consumers), que son aquellos servicios que responden o ejecutan acciones atendiendo al evento que se ha generado</strong> y la información que este proporciona.</p>

<p><img src="https://arquitectoit.com/images/eda/arquitectura-eda.png" alt="" /></p>

<h2 id="beneficios-y-desafíos-de-las-arquitecturas-basadas-en-eventos-eda">Beneficios y desafíos de las Arquitecturas Basadas en Eventos (EDA)</h2>

<p>La principal ventaja de las Arquitecturas Basadas en Eventos es su <strong>naturaleza asíncrona</strong>. Es decir, los componentes que la conforman no tienen por qué estar sincronizados en tiempo real y pueden funcionar de forma independiente. Este escenario nos permite una <strong>gran escalabilidad</strong> y <strong>crecimiento flexible</strong> de la arquitectura, <strong>pudiendo añadir más funcionalidades de forma sencilla</strong> o bien aumentando las capacidades de procesamiento de la arquitectura inicial.</p>

<p>Sin embargo, las Arquitecturas Basadas en Eventos (EDA) también presentan desafíos. Y es que <strong>los diseños, dado el modelo asíncrono pueden ser más complejos de implementar y de gestionar</strong>. Además en escenarios de error puede suponer un reto el encontrar los puntos de fallo si no se han tomado las medidas necesarias de control y trazabilidad dentro de la arquitectura.</p>

<h2 id="utilidad-de-la-arquitecturas-basadas-en-eventos-eda">Utilidad de la Arquitecturas Basadas en Eventos (EDA)</h2>

<p>Con todo y con esto, las Arquitecturas Basadas en Eventos (EDA) son una opción de diseño muy potente que n<strong>os permiten resolver múltiples escenarios</strong> entre los que encontramos entornos de <strong>alta carga y volúmenes dinámicos</strong> gracias a la escalabilidad de estos sistemas</p>

<p>Además, las Arquitecturas Basadas en Eventos (EDA) nos pueden ser muy útiles en situaciones que necesitemos realizar evoluciones de aplicaciones legacy o monolíticas a <a href="https://arquitectoit.com/microservicios/">entornos más modernos basados en microservicios</a>.</p>

<p>Si hablamos de funcionalidades que pueden ser implementados mediante Arquitecturas Basadas en Eventos (EDA) podemos implementar, estos son diferentes, y van desde <strong>gestión de procesos empresariales</strong> como pueden ser los casos de Alta de Clientes o la Adquisición de Productos, <strong>pasando por planos técnicos</strong> para escalar <a href="https://arquitectoit.com/microservicios/">microservicios</a> o aislar los datos de los dominios, o en áreas como la i<strong>ntegración de datos hacía sistemas externos</strong> como pueden ser las aplicaciones SaaS.</p>

<h2 id="tecnologías-detrás-de-las-arquitecturas-basadas-en-eventos-eda">Tecnologías detrás de las Arquitecturas Basadas en Eventos (EDA)</h2>

<p>Si hablamos del software o de las tecnologías que nos ayudan a implementar Arquitecturas Basadas en Eventos (EDA) encontramos algunas soluciones como:</p>

<ul>
  <li><strong>Apache Kafka</strong>: Es una plataforma distribuida de transmisión de eventos que permite publicar, almacenar y procesar flujos de registros en tiempo real. Kafka es conocido por su capacidad para manejar grandes cantidades de datos y su alta resiliencia. Podemos encontrar soluciones empresariales de Apache Kafka como <strong>Confluent</strong>, los cuales añaden muchas más capacidades que las básicas ofrecidas por Apache Kafka.</li>
  <li><strong>RabbitMQ</strong>: Es uno de los brokers de mensajes más antiguos y ampliamente utilizados. RabbitMQ soporta múltiples protocolos de mensajería como AMQP, MQTT y STOMP. El broker RabbitMQ es conocido por su fiabilidad y flexibilidad. Ofrece capacidades de persistencia de mensajes, confirmación de entrega y enrutado de mensajes. Además dispone de un sistema de plugins para poder extender sus capacidades.</li>
  <li><strong>Amazon SNS/SQS</strong>: Amazon Simple Notification Service (SNS) y Amazon Simple Queue Service (SQS) son servicios gestionados de mensajería en la nube que permiten la comunicación entre sistemas distribuidos. SNS se utiliza para la transmisión de mensajes a múltiples suscriptores, mientras que SQS se enfoca en la gestión de colas de mensajes.</li>
  <li><strong>IBM MQ:</strong> Conocido como IBM Message Queue es un middleware de mensajería que permite el intercambio de información entre aplicaciones asegurando que los mensajes se entreguen una vez y en el orden correcto.</li>
  <li><strong>PubSub+:</strong> PubSub+ es una plataforma avanzada de mensajería que permite el intercambio en tiempo real de eventos e información entre aplicaciones, dispositivos y usuarios desarrollada por <strong>Solace.</strong> Ofrece capacidades de filtrado de temas (topics), persistencia de mensajes y enrutado dinámico. PubSub+ ofrece capacidades de integración con diferentes sistemas SaaS.</li>
  <li><strong>Tibco Messaging:</strong> es una plataforma sofisticada diseñada para facilitar la comunicación fluida entre diversas aplicaciones y sistemas. Proporciona una infraestructura robusta y escalable que soporta una amplia gama de protocolos y patrones de mensajería. Tibco Messaging se integra fácilmente con otros productos de Tibco, mejorando sus capacidades y permitiendo una solución más completa para satisfacer las diversas necesidades.</li>
</ul>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="EDA" /><category term="eda" /><category term="evento" /><category term="message broker" /><category term="event broker" /><category term="apache kafka" /><category term="ibmmq" /><category term="rabbitmq" /><category term="tibco" /><category term="pubsub+" /><category term="solace" /><category term="confluent" /><summary type="html"><![CDATA[Una Arquitectura Basada en Eventos (EDA) es un patrón de diseño de software en el cual se diseñan servicios desacoplados que se relacionan mediante la publicación, consumo y enrutado de eventos.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/eventos.webp" /><media:content medium="image" url="https://arquitectoit.com/images/covers/eventos.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Invisible XML</title><link href="https://arquitectoit.com/xml/invisible-xml/" rel="alternate" type="text/html" title="Invisible XML" /><published>2023-02-12T00:00:00+00:00</published><updated>2023-02-12T00:00:00+00:00</updated><id>https://arquitectoit.com/xml/invisible-xml</id><content type="html" xml:base="https://arquitectoit.com/xml/invisible-xml/"><![CDATA[<p>Es curioso las cosas que se encuentra uno cuando va leyendo y saltando de noticia en noticia o cuando está preparando algún artículo para la web. Si me hubiesen preguntando hace unos días habría dicho que <a href="https://www.manualweb.net/historia-del-xml/">las especificaciones sobre XML</a> estaban paradas y que no había mucha actividad nueva sobre este lenguaje. Y en ese momento me topé con el concepto y especificación en definición <strong>Invisible XML</strong>. Algo que no podía dejar de mirar mi curiosidad.</p>

<p>Dentro de las <a href="https://www.w3.org/community/">comunidades W3C</a>, un modelo algo más abierto que el encorsetado sistema propio de las especificaciones de la W3C existe el <a href="https://www.w3.org/community/ixml/">Invisible Markup Community Group.</a></p>

<h2 id="qué-es-invisible-xml">¿Qué es Invisible XML?</h2>

<p>Por explicarlo de forma resumida, la idea detrás de <strong>Invisible XML</strong> es que los autores puedan escribir los documento en el formato que quieran, que no sientan ataduras o limitaciones para definir en <a href="https://www.manualweb.net/xml/">XML</a> sus documentos. Pero <strong>Invisible XML</strong> establecería un método por el cual tratar esos documentos como si realmente fuesen <a href="https://www.manualweb.net/xml/">XML</a> y de esta manera aprovecharnos de las <a href="https://manualweb.net/xml/introduccion-al-xml/#caracteristicas-xml">capacidades de intercambio, manipulación,… que da de facto el lenguaje XML</a>.</p>

<p>Solemos pensar que si no utilizamos un lenguaje como <a href="https://www.manualweb.net/xml/">XML</a> o JSON no estamos estructurando un documento. Y esto no es del todo cierto, ya que cuando generamos un documento, este <strong>implícitamente suele llevar una estructura</strong>.</p>

<p>Por ejemplo cuando escribimos una carta podemos tener el encabezado, el saludo, el contenido de la carta, el cierre o cómo despides la carta,… es decir implícitamente hay una estructura en el propio documento.</p>

<p>Otro ejemplo es una lista de la compra o de tareas pendiente. En este caso se puede diferenciar en que tenemos una parte en la que indicamos si la tareas está hecha o en que estado se encuentra, la tarea en sí y la fecha en la que queremos hacer la tarea. Nuevamente la lista de tareas tiene su estructura implícita.</p>

<p>Estas estructuras las entendemos todos cuando miramos ese tipo de documentos. Pero, qué pasa cuando se lo damos a una máquina, cómo podemos decirte la estructura implícita que lleva asociado el documento para que pueda ser tratado de una forma automática. Pues eso es la idea de <strong>Invisible XML</strong>, el poder describir esa estructura para que dado un documento se genere un documento <a href="https://www.manualweb.net/xml/">XML</a> que pueda ser tratado por la máquina. Lo que estamos haciendo con <strong>Invisible XML es crear una gramática que interprete el documento.</strong></p>

<p><strong>Invisible XML</strong> proporciona una <strong>sintaxis específica</strong> para la descripción declarativa, esta descripción declarativa será utilizada por el <strong>procesador Invisible XML</strong> para generar un documento XML del documento inicial.</p>

<p><a href="https://invisiblexml.org/1.0/">Invisible XML está liberado como especificación oficial</a> en junio 2022</p>

<h2 id="gramática-invisible-xml">Gramática Invisible XML</h2>

<p>La definición de la gramática de un fichero <strong>Invisible XML</strong> es sencilla y en ella se van especificando las diferentes reglas que queremos que se apliquen sobre el documento para poder interpretarlo.</p>

<p>Para explicarlo veamos cómo sería para aplicar <strong>Invisible XML</strong> sobre un documento de fechas que tengan un formato de estilo <code class="language-plaintext highlighter-rouge">11 febrero 23023</code>.</p>

<p>De esta manera definiremos una <em><strong>regla principal</strong></em> en la que identifiquemos la fecha</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fecha: dia, " ", mes, " ", annio.
</code></pre></div></div>

<p>Vemos que hemos creado tres <em><strong>entidades</strong></em> sobre las cuales iremos indicando nuevas reglas. Así un día podrá ser un número de uno o dos dígitos.</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dia: digito;
     digito, digito.
</code></pre></div></div>

<p>A su vez esas <em><strong>entidades</strong></em> podrán ser números del 0 al 9.</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-digito: "0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9".
</code></pre></div></div>

<p>Y así con cada una del resto de las <em><strong>entidades</strong></em> que hemos definido en la regla. Tampoco vamos a ir mucho más allá, pero nuestro fichero ixml quedaría de la siguiente forma:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>fecha: dia, " ", mes, " "?, annio?.
dia: digito;
     digito, digito.
-digito: "0"; "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; "9".
mes: "Enero"; "Febrero"; "Marzo"; "Abril"; "Mayo"; "Junio";
     "Julio"; "Agosto"; "Septiembre"; "Octubre"; "Noviembre"; "Diciembre".
annio: digito, digito, digito, digito;
       digito, digito.
</code></pre></div></div>

<p>Luego hay opciones para indicar si queremos que sean elementos o atributos (con @), o serializar elementos (con -) u elementos opcionales (con ?).</p>

<p>Si queréis aprender algo más sobre <strong>Invisible XML</strong> no dejéis de seguir <a href="https://homepages.cwi.nl/~steven/ixml/tutorial/tutorial.xhtml">este tutorial que enseña a crear una gramática paso a paso</a></p>

<p>Una vez que pasemos nuestro <strong>fichero iXML</strong> por el procesador veremos que la salida en <a href="https://www.manualweb.net/xml/">XML</a> quedará de la siguiente forma:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;fecha&gt;</span>
   <span class="nt">&lt;dia&gt;</span>11<span class="nt">&lt;/dia&gt;</span>
   <span class="nt">&lt;mes&gt;</span>Febrero<span class="nt">&lt;/mes&gt;</span>
   <span class="nt">&lt;annio&gt;</span>2023<span class="nt">&lt;/annio&gt;</span>
<span class="nt">&lt;/fecha&gt;</span>
</code></pre></div></div>

<h2 id="herramientas-para-invisible-xml">Herramientas para Invisible XML</h2>

<p>Si quieres empezar a trabajar con <strong>Invisible XML</strong> y hacer probaturas creando gramáticas hay un par de herramientas que te pueden ser de utilidad:</p>

<ul>
  <li><a href="https://homepages.cwi.nl/~steven/ixml/tutorial/run.html">WebService para poder probar iXML</a></li>
  <li><a href="https://johnlumley.github.io/jwiXML.xhtml">Navegador Javascript que interpreta iXML</a></li>
</ul>

<p>Habrá que ver cómo evoluciona y las utilidades que se le van dando a esta especificación de <strong>Invisible XML.</strong> De momento, espero que al menos haya llamado tu atención.</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="xml" /><category term="xml" /><category term="ixml" /><category term="w3c" /><category term="w3c community" /><summary type="html"><![CDATA[Invisible XML es un estándar que nos propone crear una gramática para poder interpretar cualquier tipo de documento y convertirlo a XML para poder ser procesado de forma automática.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/invisible.png" /><media:content medium="image" url="https://arquitectoit.com/images/covers/invisible.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">¿Qué es Jakarta EE?</title><link href="https://arquitectoit.com/java/que-es-jakarta-ee/" rel="alternate" type="text/html" title="¿Qué es Jakarta EE?" /><published>2021-03-02T00:00:00+00:00</published><updated>2021-03-02T00:00:00+00:00</updated><id>https://arquitectoit.com/java/que-es-jakarta-ee</id><content type="html" xml:base="https://arquitectoit.com/java/que-es-jakarta-ee/"><![CDATA[<p>En el artículo de hoy vamos a ver qué es Jakarta EE y qué relación tiene con las especificaciones del lenguaje <a href="http://wwww.manualweb.net/java">Java</a> como <strong>Java SE</strong> o <strong>Java EE</strong>.</p>

<h2 id="un-poco-de-historia-de-java-se-java-ee-y-java-me">Un poco de historia de Java SE, Java EE y Java ME</h2>

<p>Pero lo primero es echar la vista un poco atrás y revisar las diferentes tecnologías <a href="http://wwww.manualweb.net/java">Java</a> que han ido apareciendo a lo largo del tiempo vemos que la base se fundamenta en la especificación <strong>Java SE</strong> que es la edición estándar del lenguaje y que fue publicada en 1995.</p>

<p>Después aparecerían otras especificaciones como <strong>Java EE</strong> (o como se conocíoa entonces <strong>J2EE</strong>) en 2001 dónde se recogen tecnologías como los EJB, WebServices, JavaServer Pages, JavaServer Faces, JSON,… La especificación <strong>Java EE</strong> está definida para que poder realizar aplicaciones más complejas y dentro del ámbito empresarial.</p>

<p>Y más tarde tenemos, en 2006, el desarrollo de <strong>Java ME</strong> para dispositivos de menor capacidad como móviles, electrodomésticos,…</p>

<p>Todo este crecimiento de las <strong>tecnologías Java</strong> nace y crece bajo el amparo de <strong>SUN Microsystems</strong> quién guía su desarrollo hasta el año 2010 dónde es comprada por <strong>Oracle</strong>. Esto hace que todos los derechos de la marca <a href="http://wwww.manualweb.net/java">Java</a> pasen a ser propiedad de <strong>Oracle</strong>.</p>

<h2 id="qué-es-jakarta-ee">¿Qué es Jakarta EE?</h2>

<p>En 2017 <strong>Oracle</strong> decide que deja de controlar el desarrollo de <strong>Java EE</strong> y decide pasarlo a la comundidad para que sea guiado en un proceso más abierto y flexible por la <a href="https://www.eclipse.org/org/">Eclipse Foundation</a>. Manteniendo el modelo de <strong>JCP</strong> que se seguía en su desarrollo.</p>

<p>Si bien en este proceso de traspaso se decide no pasar la marca <strong>Java EE</strong> y la comunidad tiene que renombrar el proyecto a <strong>Jakarta EE</strong>. En este proceso de renombrado, otros elementos como el servidor <strong>Glassfish</strong> también se han visto afectados y ahora se llama <strong>Eclipse Glassfish</strong>.</p>

<p>El nombre <strong>Jakarta EE</strong> <a href="https://eclipse-foundation.blog/2018/02/26/and-the-name-is/">es elegido por la comunidad Eclipse en una votación entre <strong>Jakarta EE</strong> y <strong>Enterprise Profile</strong></a>.</p>

<p>Así que <strong>Jakarta EE</strong> pasa a ser la nueva plataforma opensource de <strong>Java EE</strong> gestionada por <a href="https://www.eclipse.org/org/">Eclipse Foundation</a>.</p>

<p>Además los paquetes deJakarta EE , que en <strong>Jakarta EE 8.0</strong> se mantuvieron iguales, han pasado a ser <code class="language-plaintext highlighter-rouge">jakarta.*</code> en <strong>Jakarta EE 9.0</strong>. Desapareciendo los <code class="language-plaintext highlighter-rouge">javax.*</code> De esta forma tenemos, entre muchos otros:</p>

<ul>
  <li>jakarta.activation</li>
  <li>jakarta.annotation</li>
  <li>jakarta.batch</li>
  <li>jakarta.decorator</li>
  <li>jakarta.ejb</li>
  <li>jakarta.faces</li>
  <li>jakarta.json</li>
  <li>jakarta.mail</li>
  <li>jakarta.security</li>
  <li>…</li>
</ul>

<h2 id="versión-de-jakarta-ee">Versión de Jakarta EE</h2>
<p>La versión actual de Jakarta es <strong>Jakarta EE 9.0</strong> que fue publicada en noviembre 2020. En esta versión el cambio principal ha sido el renombrado del namespace por el de <code class="language-plaintext highlighter-rouge">jakarta.*</code>.</p>

<p>Contamos con el servidor <strong>Glassfish 6</strong> para tener un soporte de <strong>Jakarta EE 9.0</strong>. Otros como <strong>Payara 5</strong> , <strong>Tomcat 10</strong>, <strong>Jetty 11</strong> y <strong>Wildfly 22</strong> dan soporte a <strong>Jakarta EE 8.0</strong>.</p>

<h2 id="futuro-de-jakarta-ee">Futuro de Jakarta EE</h2>
<p>Parece que de momento <strong>Jakarta EE</strong> y <strong>Java EE</strong> van a seguir vidas paralelas. Tendiendo <strong>Jakarta EE</strong> un proceso más flexible y gestionado por la comunidad. Parece que el único que queda es <strong>Jakarta EE</strong> dirigido por la comunidad. Pero veremos que nos depara el futuro de <strong>Jakarta EE</strong>.</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="java" /><category term="java ee" /><category term="jakarta ee" /><category term="java se" /><category term="java me" /><summary type="html"><![CDATA[Para saber qué es Jakarta EE tenemos que conocer un poco la historia de Java y de cómo Oracle a liberado a la comunidad opensource los desarrollos de Java EE.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/velero.png" /><media:content medium="image" url="https://arquitectoit.com/images/covers/velero.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Alternativas a Jenkins</title><link href="https://arquitectoit.com/devops/alternativas-a-jenkins/" rel="alternate" type="text/html" title="Alternativas a Jenkins" /><published>2021-01-30T00:00:00+00:00</published><updated>2021-01-30T00:00:00+00:00</updated><id>https://arquitectoit.com/devops/alternativas-a-jenkins</id><content type="html" xml:base="https://arquitectoit.com/devops/alternativas-a-jenkins/"><![CDATA[<p>Ahora que hemos visto <a href="https://arquitectoit.com/devops/que-es-jenkins/">¿qué es Jenkins?</a>, y como utilizarnos para crear el tan famoso “pipeline as code”, nos podemos preguntar ¿hay otras maneras de hacerlo? La respuesta es sí. Veamos las alternativas a <a href="https://arquitectoit.com/devops/que-es-jenkins/">Jenkins</a>.</p>

<h2 id="principales-competidores">Principales Competidores</h2>

<p>No creáis que <a href="https://arquitectoit.com/devops/que-es-jenkins/">Jenkins</a> es la única que sabe hacer este tipo de cosas. Existen en el mercado otras muy decentes, a la par que potentes, que le plantan cara:</p>

<h3 id="azure-devops">Azure DevOps</h3>
<p><img src="/images/devops/azuredevops-logo.png" alt="Azure DevOps" /></p>

<p><strong><em>Microsoft</em></strong> optó por ofrecer junto a su plataforma <strong>Azure DevOps</strong> toda una suite de herramientas para la Integración Continua y los Despliegues. Aquí el <strong><em>Multibranch</em></strong> se llamaría <strong><em>Build</em></strong> el cual genera un artefacto que desplegará la parte de <strong><em>Release</em></strong> (el equivalente cercano del <strong><em>Freestyle</em></strong>). La principal diferencia es que este está enfocado al <strong><em>Drag &amp; Drop</em></strong> de un conjunto de cajitas configurables que ofrecen una funcionalidad concreta. Como lo del <strong><em>pipeline as code</em></strong> se ha puesto muy de moda, los chicos de Micro están permitiendo guardar las configuraciones en formato yml, que aunque no es tan flexible como Jenkins permite que los almacenemos y metamos en un control de versiones. Una cosa que es inresante remarcar es que, si no dispones de infra, Azure te presta la suya para que tires millas a un coste razonable.</p>

<h3 id="bamboo">Bamboo</h3>
<p><img src="/images/devops/bamboo-logo.png" alt="Bamboo" /></p>

<p><strong>Bamboo</strong> sigue una técnica similar a la anterior. Puede ser una herramienta factible para aquellos que dispongan de otras de la suite de <strong><em>Atlassian</em></strong>, por las integraciones de caja que que ofrece. No obstante, Atlassian está moviéndose muy rápido a su formato SaaS y todo apunta a que terminará desconinuando esto para seguir mejorando la nueva <strong>Bitbucket Pipelines</strong>. Aunque aún es un poco joven y no dispone de demasiados plugins, todo apunta a que se covertira en una opción que ocupará buena tajada en el mercado.</p>

<h3 id="travis-ci">Travis CI</h3>
<p><img src="/images/devops/travis-ci-logo.jpg" alt="Travis CI" /></p>

<p><strong>Travis CI</strong> es otra opción más que interesante. Está a la cabeza de las soluciones SaaS y es largamente conocida por su amplia cartera de tecnologías soportadas. Una de las características que la hacen más potente es la <strong><em>matriz de test</em></strong> que permite ejecutarlos sobre nuestro software con diferentes configuraciones de versiones de sus paquetes, dependencias, etc. Y además soporta <a href="https://arquitectoit.com/docker/que-es-docker/">Docker</a> por lo que no tendrás problema para ejecutarlos en las mismas condiciones que tus entornos (y tienen MACs, una máquina complicadísima de simular o integrar en casa). Te interesará saber que hay planes gratuitos para proyectos OpenSource!!.</p>

<h2 id="conclusiones">Conclusiones</h2>

<p>En definitiva, <strong><a href="https://arquitectoit.com/devops/">DevOps</a></strong> como paradigma, cada vez dispone de más adeptos, y con ellos, la cantidad de herramientas de todos los sabores está creciendo en los últimos años. Si bien, <strong><em><a href="https://arquitectoit.com/devops/que-es-jenkins/">Jenkins</a></em></strong> está a la cabeza y sigue apretando fuerte gracias a los amigos de <strong>Cloudbees</strong>, desarrolladores principales de su fuente (porque <strong><em><a href="https://arquitectoit.com/devops/que-es-jenkins/">Jenkins</a></em></strong> es OpenSource). Ellos, además de comercializar una versión con soporte, ofrecen otra suerte de herramientas muy útiles para otros segmentos de <strong><em><a href="https://arquitectoit.com/devops/">DevOps</a></em></strong> un tanto más avanzados que el ya tradicional <strong><em>CI &amp; CD</em></strong>.
Os animáis a hacer algún pipeline? Pues tenemos en el horno un post que mete las manos en harina y os acompaña a tirar uno sencillito pero muy didáctico.</p>

<p>Espero que os haya gustado las alternativas a <a href="https://arquitectoit.com/devops/que-es-jenkins/">Jenkins</a>, ¿cuál es vuestra preferida?</p>]]></content><author><name>Gustavo Puig</name><email>g.puig.baeza@gmail.com</email></author><category term="devops" /><category term="despliegue continuo" /><category term="entrega continua" /><category term="integración continua" /><category term="jenkins" /><category term="pipeline as code" /><category term="pipeline" /><summary type="html"><![CDATA[¿Existen Alternativas a Jenkins? O es la única herramienta con la que podemos realizar nuestros pipelines DevOps. En este artículo revisamos algunas de esas alternativas.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/jenkins-head-logo.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/jenkins-head-logo.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">¿Qué es Jenkins?</title><link href="https://arquitectoit.com/devops/que-es-jenkins/" rel="alternate" type="text/html" title="¿Qué es Jenkins?" /><published>2021-01-29T00:00:00+00:00</published><updated>2021-01-29T00:00:00+00:00</updated><id>https://arquitectoit.com/devops/que-es-jenkins</id><content type="html" xml:base="https://arquitectoit.com/devops/que-es-jenkins/"><![CDATA[<p>Cualquier aventurero que se adentre en esto del <a href="https://arquitectoit.com/devops/">DevOps</a> se tendrá que enfrentar con <strong>Jenkins</strong> y preguntarse <strong>¿Qué es Jenkins?</strong>. Y es que <strong><em>Jenkins</em></strong> es la pieza angular de todo pipeline. De hecho, es aquel encargado de orquestar la ejecución de cualquier automatismo que la industria de nuestra empresa requiera.</p>

<p><strong><em>Jenkins</em></strong> entiende que un pipeline no es otra cosa que una distribución de pasos, de pequeñas tareas, las cuales concatenadas (o paralelizadas) consiguen aquello que se conoce como Integración o Despliegue (los conceptos de “continuo” que suelen acompañar a estos dos conceptos son un apostrofre que habla de una dinámica, de un paradigma de desarrollo que consiste en hacer estas dos cosas mucho y con cada cambio de los fuentes del sofware).</p>

<p>Para echaros un cable a aquellos que quieran atreverse a dar los primeros pasitos en este mundillo, he aquí una introducción en su herramienta más importante.</p>

<p><strong>Esperemos que os ayude =)</strong></p>

<h2 id="conceptos-básicos">Conceptos básicos</h2>
<p>Básicamente, en Jenkins trabajamos con:</p>

<h3 id="un-pipeline">Un Pipeline</h3>

<p><strong><em>First things firts</em></strong>. Qué es un pipeline?? Pues bien, tan simple como un flujo de tareas que se ordenan. Cuando planteemos un pipeline siempre debemos pensar en sus extremos:</p>

<ul>
  <li><strong>El final.</strong> La pregunta aquí es qué queremos conseguir y cuál es el elemento de salida que va a generar (un objeto, un cambio en un sistema, un evento…)</li>
  <li><strong>El pricipio.</strong> Cuál es el triger que iniciará su ejecución?</li>
</ul>

<p>Parece una tontería, pero este señor requiere tener la cabeza muy estructurada…</p>

<p>Aunque Jenkins sirve para automatizar cualquier cosa, su propósito original fue dedicarlo para temas de Integración Continua y Despliege. <strong>No es un martillo que sirva para todo pero no cerréis la mente a sus posibilidades</strong>. Con la experiencia sabréis discriminar qué situaciones Jenkins tiene la potencia suficiente como para cubrirlas y en cuáles se nos queda corto.</p>

<p>Mi mejor consejo cuando queráis hacer un pipeline es que apliquéis siempre el patrón de <strong>única responsabilidad</strong>. Más vale concatenar múltiples pipelines para alcanzar un objetivo mayor que construir flujos megalómanos que luego no hay Dios que entienda… ni mantenga…</p>

<h3 id="un-conjunto-de-pasos">Un Conjunto de pasos</h3>

<p>Más arriba, en la introducción, ya hablamos de los pasos. Digamos que un paso (o step) es la unidad más pequeña que tiene integridad propia en un pipeline. Esto quiere decir que se trata de cierta tarea, apenas unas pocas líneas de código ;), que tienen como propósito realizar una funcionalidad muy concreta. <strong><em>MUY CONCRETA</em></strong>.</p>

<p><strong>No os lieis con gigasnipsets</strong>. Recordad el principio de única responsabilidad. En mi opinión, más vale hacer un pipeline de pasos muy granulares que uno que solo disponga de 3 pasos muy extensos y ya. Ahora bien, <strong>cada paso debe añadir valor</strong>, tiene que ofrecer algo que le dé entidad y que no sea una símple operación de sistema operativo (lee o imprime algo). La funcionalidad debe ser acotada pero que represente algo para la semántica del pipeline que estamos construyendo.</p>

<p>Cada vez que hagáis uno, pensad que queréis venderlo.. de hecho, y aunque es un concepto complicado, se pueden agrupar estos pasos en librerías y construir así nuestro propio <strong>framework de pasos</strong>. Esto es un tema un tanto avanzamos que mejor requiere verlo en un post independiente.</p>

<h3 id="a-groovy">A Groovy</h3>

<p>Vale, ahora quiero implementar un paso. Con Jenkins no nos abandona el código.</p>

<p><strong>Groovy</strong> es el lenguaje principal de Jenkins. A aquellos que manejen <strong><em><a href="https://arquitectoit.com/java/">Java</a></em></strong>, no le verán ningún problema. De hecho se trata de un <strong><em><a href="https://arquitectoit.com/java/">Java</a></em></strong> “tuneado” y simplificado para hacer scripts de este tipo.</p>

<p><strong><em>Jenkins</em></strong> tiene sus complicaciones, pero el lenguaje base no es una de ellas.</p>

<p>Ahora bien, podéis hacer vuestros pasos en el idioma que queráis. Si instaláis las librerías de vuestro lenguaje favorito en la máquina donde corre <strong><em>Jenkins</em></strong>, podréis ejecutar cualquier tipo de script. De hecho <a href="https://arquitectoit.com/devops/">DevOps</a> pide a gritos ser poliglota dado que no todos los lenguajes están optimizados para lo mismo. Por ejemplo, <strong>Python</strong> dispone potentes librerías para hacer operaciones complejas, y <strong>Perl</strong> viene muy a mano para tratar expresiones regulares. Pero sin ir mas lejos, interactuar con el SO mediante un <strong>shell script</strong> es de lo más habitual que encontrarás.</p>

<h3 id="dos-maneras-de-describirlo">Dos maneras de describirlo</h3>

<p>Para describir la secuencia de pasos, es decir, para ordenar los steps que compondrán nuestro pipeline, existen dos maneras. Ambas igual de potentes:</p>

<ul>
  <li><strong>La freaky</strong>. Consiste en describir con Groovy “a pelo” todos los pasos, abriendo y cerrando llaves de Ifs que nos permitirán evaluar “si sucedió esto antes”, ahora “ejecuta este step”.</li>
  <li><strong>La moderna</strong>. Se trata de definir en un json llamadas a una serie de funciones (que son cada step) una detras de otra.</li>
</ul>

<p>Aquí otro consejo, que no os engañen, la primera manera es más molona, más compleja y menos “práctica”. En una empresa buscamos sobre todo legibilidad, mantenibilidad y sobre todo funcionalidad. <strong><em>La forma moderna</em></strong> es mucho mejor en las dos primeras e igual de potente en la tercera.</p>

<p>Hace tiempo ya los ingenieros de Jenkins se dieron cuenta de esto e inventaron un DSL (Domain-Specific Language), es decir, una manera compacta de especificar lo mismo pero dando técncias que orienten el lenguaje al propósito (o dominio) que debe describir.</p>

<h3 id="maestros-y-esclavos">Maestros y esclavos</h3>

<p>En todas las operaciones hay alquien que manda y otro (o algunos) que ejecutan.</p>

<p>Para <strong><em>Jenkins</em></strong>, el Maestro es el centro de operaciones, un punto logístico que se encarga de disparar los pipelines y centralizar la información del resultado de todos ellos. No solo eso, si no que es el punto con el que interactuaremos para configurar todas las capacidades que queramos habilitar en <strong><em>Jenkins</em></strong>.</p>

<p>Sin embargo, los esclavos son individuos que despiertan cuando el Maestro tiene una tarea que delegar. El Maestro recibe el evento de que debe ejecutarse un nuevo pipeline y ordena a los esclavos que ejecuten sus pasos.</p>

<p>Es interesante tener en la cabeza que un pipeline puede ejecutarse enteramente con único esclavo, pero los ingenieros solemos utilizar varios durante un mismo pipeline. Esto es porque creemos muy fuerte en el que “quien mucho abarca, poco aprieta” y un solo individuo es imposible que sea bueno en hacer de todo. Por esto preparamos disintas tipologías de esclavos que trabajan juntos para resolver un pipeline. De hecho tenemos esclavos para trabajar con <strong><em><a href="https://arquitectoit.com/java/">Java</a></em></strong>, otros con <strong><em>.Net</em></strong>, con <strong><em>Python</em></strong>… ahora, gracias a los contenedores Docker esto se ha hecho tan fácil…</p>

<h3 id="dos-tipos-distintos-de-pipelines">Dos tipos distintos de pipelines</h3>

<p>Bueno, no sólo hay dos.. hay unos cuantos, pero los más famosos son:</p>
<ul>
  <li>Multibranch pipeline</li>
  <li>Freestyle pipeline</li>
</ul>

<p>El primero, <strong><em>el Multibranch</em></strong>, tiene un propósito muy concreto. supervisará un repositorio de git y explorará todas las ramas buscando cambios. Este tipo se usa casi exclusivamente para la <strong><em>Integración Continua</em></strong>. Al final, lo que pretendemos con esto es ejecutar un pipeline (que mezcle con otras ramas, que compile, pase test, empaquete, versione, etc.) cada vez que se descubra un nuevo cambio en una de nuestras rámas del código.</p>

<p>Sin embargo, el segundo está pensado para ejecutarse o bien de forma manual, un <strong><em>despliegue</em></strong> a pulso de click o de forma reactiva a otro tipo de evento (otro pipeline a terminado). Por ejemplo, nosotros lo usamos para disparar un <strong><em>despliegue</em></strong> cuando termina una <strong><em>Integración Continua</em></strong> satisfactoriamente y alcanzar así el <strong><em>Despliegue Continuo</em></strong>.</p>

<h3 id="un-sin-fin-de-plugins">Un sin fin de plugins</h3>

<p>Por suerte, no todos las tareas hay que “picárselas”. Jenkins dispone de un amplio catálogo de plugins que incorporan funcionalidad específica a nuestros pipelines. Y es esta <strong>una de las grandes ventajas de la herramienta</strong>.</p>

<p>Como buenos <strong><em>techies</em></strong> muchas veces nos dejamos llevar por la arrogancia de querer implementarlo todo nosotros, como si fuéramos infalibles. Pues bien, es <strong>un error</strong>. Nuestra potencia como ingeniero <a href="https://arquitectoit.com/devops/">DevOps</a> está en perjiñar un pipeline, de conceptualizarlo, y desarrollarlo rápido y de forma robusta. Es nuestra industria la que está en juego!! Recordad que los mantras de <a href="https://arquitectoit.com/devops/">DevOps</a> pretenden <strong>hacer llegar el software mucho</strong> al usuario final <strong>y hacerlo ágilmente</strong>. Cuando <strong><em>Jenkins</em></strong> falla demasiado se convierte en un incordio más que una ayuda, y nació para esto último. Nuestra foco debe estar en descubrir cada vez más escenarios que necesitan ayuda y podemos optimizar.</p>

<p>La comunidad es muy buena en liberar nuevas capacidades, <strong>y un código probado mucho es mejor que uno molón</strong>.</p>

<p>Espero que os haya gustado y ahora sepáis un poco más sobre <strong>¿qué es Jenkins?</strong>.</p>]]></content><author><name>Gustavo Puig</name><email>g.puig.baeza@gmail.com</email></author><category term="devops" /><category term="despliegue continuo" /><category term="entrega continua" /><category term="integración continua" /><category term="jenkins" /><category term="pipeline as code" /><category term="pipeline" /><summary type="html"><![CDATA[En este post repasaremos los conceptos básicos que nos ayudarán a entender qué es jenkins, para qué sirve y a desenmarañar textos más complicados que os encontréis a partir de ahora.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/jenkins-head-logo.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/jenkins-head-logo.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Instalar Drupal en otros idiomas</title><link href="https://arquitectoit.com/drupal/instalar-drupal-en-otros-idiomas/" rel="alternate" type="text/html" title="Instalar Drupal en otros idiomas" /><published>2020-10-24T00:00:00+00:00</published><updated>2020-10-24T00:00:00+00:00</updated><id>https://arquitectoit.com/drupal/instalar-drupal-en-otros-idiomas</id><content type="html" xml:base="https://arquitectoit.com/drupal/instalar-drupal-en-otros-idiomas/"><![CDATA[<p>El proceso de instalación de <a href="/drupal/que-es-drupal/">Drupal</a> os ofrece la capacidad de instalar <a href="/drupal/que-es-drupal/">Drupal</a> en otros idiomas. Un proceso que puede parecer sencillo se puede convertir en un quebradero de cabeza. Ya que si queremos realizar instalaciones que no sean en inglés nos llevará a realizar una serie de pasos adicionales.</p>

<p>Lo primero que hacemos en el proceso de instalación es seleccionar el idioma en el cual queremos instalar Drupal. Aquí podremos elegir entre una serie de idiomas para iniciar el proceso: inglés, español, alemán,…</p>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-idioma.jpg" alt="Idioma en Drupal 8" /></p>

<p>Si por ejemplo realizamos la instalación en español veremos que el proceso de instalación nos va a decir algo así como:</p>

<p><samp>
"The translations directory does not exist.
The installer requires that you create a translations directory as part of the installation process. Create the directory sites/default/files/translations . More details about installing Drupal are available in INSTALL.txt."
</samp></p>

<p>Así que deberemos de acudir a dónde estamos instalando <a href="/drupal/que-es-drupal/">Drupal</a> para poder crear el directorio <code class="language-plaintext highlighter-rouge">/sites/default/translations</code>. Pero no solo deberemos de crear el directorio, si no que deberemos de asignarle los permisos 555 a dicho directorio. Es decir, estamos dejando leer y ejecutar sobre dicho directorio a todos los usuarios.</p>

<p>Lo que sería ejecutar la siguiente secuencia de comandos en la consola.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir ./sites/default/files/translations
chmod 555 ./sites/default/files/translations
</code></pre></div></div>

<p>Hay que decir que aunque el proceso de instalación habla de permisos 555, en mi caso he tenido que darle permisos 755, es decir, el propietario del directorio puede también escribir en él, para poder realizar el proceso de instalación.</p>

<p>De esta manera ya saber que te tocará modificar manualmente algunos directorios a la hora de instalar <a href="/drupal/que-es-drupal/">Drupal</a>.</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="drupal" /><category term="drupal" /><category term="idiomas" /><category term="chmod" /><summary type="html"><![CDATA[Si queremos instalar Drupal en otros idiomas que no sea el inglés deberemos de realizar algunas modificaciones sobre el sistema de ficheros. Veamos cuales son.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/gota.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/gota.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Max-execution-time</title><link href="https://arquitectoit.com/apache/max-execution-time/" rel="alternate" type="text/html" title="Max-execution-time" /><published>2020-10-23T00:00:00+00:00</published><updated>2020-10-23T00:00:00+00:00</updated><id>https://arquitectoit.com/apache/max-execution-time</id><content type="html" xml:base="https://arquitectoit.com/apache/max-execution-time/"><![CDATA[<h2 id="qué-es-el-fatal-error-maximum-execution-time-exceeded">¿Qué es el Fatal Error: Maximum Execution Time Exceeded?</h2>

<p>Cuando trabajamos con <a href="https://arquitectoit.com/cms/">CMS</a> que funcionan bajo <a href="http://www.manualweb.net/php/">PHP</a> y el <a href="https://arquitectoit.com/apache/">servidor Apache</a> como puede ser <a href="https://arquitectoit.com/wordpress/">WordPress</a> o <a href="https://arquitectoit.com/drupal/">Drupal</a> nos podemos encontrar con un error que nos viene a decir algo así como <strong>“Fatal Error: Maximum Execution Time Exceeded”</strong>. Error que nos puede llevar por la calle de la amargura cuando intentemos solucionarlo.</p>

<p>¿Qué está sucediendo en estos casos? Básicamente es que el <a href="https://arquitectoit.com/apache/">servidor Apache</a> está cortando la ejecución de un código <a href="http://www.manualweb.net/php/">PHP</a> que se está excediendo en el tiempo de ejecución y que por lo tanto puede afectar al rendimiento general del <a href="https://arquitectoit.com/apache/">servidor Apache</a>. Es decir, se ejecuta como medida de control sobre la ejecución del código y evitar que se produzcan conexiones a la base de datos de larga duración o casos de bucles infinitos que harían que el programa <a href="http://www.manualweb.net/php/">PHP</a> no acabase nunca.</p>

<p>Es por ello que el <a href="https://arquitectoit.com/apache/">servidor Apache</a> viene con una configuración en la que a los 30 o 60 segundos procede a cortar la ejecución y genera el famoso <strong>“Fatal Error: Maximum Execution Time Exceeded”</strong>.</p>

<p>Cuando trabajemos con <a href="https://arquitectoit.com/cms/">CMS</a> del tipo <a href="https://arquitectoit.com/wordpress/">WordPress</a> o <a href="https://arquitectoit.com/drupal/">Drupal</a> veremos que este error puede producirse en los procesos de instalación o en ciertas ocasiones cuando se conecta a la base de datos en búsqueda de contenido.</p>

<h2 id="configurar-max-execution-time">Configurar max-execution-time</h2>
<p>Si queremos cambiar este comportamiento deberemos de acudir a la configuración del servidor y en concreto a modificar el valor de la variable <code class="language-plaintext highlighter-rouge">max-execution-time</code>. Para poder modificar la variable <code class="language-plaintext highlighter-rouge">max-execution-time</code> tenemos dos alternativas.</p>

<p>La primera es aplicándolo a todo el servidor. Para ello deberemos de buscar la variable en el fichero de configuración del <a href="https://arquitectoit.com/apache/">servidor Apache</a>, es decir el fichero <strong>php.ini</strong>. En este caso lo que haremos será modificar el valor y asignarle el valor que queramos de <strong>tiempo máximo de ejecución en segundos</strong>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>max_execution_time = 300
</code></pre></div></div>

<p>En este caso le indicamos que el tiempo máximo es de 300 segundos, es decir, de 5 minutos.</p>

<p>Si no pudiésemos acceder a la configuración del servidor apache. Algo que sucede en algunos servicios de hosting, podemos realizar la configuración de <code class="language-plaintext highlighter-rouge">max-execution-time</code> en el <a href="https://arquitectoit.com/apache/que-es-htaccess/">fichero <strong>.htaccess</strong></a>. En este caos esta configuración solo aplicará a nuestra aplicación web.</p>

<p>Para ello añadiremos la siguiente sentencia en el <a href="https://arquitectoit.com/apache/que-es-htaccess/">fichero <strong>.htaccess</strong></a></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>php_value max_execution_time 300
</code></pre></div></div>

<p>Nuevamente el valor va en segundo, por lo que serían 5 minutos de límite.</p>

<h2 id="ejecuciones-infinitas">Ejecuciones infinitas</h2>
<p>Hay una opción de indicarle al <a href="https://arquitectoit.com/apache/">servidor Apache</a> de que no corte la ejecución del código <a href="http://www.manualweb.net/php/">PHP</a> independientemente de el tiempo que esta tome. En este caso es dándole el valor de 0 a la variale <code class="language-plaintext highlighter-rouge">max_execution_time</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>max_execution_time = 0
</code></pre></div></div>

<blockquote>
  <p>Lógicamente esta práctica no es recomendada para entornos productivos ya que podríamos dejar colapsado al <a href="https://arquitectoit.com/apache/">servidor Apache</a> teniendo que reiniciarlo para poder recuperar su ejecución.</p>
</blockquote>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="apache" /><category term="php" /><category term="php.ini" /><category term="servidor web" /><summary type="html"><![CDATA[La variable de configuración max-execution-time le permite al servidor web Apache limitar el tiempo que un programa PHP puede tomarse para su ejecución.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/spdy.png" /><media:content medium="image" url="https://arquitectoit.com/images/covers/spdy.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Instalar Drupal</title><link href="https://arquitectoit.com/drupal/instalar-drupal/" rel="alternate" type="text/html" title="Instalar Drupal" /><published>2020-10-22T00:00:00+00:00</published><updated>2020-10-22T00:00:00+00:00</updated><id>https://arquitectoit.com/drupal/instalar-drupal</id><content type="html" xml:base="https://arquitectoit.com/drupal/instalar-drupal/"><![CDATA[<p>Vamos a revisar qué es lo que tenemos que hacer y que pasos hay que seguir para poder desplegar un <a href="https://arquitectoit.com/cms/">CMS</a> Drupal.</p>

<p>Lo primero que tenemos que hacer para instalar <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> es descargarnos la versión que queramos instalar. Para ello lo podemos hacer desde <a href="https://www.drupal.org/download">el área de descargas de Drupal</a> dónde encontraremos la última versión de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> (A día de hoy Drupal 9.0.7) o bien podemos ir a la <a href="https://www.drupal.org/project/drupal">página de descargas de todas las versiones de Drupal</a> dónde podemos encontra las versiones de Drupal 8 (a día de hoy Drupal 8.9.7) y Drupal 7 (a día de hoy Drupal 7.73), así cómo los múltiples fixes y minor version que tiene el producto.</p>

<p>Una vez hayamos decargado el fichero podremos descomprimirlo y veremos todos los ficheros que contiene Drupal.</p>

<p>Cuando tengamos descomprimido el fichero deberemos de chequear el fichero <code class="language-plaintext highlighter-rouge">/core/install.txt</code> que nos dará información relativa al proceso de instalación de Drupal, así como los requisitos mínimos que necesitaremos.</p>

<h2 id="requerimientos-instalar-drupal-8">Requerimientos Instalar Drupal 8</h2>
<p>Seguiremos la secuencia para instalar un Drupal 8.9.7. En el fichero <code class="language-plaintext highlighter-rouge">/core/install.txt</code> podremos encontrar los requerimientos para instalar Drupal, entre ellos encontramos</p>

<ul>
  <li>Mínimo PHP 7.0.8. Recomendable 7.2.17 por temas de seguridad</li>
  <li>WebServer que soporte PHP. Recomendados:
    <ul>
      <li>Apache 2.0 o superior</li>
      <li>Nginx 1.1 o superior.</li>
    </ul>
  </li>
  <li>Una base de datos. En este sentido recomienda:
    <ul>
      <li>MySQL 5.5.3 o superior</li>
      <li>MariaDB 5.5.20 o superior</li>
      <li>Percona Server 5.5.8 o superior</li>
      <li>PostgreSQL 9.1.2 o superior</li>
      <li>SQLite 3.7.11 o superior</li>
    </ul>
  </li>
</ul>

<h2 id="1-copiar-los-ficheros">1: Copiar los ficheros</h2>
<p>Si trabajamos con un <a href="https://arquitectoit.com/apache/">servidor Apache</a> lo que habrá que hacer es localizar <strong>la carpeta htdocs</strong> que es dónde procederemos a instalar <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> y copiar sobre ella los ficheros. Esta carpeta estará en un sitio u otro dependiendo de la instalación.</p>

<p>Dependiendo de como hayamos instalado nuestro <a href="https://arquitectoit.com/apache/">servidor Apache</a> podremos localizar la carpeta en diferentes sitios:</p>

<ul>
  <li>Para XAMPP en Widnows, la encontraremos en <code class="language-plaintext highlighter-rouge">c:/xampp/htdocs</code>.</li>
  <li>Para LAMPP en Linux, la encontramos en <code class="language-plaintext highlighter-rouge">/opt/lampp/etc/</code></li>
  <li>Para Macs que vienen con un Apache la encontramos en <code class="language-plaintext highlighter-rouge">/Library/WebServer/Documents</code></li>
  <li>…</li>
</ul>

<blockquote>
  <p>Siempre podremos conocer la ubicación de htdocs y cambiarla en el fichero <strong>httpd.conf</strong> de <a href="https://arquitectoit.com/apache/">Apache</a>.</p>
</blockquote>

<h2 id="2-arrancar-proceso-de-instalación">2: Arrancar proceso de instalación</h2>
<p>Para poder arrancar el proceso de instalación lo que tendremos que hacer es acceder a la carpeta de nuestro servidor web dónde tenemos los ficheros. Por ejemplo <code class="language-plaintext highlighter-rouge">http://localhost/drupal</code>. Solo accediendo a la raíz del directorio dónde instalamos los ficheros de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> nos permitirá el arrancar la instalación.</p>

<h2 id="3-selección-de-idioma">3: Selección de Idioma</h2>
<p>Lo primero será el elegir el <a href="https://arquitectoit.com/drupal/instalar-drupal-en-otros-idiomas/">idioma en el cual queremos instalar Drupal</a>. El instalador nos ofrece múltiples opciones entre inglés, español, alemán,…</p>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-idioma.jpg" alt="Idioma en Drupal 8" /></p>

<p>En el caso de que sea un idioma diferente al inglés, va a necesitar un fichero para guardar las traducciones, es por ello que deberemos de crear el directorio <code class="language-plaintext highlighter-rouge">/sites/default/translations</code>.</p>

<p>Pero no solo nos valdrá con crear el directorio <code class="language-plaintext highlighter-rouge">/sites/default/translations</code> si no que además deberemos de darle los permisos 555 o 755 para que el proceso de instalación pueda generar contenido en ese directorio.</p>

<h2 id="4-perfil-de-instalación">4: Perfil de Instalación</h2>

<p>Una vez pasado el proceso de elección del idioma vamos a selección del <strong>perfil de instalación</strong>. Los perfiles que nos ofrece son los siguientes:</p>

<ul>
  <li><strong>Estándar</strong>, instala las características de uso más comunes preconfiguradas.</li>
  <li><strong>Mínimo</strong>, construye un sitio personalizado sin funcionalidades preconfiguradas.</li>
  <li><strong>Demostración</strong>, nos instala un sitio de ejemplo que nos muestra algunas de las características de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a>.</li>
</ul>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-perfil.jpg" alt="Perfiles de Drupal 8" /></p>

<p>En nuestro caso vamos a elegir el perfil <strong>estándar</strong>. A partir de aquí Drupal verifica que las capacidades que necesitan están disponibles: <em>servidor web</em>, <em>versión de PHP</em>, <em>extensiones PHP activadas</em>, <em>si está activado el caché OPCODE</em>, <em>si puede generar números aleatorios</em>, <em>si hay capacidades de la base de datos</em>, <em>el límite de la memoria PHP</em>, <em>capacidades UNICODE</em>, <em>si puede escribir en el sistema de ficheros</em> y <em>si existe el fichero de configuración</em>.</p>

<p>Llegados a este punto puede darse que haya varios de los puntos que no tengamos configurados en nuestro sistema. Pero el primordial es que tengamos un fichero de configuración que es base para la instalación. Este fichero se puede encontrar en <code class="language-plaintext highlighter-rouge">/sites/default/settings.php</code>.</p>

<h2 id="5-configurar-la-base-de-datos">5: Configurar la base de datos</h2>
<p>Lo siguiente será configurar la base de datos. Ya hemos visto más arriba las bases de datos que están soportadas. Para poder configurar la base de datos con <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> tienes que indicarle los siguientes datos:</p>
<ul>
  <li><strong>Nombre de la base de datos</strong></li>
  <li><strong>Nombre del usuario de acceso a la base de datos</strong></li>
  <li><strong>Contraseña del usuario de acceso a la base de datos</strong></li>
  <li><strong>Servidor en el que se encuentra la base de datos.</strong> Si está en el mismo servidor de que instalamos el servidor web se podrá utilizar localhost.</li>
  <li><strong>Puerto de conexión a la base de datos.</strong> Cada base de datos suele tener un puerto por defecto, como el 3306 de MySQL, pero puede ser que tu lo tengas configurado en otro puerto, así que aquí podrás indicar cual es dicho puerto. Por ejemplo el 55000.</li>
  <li><strong>Prefijo de las tablas</strong>. Aunque se puede dejar vacío es bueno que des algún prefijo a tu instalación para diferenciar las tablas de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a>.</li>
</ul>

<blockquote>
  <p>Aunque Drupal te recomienda utilizar el prefijo <code class="language-plaintext highlighter-rouge">drupal_</code>, por motivos de seguridad es mejor que personalices tu prefijo. Sobre todo para no dar pistas de que tienes instalado un <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a> en tu sitio web.</p>
</blockquote>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-bbdd.jpg" alt="Bases de Datos en Drupal 8" /></p>

<p>Una vez configurada la base de datos pasaremos a realizar la instalación de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a>.</p>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-instalando.jpg" alt="Instalando Drupal 8" /></p>

<p>Terminada la instalación es bueno que restauremos los permisos iniciales del fichero <code class="language-plaintext highlighter-rouge">/sites/default/settings.php</code> y solo dejarlos con permisos de lectura. Es decir, ejecutar la siguiente secuencia de comandos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>chmod 444 ./sites/default/settings.php
</code></pre></div></div>

<h2 id="6-configuración-del-sitio">6: Configuración del Sitio</h2>
<p>Cuando termine la instalación de los componentes básicos se procederá a realizar <strong>la configuración del sitio</strong>. Aquí podremos elegir cosas cómo el nombre que va a tener nuestra página web o el nombre del usuario que queremos que acceda al sitio.</p>

<p>Los datos que podemos rellenar son los siguientes:</p>

<ul>
  <li><strong>Nombre del sitio</strong>. Cómo se llamará nuestra página web.</li>
  <li><strong>Dirección de correo del sitio</strong>. Para recibir notificaciones del sitio.</li>
  <li><strong>Usuario de acceso</strong>. Aquí indicaremos el nombre del usuario con el que accederemos, así como su <em>email</em> y <em>contraseña</em>.</li>
  <li><strong>Opciones regionales</strong>. Para poder configurar el país y zona horaria en el que se encuentra el sitio.</li>
</ul>

<p><img src="https://arquitectoit.com/images/drupal/drupal8-configurar-sitio.jpg" alt="Configuración del Sitio en Drupal 8" /></p>

<blockquote>
  <p>Una buena recomendación de seguridad es que el nombre del usuario con el que accedas al sitio no sea uno típico como admin, root o tu nombre. Utiliza un nombre de usuario que no sea identificativo.</p>
</blockquote>

<p>Este será el último paso y ya estaremos en el Panel de Control de <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a>. De esta manera habríamos terminado de instalar <a href="https://arquitectoit.com/drupal/que-es-drupal/">Drupal</a>.</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="drupal" /><category term="drupal" /><category term="apache" /><category term="bases de datos" /><category term="xampp" /><summary type="html"><![CDATA[Descripción de los pasos que hay que seguir para poder realizar para poder instalar Drupal (idioma, configuración de base de datos, creación de usuarios,...)]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/gota.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/gota.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">¿Qué es OPcache?</title><link href="https://arquitectoit.com/php/que-es-opcache/" rel="alternate" type="text/html" title="¿Qué es OPcache?" /><published>2020-10-21T00:00:00+00:00</published><updated>2020-10-21T00:00:00+00:00</updated><id>https://arquitectoit.com/php/que-es-opcache</id><content type="html" xml:base="https://arquitectoit.com/php/que-es-opcache/"><![CDATA[<h2 id="qué-es-opcache">¿Qué es OPcache?</h2>
<p>OPcache es una <strong>extensión de <a href="http://www.manualweb.net/php">PHP</a></strong> que nos permite mejorar el rendimiento de la ejecución del código <a href="http://www.manualweb.net/php">PHP</a>.
Para ello OPcache <strong>almacena los scripts PHP precompilados en memoria</strong> para que puedan ejecutarse lo más rápido posible, evitando que se tengan que cargar y analizar cada vez que se piden.</p>

<p>OPcache está disponible de la versión PHP 5.5.0 en adelante.</p>

<h2 id="instalar-opcache">Instalar OPcache</h2>
<p>Lo más normal es que tu configuración de <a href="http://www.manualweb.net/php">PHP</a> ya traiga configurado el módulo de OPcache, en el caso de que no sea así deberás de añadir en el fichero <strong>php.ini</strong> la extensión</p>

<p>Para servidores en Linux y Mac:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>zend_extension=/libreria/opcache.so
</code></pre></div></div>

<p>Para servidores en Windows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>zend_extension=C:\libreria\php_opcache.dll
</code></pre></div></div>

<p>Siendo la ruta <code class="language-plaintext highlighter-rouge">librería</code> el directorio dónde tengamos el módulo.</p>

<h2 id="configurar-opcache">Configurar OPCache</h2>
<p>Para configurar OPcache tenemos múltiples propiedades. Entre ellas encontramos algunas como:</p>

<ul>
  <li><strong>opcache.enable</strong>, habilita la caché de opcode. El valor que espera es un booleano, siendo 1 para activarlo.</li>
  <li><strong>opcache.enable_cli</strong>, habilita la caché de opcode para la versión CLI de <a href="http://www.manualweb.net/php">PHP</a>. El valor que espera es un booleano, siendo 1 para activarlo.</li>
  <li><strong>opcache.memory_consumption</strong>, es el tamaño en megabytes de la caché.</li>
  <li><strong>opcache.interned_strings_buffer</strong>, es la cantidad, en megabytes, para almacenar cadenas.</li>
  <li><strong>opcache.max_accelerated_files</strong>, el número máximo de ficheros <a href="http://www.manualweb.net/php">PHP</a> que se almacenarán en la caché. Curisoamente se utilizará el primer número primo superior al número que le indiquemos, siendo 200 lo mínimo que podemos configurar.</li>
  <li><strong>opcache.revalidate_freq</strong>, marca la frecuencia en la que revalidaremos los scripts para actualizarlos. Se indica en segundos.</li>
  <li><strong>opcache.fast_shutdown</strong>, es un valor booleano que activado permite una liberación rápida de la memoria en la secuencia de apagado.</li>
</ul>

<p>Para estas propiedades la configuración recomendada por <a href="http://www.manualweb.net/php">PHP</a> de introducir en el fichero <strong>php.ini</strong> es la siguiente:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
</code></pre></div></div>

<blockquote>
  <p>Puedes encontrar mucha más información sobre lo que es OPCache <a href="https://www.php.net/manual/es/book.opcache.php">en la documentación general de PHP</a>.</p>
</blockquote>

<h2 id="opcache-y-drupal">OPcache y Drupal</h2>
<p>El <a href="https://arquitectoit.com/drupal/instalar-drupal/">proceso de instalación de Drupal</a> va a chequear que está activado el módulo OpCache <a href="https://arquitectoit.com/drupal/instalar-drupal/">para poder realizar la instalación</a>. Ya que necesita el tener activado esta mejora de rendimiento para su ejecución.</p>

<p>En el caso de que no lo tengamos activado en nuestro fichero <strong>php.ini</strong> nos mostrará un error del estilo</p>

<p><samp>
Opcache warning (PHP OPcode caching not enabled)
PHP OPcode caching can improve your site's performance considerably. It is highly recommended to have OPcache installed on your server.
</samp></p>

<p>Así que es bueno que configures Opcache en su instalación de <a href="http://www.manualweb.net/php">PHP</a> antes realizar la instalación de <a href="/drupal/que-es-drupal/">Drupal</a>.</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="php" /><category term="opcache" /><category term="modulos php" /><summary type="html"><![CDATA[Si queremos instalar Drupal en otros idiomas que no sea el inglés deberemos de realizar algunas modificaciones sobre el sistema de ficheros. Veamos cuales son.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/almacen.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/almacen.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">¿Qué es Drupal?</title><link href="https://arquitectoit.com/drupal/que-es-drupal/" rel="alternate" type="text/html" title="¿Qué es Drupal?" /><published>2020-10-20T00:00:00+00:00</published><updated>2020-10-20T00:00:00+00:00</updated><id>https://arquitectoit.com/drupal/que-es-drupal</id><content type="html" xml:base="https://arquitectoit.com/drupal/que-es-drupal/"><![CDATA[<h2 id="qué-es-drupal">¿Qué es Drupal?</h2>
<p><strong>Drupal es un gestor de contenidos web</strong>, o más conocido por sus siglas <a href="/cms/que-es-un-cms/">CMS(Content Management System)</a>, que nos permite crear páginas web dinámicas. Las páginas web pueden ser simples blogs, tiendas de comercio electrónico, foros de debate o cualquier tipo de web.</p>

<p>Drupal <strong>es un software open source desarrollado en <a href="https://arquitectoit.com/php/">PHP</a></strong> que cuenta con una gran comunidad de usuarios.</p>

<p>Dentro de <strong>Drupal</strong> podemos identificar <strong>el core del gestor de contenidos</strong> que nos ofrece las capacidades básicas y <strong>los módulos</strong> que amplian las capacidades que ofrece el gestor de contenidos. Los módulos pueden ser desarrollados por cualquier programador para poder así extender las funcionalidades de <strong>Drupal</strong>.</p>

<p>Además Drupal permite <strong>personalizar la forma en la que se muestran las páginas web mediante el uso de temas</strong>. Los temas que pueden ser desarrollados por los propios usuarios permitirán ubicar el contenido en un sitio u otro de la web, así como aplicar los estilos que se necesiten para su visualización web o móvil.</p>

<p>Posiblemente, <a href="/cms/listado-cms/">junto con Wordpress, Drupal sea de los gestores de contenidos</a> más extendidos en el mercado.</p>

<h2 id="versiones-de-drupal">Versiones de Drupal</h2>
<p>Drupal se empezó a desarrollar por <strong>Dries Buytaert</strong> publicando el 15 enero de 2001 la primera versión de Drupal.</p>

<p>A día de hoy las versiones de Drupal activas son tres:</p>

<ul>
  <li>La versión actual es <strong>Drupal 9</strong>, actualmente en su versión 9.0.7</li>
  <li>La versión más extendida e instalada es <strong>Drupal 8</strong>, de la cual podemos encontrar la versión 8.9.7</li>
  <li>La versión que se está retirando es la versión <strong>Drupal 7</strong>, de la cual podemos encontrar hasta la versión 7.73.</li>
</ul>

<h2 id="principales-características">Principales características</h2>
<p>Muchas son las características que podríamos enumerar de Drupal. Pero entre las principales caractéristicas encontramos:</p>

<ul>
  <li><strong>Flexibilidad</strong>, mediante Drupal podemos crear cualquier tipo de web que nos imaginemos. Las capacidades de extensión son enormes, llegando a permitir la exposición de contenido mediante servicios API Rest.</li>
  <li><strong>Sotfware Libre</strong>, Drupal es un software libre y gratuito que podemos utilizar en cualquier sitio. Se puede <a href="https://github.com/drupal/drupal">descargar el código fuente de Drupal desde Github</a></li>
  <li><strong>Comunidad Drupal</strong>, Drupal cuenta con una de las mayores comunidades de sotware libre y que contribuye mediante <a href="https://github.com/drupal/drupal">repositorios en Github</a>, en múltiples foros, mediante entradas en blogs,…</li>
  <li><strong>Soporte multilenguaje</strong>, podemos utilizar Drupal en mas de 100 idiomas. Además mediante sus módulos podemos crear sistemas muti-idioma de forma sencilla.</li>
  <li><strong>Extensibilidad</strong>, su sistema de módulos permite extender el core de Drupal con nuevas capacidades.</li>
  <li><strong>Taxonomias</strong>, permite definir conceptos de negocio que pueden ser gestionados en los diferentes elementos de Drupal, como pueden ser vistas, bloques,…</li>
  <li><strong>Caché</strong>, cuenta con un sistema de caché que mejora el rendimiento a la hora de servir los sitios web dinámicos.</li>
  <li><strong>SEO</strong>, facilita la gestión de un modelo SEO del contenido para favorecer su posicionamiento web.</li>
</ul>

<h2 id="quién-utiliza-drupal">¿Quién utiliza Drupal?</h2>
<p>WordPress ocupa el primer lugar de los <a href="https://joost.blog/cms-market-share-june-2020-analysis/">CMS más utilizados</a>, seguido por Shopify y Joomla. En cuarta posición ya podemos encontrar como <a href="/cms/que-es-un-cms/">CMS</a> a Drupal con un share del 1,6% -<a href="https://joost.blog/cms-market-share-june-2020-analysis/">atendiendo a los datos de junio 2020 de Joost de Valk</a>-.</p>

<p>Según <a href="https://www.vardot.com/en-us/ideas/blog/top-10-drupal-websites-world-updated">Vardot</a> dentro de los sitios más importantes que utilizan Drupal encontramos:</p>

<ul>
  <li>Nasa</li>
  <li>Entertainment Weekly</li>
  <li>Tesla</li>
  <li>NCAA</li>
  <li>Mint</li>
  <li>El Gobierno Australiano</li>
  <li>Le Figaro</li>
  <li>…</li>
</ul>

<h2 id="dónde-descargarlo">Dónde descargarlo</h2>
<p>Lo primero que tenemos que hacer para instalar Drupal es descargarnos la versión que queramos instalar. Para ello lo podemos hacer desde <a href="https://www.drupal.org/download">el área de descargas de Drupal</a> dónde encontraremos la última versión de Drupal (A día de hoy Drupal 9.0.7) o bien podemos ir a la <a href="https://www.drupal.org/project/drupal">página de descargas de todas las versiones de Drupal</a> dónde podemos encontrar las versiones de Drupal 8 (a día de hoy Drupal 8.9.7) y Drupal 7 (a día de hoy Drupal 7.73), así cómo los múltiples fixes</p>]]></content><author><name>Víctor Cuervo</name><email>vcuervo@gmail.com</email><uri>http://www.victorcuervo.com</uri></author><category term="drupal" /><category term="cms" /><category term="gestor contenidos" /><category term="rest" /><category term="seo" /><category term="taxonomias" /><summary type="html"><![CDATA[Artículo que nos cuenta qué es Drupal, que características tiene, las versiones que existen y quien utiliza este famoso CMS.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://arquitectoit.com/images/covers/gota.jpg" /><media:content medium="image" url="https://arquitectoit.com/images/covers/gota.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>