Debian https://www.carloscarrascal.com/ es Instalar PHP 7.2 en Debian 9 para Drupal 8 https://www.carloscarrascal.com/blog/instalar-php-72-en-debian-9-para-drupal-8 <article data-history-node-id="43" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Instalar PHP 7.2 en Debian 9 para Drupal 8 </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Domingo, Octubre 21, 2018 - 01:19</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/php" hreflang="es">PHP</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Debian 9 trae por defecto en sus repositorios PHP 7.0.32. Desde Drupal 8.5.0 ya se soporta PHP 7.2, y por si no os habeis dado cuenta, <strong>Drupal 8 dejará de soportar PHP 5.5 y 5.6 el día 6 de marzo de 2019</strong>, así que ya va siendo hora de actualizar.</p> <p>Subir a 7.2 es bastante sencillo:</p> <pre> sudo apt install apt-transport-https lsb-release ca-certificates sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/php.list' sudo apt update</pre> <p>Una vez actualizado, podemos comprobar la versión instalada con:</p> <pre> php -v</pre> <p>Si no se ha actualizado automáticamente, podemos actualizar php a mano:</p> <pre> sudo apt install php7.2 php7.2-cli php7.2-common php7.2-curl php7.2-gd php7.2-json php7.2-mbstring php7.2-mysql php7.2-opcache </pre> <p>Una vez actualizado PHP, hay que actualizar el módulo que usamos en el servidor web.  Para Apache:</p> <pre> sudo a2enmod php7.2 sudo a2dismod php7.1</pre> <p>Y reiniciar:</p> <pre> sudo service apache2 restart</pre> <p>Si estáis utilizando composer, es una buena idea incluir la versión de PHP a utilizar:</p> <pre> composer config platform.php 7.2</pre> <p>Y actualizar todo:</p> <pre> composer update</pre> <p>En algunos casos es buena idea borrar el fichero <em>composer.lock</em> antes de correr el update.</p> <p> </p> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=43&amp;2=comment&amp;3=comment" token="k8gK-xVcL0gzDcnyrt0dwH140sYIcDugBHd2dQTEqg4"></drupal-render-placeholder> </section> </div> </article> Sat, 20 Oct 2018 23:19:02 +0000 root 43 at https://www.carloscarrascal.com Revertir a una version anterior un paquete en Debian https://www.carloscarrascal.com/blog/revertir-una-version-anterior-un-paquete-en-debian <article data-history-node-id="39" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Revertir a una version anterior un paquete en Debian </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Sábado, Julio 14, 2018 - 22:10</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Una de las diversiones de utilizar la versión <a href="https://www.debian.org/releases/sid/">Sid</a> (inestable) de Debian, es actualizar paquetes. Cualquier cosa puede pasar.</p> <p>Hoy tenia un rato libre y le he dado al apt upgrade a ver que pasaba. Lo que ha pasado es que VirtualBox ha dejado de funcionar, y no arranca las máquinas virtuales, con este error:</p> <ul> <li><a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=902897">virtualbox: fails to start vm (VERR_LDRELF_RELOCATION_NOT_SUPPORTED)</a><br />  </li> </ul> <p>Después de revisar el hilo del error, parece que lo mas rápido es bajar de versión el paquete, ya que la última instalada es la <em>5.2.14-dfsg-4</em>, por lo que parece, la versión anterior (<em>5.2.14-dfsg-3</em> en este caso) parece que funciona bien.</p> <p>Así que voy a intertar explicaros como he hecho para bajar el paquete de versión, sin tener que bajar e instalar a mano el paquete, sino usando los repos de Debian.</p> <p>Primero, vamos a <a href="http://snapshot.debian.org/">snapshot.debian.org</a> y buscamos el paquete que nos da problemas, en mi caso virtualbox. Podemos usar la caja de búsqueda o rebuscar a mano por el índice, lo que os de mas morbo.</p> <p>Hay que seleccionar la versión que buscamos, y debajo del nombre del paquete vereis algo como esto:</p> <blockquote> <p>Seen in debian on 2018-07-12 14:59:27 in <a href="http://snapshot.debian.org/archive/debian/20180712T145927Z/pool/contrib/v/virtualbox/">/pool/contrib/v/virtualbox</a>. </p> </blockquote> <p>Al pinchar en el enlace, llegamos a una dirección de este tipo:</p> <ul> <li><a href="http://snapshot.debian.org/archive/debian/20180712T211510Z/pool/contrib/v/virtualbox/">http://snapshot.debian.org/archive/debian/20180712T211510Z/pool/contrib…</a></li> </ul> <p>Una vez encontrada esta URL, vamos a usarla configurando una nueva fuente para Apt:</p> <pre> cd /etc/apt/sources.list.d</pre> <p>Y creamos un nuevo archivo de fuente:</p> <pre> sudo vi virtualbox.list</pre> <p>Tenemos que usar parte de la URL de antes, sin poner la parte final. En mi caso añado la versión unstable, y el <em>contrib</em>, porque el paquete es de <em>contrib</em>. Quedaría algo así:</p> <pre> deb https://snapshot.debian.org/archive/debian/20180712T211510Z/ unstable contrib </pre> <p>Guardamos el archivo y actualizamos el <em>Apt</em> para que incluya el nuevo índice:</p> <pre> apt update</pre> <p>Una vez termine de actualizar, podemos sacar la lista de versiones disponibles del paquete que necesitamos:</p> <pre> apt-cache showpkg virtualbox</pre> <p>E instalar la que necesitemos, usando el nombre de la version en el mismo comando de <em>Apt</em>:</p> <pre> apt install virtualbox=5.2.14-dfsg-3</pre> <p>En mi caso, el paquete <em>virtualbox</em> tenía un paquete recomendado llamado <em>virtualbox-qt</em>, que <em>Apt</em> muy amablemente me indicó al tratar de instalarlo, así que decidí bajarlo de versión también por si acaso:</p> <pre> apt install virtualbox=5.2.14-dfsg-3 virtualbox-qt=5.2.14-dfsg-3 </pre> <p>Con esto se actualizaron los paquetes necesarios para esas versiones, y encima tuve la suerte de que VirtualBox volvió a funcionar perfectamente. Ahora veremos que pasa cuando salga la version siguiente (<em>5.2.14-dfsg-3</em>) y quiera actualizarlo... </p> <p>Ya os contaré.</p> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=39&amp;2=comment&amp;3=comment" token="LlETczWEdD9n00RfEBpV3q0sbSk9m84l5hhCSQ9IHxY"></drupal-render-placeholder> </section> </div> </article> Sat, 14 Jul 2018 20:10:45 +0000 root 39 at https://www.carloscarrascal.com Como instalar composer en Debian 8 https://www.carloscarrascal.com/blog/como-instalar-composer-en-debian-8 <article data-history-node-id="30" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Como instalar composer en Debian 8 </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Domingo, Octubre 1, 2017 - 01:58</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/d8" hreflang="es">D8</a></div> <div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Instalar composer en Debian 8 es muy sencillo:</p> <pre> <code>$ cd /usr/src $ sudo apt-get install curl php5-cli $ curl -sS <a href="https://getcomposer.org/installer" rel="nofollow">https://getcomposer.org/installer</a> | sudo php -- --install-dir=/usr/local/bin --filename=composer </code></pre> <p>Después podemos comprobar si se ha instalado correctamente:</p> <pre> <code>$ composer --version</code></pre> <p>A día de hoy, este comando muestra:</p> <pre> Composer version 1.5.2 2017-09-11 16:59:25</pre> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=30&amp;2=comment&amp;3=comment" token="8wewMAKC0uqsWM0QjaNynVaLnWgPdKnjktil3Z76i3I"></drupal-render-placeholder> </section> </div> </article> Sat, 30 Sep 2017 23:58:12 +0000 root 30 at https://www.carloscarrascal.com Error ERROR 1071 (42000) al importar una base de datos Drupal https://www.carloscarrascal.com/blog/error-error-1071-42000-al-importar-una-base-de-datos-drupal <article data-history-node-id="21" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Error ERROR 1071 (42000) al importar una base de datos Drupal </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Sábado, Marzo 18, 2017 - 18:28</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div> <div class="field--item"><a href="/tags/mysql" hreflang="es">MySQL</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/d7" hreflang="es">D7</a></div> <div class="field--item"><a href="/tags/database" hreflang="es">Database</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Tratando de importar una copia de base de datos que había creado con <em>drush sql-dump</em> en otro servidor, me he encontrado con este error de MySQL:</p> <pre> ERROR 1071 (42000) at line 25: Specified key was too long; max key length is 767 bytes</pre> <p>El comando que estaba usando era bastante normal:</p> <pre> drush sql-cli &lt; ../backup.sql </pre> <p>Después de intentar varias opciones, también he llegado a ver este otro error:</p> <pre> ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes. </pre> <p>La versión de MySQL que estaba usando es 5.6.30-1, como podéis ver aquí:</p> <pre> ​dpkg -l | grep mysql-server ii <strong>mysql-server</strong> 5.6.30-1 all MySQL database server (metapackage depending on the latest version) ii <strong>mysql-server</strong>-5.6 5.6.30-1 amd64 MySQL database server binaries and system database setup ii <strong>mysql-server</strong>-core-5.6 5.6.30-1 amd64 MySQL database server binaries</pre> <p> </p> <p>El problema venia de la configuración de INNODB en mi servidor, y la solución es bastante sencilla, basta con editar el fichero de configuracion de MySQL (como <em>root</em> o usando <em>sudo</em>), que en Debian está en:</p> <pre> vi /etc/mysql/my.cnf </pre> <p>Si no teneis ese fichero puede que este aquí:</p> <pre> vi /etc/mysql/mysql.conf.d/mysqld.cnf </pre> <p>Tenemos que incluir las siguientes líneas de configuración en la sección de <em>[mysqld]</em>:</p> <pre> innodb_file_format = true innodb_file_per_table=true innodb_file_format=barracuda </pre> <p>Después reiniciamos el servidor y listo:</p> <pre> service mysql restart</pre> <p>Ahora si intentamos importar la base de datos de nuevo no deberíamos tener problemas.</p> <p>EDIT:</p> <p>Si no podemos tocar la configuración del servidor, podemos ejecutar esto directamente en mysql antes de ejecutar nuestra query:</p> <pre> <code>SET @@global.innodb_large_prefix = 1;</code></pre> <p> </p> <h2>Referencias:</h2> <ul> <li><a href="https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix" target="_blank">https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix</a></li> </ul> <p> </p> </div> </div> <div class="group-footer"> <section> <h2>Comments</h2> <article data-comment-user-id="0" id="comment-2" about="/en/comment/2" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1536177330"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Pelaez (no verificado)</span> el Mié, 20/09/2017 - 01:59</span> <span property="schema:dateCreated" content="2017-09-19T23:59:46+00:00" class="hidden"></span> </p> <a href="/en/comment/2#comment-2" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/2#comment-2" class="permalink" rel="bookmark" hreflang="en">gracias</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Gracias por este articulo, me estaba volviendo loco con esto</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2&amp;1=default&amp;2=en&amp;3=" token="8HyszN_uZaobqtd30DdLSRD9p71vJt7YwSHUzjLPUDo"></drupal-render-placeholder> </div> </article> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=21&amp;2=comment&amp;3=comment" token="5XSG_rpahIxFRK6x2zFQ269KDIgAOiq-4yaA65G5Kkc"></drupal-render-placeholder> </section> </div> </article> Sat, 18 Mar 2017 17:28:08 +0000 root 21 at https://www.carloscarrascal.com HTTPS con un certificado gratuito de letsencrypt.org y Certbot https://www.carloscarrascal.com/blog/https-con-un-certificado-gratuito-de-letsencryptorg-y-certbot <article data-history-node-id="16" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> HTTPS con un certificado gratuito de letsencrypt.org y Certbot </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Lunes, Febrero 27, 2017 - 22:03</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/servicios" hreflang="es">Servicios</a></div> <div class="field--item"><a href="/tags/ssl" hreflang="es">SSL</a></div> <div class="field--item"><a href="/tags/https" hreflang="es">HTTPS</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><em>Let’s Encrypt</em> es una autoridad certificadora (CA) abierta, gratuita, y libre. Llevan funcionando menos de un año, desde 2016, y se puede decir que es un servicio público, dirigido a promover y facilitar la obtención y configuración de certificados de seguridad para la web. Lo que ofrecen son certificados X.509 por dominio que podemos usar para TLS.</p> <p><a href="https://letsencrypt.org/" target="_blank">https://letsencrypt.org/</a></p> <p>Hay varias organizaciones involucradas en el proyecto, siendo la principal la <a href="https://en.wikipedia.org/wiki/Internet_Security_Research_Group" target="_blank">Internet Security Research Group (ISRG)</a>, junto a otras como <a href="https://es.wikipedia.org/wiki/Fundaci%C3%B3n_Linux" target="_blank">Linux Foundation</a> o <a href="https://es.wikipedia.org/wiki/Fundaci%C3%B3n_Mozilla" target="_blank">Mozilla Foundation</a>, pero también gigantes como Akamai o Cisco Systems. Es decir, que hay gente grande detrás, y el proyecto es bastante interesante, esperemos que dure.</p> <p>Hasta ahora conseguir un certificado de seguridad para configurar HTTPS como es debido era bastante engorroso, además de que solía ser bastante caro. Últimamente los precios habían comenzado a bajar, pero ahora podemos conseguir un certificado propio por la cara, y con una instalación muy sencilla.</p> <p>La principal ventaja del servicio se basa en la automatización de todo el proceso. El objetivo es configurar un servidor HTTPS y obtener un certificado de confianza para los navegadores sin intervención humana. Y dejarme deciros que me ha funcionado de verdad, y a la primera. </p> <p>Esta automatización es la clave de todo el asunto, primero porque los certificados que nos ofrecen solamente son válidos por 90 días, lo que nos va a obligar a configurar la renovación de forma automática si no queremos estar cada tres meses renovando el certificado de forma manual.</p> <p>Para esto han ideado un protocolo llamado ACME (<a href="https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment" target="_blank">Automated Certificate Management Environment</a>), y el truco consiste en instalar un agente que se encargue de realizar automáticamente la petición y renovación del certificado, validando el solito nuestros dominios. Tenemos unos cuantos disponibles, pero el que recomiendan desde letsencrypt.org es <em>Certbot</em>:</p> <p><a href="https://certbot.eff.org" target="_blank">https://certbot.eff.org</a></p> <p><em>Certbot</em> esta empaquetado en los repos de Debian, pero deberemos usar el repositorio de <a href="https://backports.debian.org/Instructions/" target="_blank">backports</a>. Para ello basta con incluir una línea en nuestro fichero <em>/etc/apt/sources.list</em>. Si estáis usando Jessie (Debian 8) será:</p> <pre> deb http://ftp.debian.org/debian jessie-backports main</pre> <p>Después actualizamos:</p> <pre> apt-get update</pre> <p>Ahora ya podemos instalar el cliente de <em>Certbot</em>:</p> <pre> $ sudo apt-get install python-certbot-apache -t jessie-backports </pre> <p>Una vez instalado, ya podemos ejecutarlo, si estamos usando Apache, así:</p> <pre> $ certbot --apache</pre> <p>Y ya está. Lo juro. El instalador nos hará una serie de preguntas sobre los certificados que queremos instalar y listo. En mi caso tenia un Apache2 con varios VirtualHosts con diferentes nombres de dominio y alias, todos por el puerto 80. El instalador hizo solito todo esto:</p> <ul> <li>Realizo una copia de cada fichero de configuración de VirtualHost, añadiendo -le-ssl.conf al nombre, y configuró en ellos el certificado.</li> <li>En cada VirtualHost original, añadió una redirección automática a su versión de HTTPS</li> <li>Configuró un servicio en Cron <em>/etc/cron.d/certbot</em> para realizar automáticamente la renovación de los certificados.</li> <li>Reinicio el servidor Apache para cargar la nueva configuración.</li> </ul> <p>Si no os hace mucha gracia que os toque la configuración, o tenéis algo realmente chungo montado, también podemos hacer que solamente consiga el certificado, y configurarlo nosotros a mano, así:</p> <pre> $ certbot --apache certonly</pre> <p>En mi caso, añadió las siguientes líneas a mis archivos de VirtualHost originales en el 80:</p> <pre> RewriteEngine on RewriteCond %{SERVER_NAME} =xxxxx.com [OR] RewriteCond %{SERVER_NAME} =www.xxxxx.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </pre> <p>Los nuevos ficheros para SSL que creó Certbot son copias de los que yo tenía, en los que se añade la configuración del certificado:</p> <pre> SSLCertificateFile /etc/letsencrypt/live/xxxxxxx/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/xxxxxxxx/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf</pre> <p>Y este es el archivo que añade al Cron en <em>/etc/cron.d/certbot</em> para automatizar la renovación de los certificados:</p> <pre> # /etc/cron.d/certbot: crontab entries for the certbot package # # Upstream recommends attempting renewal twice a day # # Eventually, this will be an opportunity to validate certificates # haven't been revoked, etc. Renewal will only occur if expiration # is within 30 days. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system &amp;&amp; perl -e 'sleep int(rand(3600))' &amp;&amp; certbot -q renew </pre> <p>Podemos hacer una simulación del proceso de renovación de los certificados con este comando:</p> <pre> certbot renew --dry-run </pre> <p>Esto nos dará una idea de si funcionará o no cuando lo tenga que hacer el solo.</p> <p>De momento, está funcionando perfectamente. Ya veremos cuando llegue la primera renovación...</p> <p> </p> <h2>Referencias</h2> <ul> <li>Proceso de como funciona completo: <a href="https://letsencrypt.org/how-it-works/" target="_blank">https://letsencrypt.org/how-it-works/</a></li> <li>Porque 90 días: <a href="https://letsencrypt.org/2015/11/09/why-90-days.html" target="_blank">https://letsencrypt.org/2015/11/09/why-90-days.html</a></li> <li>Lista de clientes soportados: <a href="https://community.letsencrypt.org/t/list-of-client-implementations/2103" target="_blank">https://community.letsencrypt.org/t/list-of-client-implementations/2103</a></li> <li><a href="https://es.wikipedia.org/wiki/Let%27s_encrypt" target="_blank">Let's Encrypt en Wikipedia</a></li> <li><a href="https://backports.debian.org/Instructions/" target="_blank">​Debian backports</a></li> <li><a href="https://certbot.eff.org/#debianjessie-apache" target="_blank">How to install Certbot</a></li> </ul> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=16&amp;2=comment&amp;3=comment" token="EB6QcaYCufqwNDXs6N9Q8dAWj4FsozjpCPYWAbAx0pc"></drupal-render-placeholder> </section> </div> </article> Mon, 27 Feb 2017 21:03:16 +0000 root 16 at https://www.carloscarrascal.com Problemas con Baloo en KDE4 en Debian Sid https://www.carloscarrascal.com/blog/problemas-con-baloo-en-kde4-en-debian-sid <article data-history-node-id="12" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Problemas con Baloo en KDE4 en Debian Sid </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Lunes, Octubre 19, 2015 - 12:20</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/sid" hreflang="es">Sid</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Con las últimas actualizaciones el indexador de Baloo se esta volviendo loco y se lleva la CPU como un salvaje.</p> <p>Como no se puede desactivar con un servicio o por medio del /etc/init.d, y no quería que siguiese activo, he estado buscando como desactivarlo. Al final lo que he hecho es editar el fichero de configuración</p> <pre> $HOME/.kde/share/config/baloofilerc</pre> <p>y añadir esto:</p> <pre> Indexing-Enabled=false</pre> <p>Después maté el proceso baloo_file_extractor con un kill y se acabó el problema.</p> <p>En <a href="http://ubuntuforums.org/showthread.php?t=2217434">este hilo</a> de los foros de Ubuntu teneis mas info.</p> <p> </p> <p> </p> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=12&amp;2=comment&amp;3=comment" token="gsI_b4s7jeSkQ5EGNx2lBXiItBywcZaYbU-FLbZT6U0"></drupal-render-placeholder> </section> </div> </article> Mon, 19 Oct 2015 10:20:25 +0000 root 12 at https://www.carloscarrascal.com Instalar compilador de less en Debian https://www.carloscarrascal.com/blog/instalar-compilador-de-less-en-debian <article data-history-node-id="14" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Instalar compilador de less en Debian </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Sábado, Octubre 3, 2015 - 01:24</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/less" hreflang="es">less</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Primero vamos a probar la versión rápida y sencilla, que es con el paquete de Debian, que instalamos como <em>root</em>:</p> <pre> # apt-get install node-less</pre> <p>Esto nos instalará el paquete principal de <em>node.js</em> y el compilador de <em>less</em>. Ahora ya podemos probar el compilador, con salida por <em>stdout</em>:</p> <pre> $ lessc styles.less</pre> <p>O con salida a un fichero</p> <pre> $ lessc styles.less &gt; styles.css</pre> <p>Al ser un paquete de Debian, es posible que esta versión no este muy actualizada. En mi caso en el momento de instalarlo la versión que ha traido es esta (en Debian Sid):</p> <pre> $ lessc --version lessc 1.6.3 (LESS Compiler) [JavaScript] </pre> <p>Si queremos tirar de una versión mas actualizada, es mejor instalarlo de otra manera, que es con el gestor de paquetes de <em>node.js</em>: <a href="https://www.npmjs.com/">npm</a>. Para ello, lo instalamos tirando del paquete de Debian:</p> <pre> # apt-get install npm</pre> <p>Y después instalamos <em>less</em> usando <em>npm</em>, con la opción -g para que lo instale global todo el sistema (hacer esto como root):</p> <pre> # npm install -g less</pre> <p>Y comprobamos la versión, mucho mas nueva:</p> <pre> lessc --version lessc 2.5.3 (Less Compiler) [JavaScript]</pre> <p>En mi caso, al instalar con <em>npm</em>, se hace un lío con el ejecutable de node.js, que en unos sitios es <em>node</em> y en otros <em>nodejs</em>, y al ejecutar da errores como este:</p> <pre> lessc /usr/bin/env: node: No existe el fichero o el directorio </pre> <p>Esto tiene fácil solución, creando un enlace dinámico para que lo encuentre (también hay que hacer esto como root):</p> <pre> # ln -s /usr/bin/nodejs /usr/bin/node</pre> <p>Eso es todo. Supongo que la mayoría funcionara también en Ubuntu, pero eso ya os lo dejo a vosotros...</p> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=14&amp;2=comment&amp;3=comment" token="fmIfbiR8nl0e3Twra6AbI8B26q-U9xssL7b2YNbxsOs"></drupal-render-placeholder> </section> </div> </article> Fri, 02 Oct 2015 23:24:29 +0000 root 14 at https://www.carloscarrascal.com Encontrar procesos que causan bloqueos de IO (iowait) https://www.carloscarrascal.com/blog/encontrar-procesos-que-causan-bloqueos-de-io-iowait <article data-history-node-id="9" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Encontrar procesos que causan bloqueos de IO (iowait) </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Viernes, Junio 12, 2015 - 00:21</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><em>IOWait</em> es la medida del tiempo que los procesos de la CPU pasan sin hacer nada, en espera de poder hacer una operación de IO, es decir, leer o escribir en el disco.</p> <p>Generalmente es un indicador claro de un cuello de botella en el sistema, y se produce cuando alguno de los discos (o todos) no dan a basto con operaciones de lectura y/o escritura.</p> <p>Los síntomas suelen ser bastante claros, en forma de bajada general de rendimiento, largas esperas, etc.</p> <p>La forma más sencilla y estándar de comprobar la carga de iowait que tenemos es usar el comando <em>top</em>, que tenemos disponible en cualquier sistema GNU / Linux, y en muchos casos no es necesario ni siquiera tener permisos de root. En la primera parte de la salida del top es donde tenemos esta información en la línea de %Cpu(s), marcada como <em>wa</em>.</p> <pre> top - 20:26:25 up 5 days, 22:50, 3 users, load average: 0,02, 0,31, 0,54 Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie %Cpu(s): 3,3 us, 1,8 sy, 0,0 ni, 94,3 id, 0,7 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 7614832 total, 144824 free, 2784012 used, 4685996 buff/cache KiB Swap: 7815164 total, 7718864 free, 96300 used. 4251800 avail Mem </pre> <p>En este caso, según la salida de top, tenemos 3,3% de procesos de usuario (us), 1,8% un de sistema (sy), 0,0% de procesos de baja prioridad (ni), un 94,3% de CPU sin hacer nada, o en estado idle (id), y solamente un 0,7% de iowait (wa), lo cual está bastante bien. El resto está a cero, y si hacemos la suma sale un 100,1 %. Cosas del redondeo...</p> <p>Para refrescar, según la información de man del comando top...</p> <pre> us: user cpu time (or) % CPU time spent in user space sy: system cpu time (or) % CPU time spent in kernel space ni: user nice cpu time (or) % CPU time spent on low priority processes id: idle cpu time (or) % CPU time spent idle wa: io wait cpu time (or) % CPU time spent in wait (on disk) hi: hardware irq (or) % CPU time spent servicing/handling hardware interrupts si: software irq (or) % CPU time spent servicing/handling software interrupts st: steal time - - % CPU time in involuntary wait by virtual cpu while hypervisor is servicing another processor (or) % CPU time stolen from a virtual machine </pre> <p>Ahora veamos un ejemplo de proceso generando esperas de <em>iowait</em>. Lo que voy a hacer es ejecutar un comando sencillo pero que va a generar muchas operaciones de lectura, en este caso, un simple du para comprobar el espacio usado, pero sobre el raiz del sistema de ficheros:</p> <pre> du -h /</pre> <p>Al ejecutar el comando, los resultados del <em>top</em> ya empiezan a mostrar una subida del iowait.</p> <pre> Tasks: 226 total, 3 running, 223 sleeping, 0 stopped, 0 zombie %Cpu(s): 11,5 us, 6,5 sy, 2,0 ni, 60,8 id, 19,0 wa, 0,0 hi, 0,1 si, 0,0 st KiB Mem : 7614832 total, 52068 free, 3388748 used, 4174016 buff/cache KiB Swap: 7815164 total, 7711876 free, 103288 used. 3580684 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2356 charles 20 0 882788 147036 83488 S 17,6 1,9 0:30.12 chrome 2513 charles 20 0 7076 3156 2384 D 14,6 0,0 0:02.09 du 12156 charles 20 0 564288 62128 43656 S 13,6 0,8 0:36.61 konsole 2442 charles 20 0 623544 182416 134288 S 7,0 2,4 26:52.05 chrome </pre> <p>Aquí podemos ver que el %wa ha subido al 19,0%, con lo que vamos a empezar a notar problemas de rendimiento. En este caso, y solamente usando el comando top, podemos identificar rápidamente el proceso, fijándonos en la columna de estado (S) del top, vemos que hay un proceso <em>du</em> que tiene su estado a D. El estado D significa 'uninterruptible sleep', lo que suele ser indicativo de que el proceso está esperando por una operación de IO.</p> <p>También para refrescar, esta es la lista de estados que muestra el man del comando <em>top</em>.</p> <pre> D = uninterruptible sleep R = running S = sleeping T = stopped by job control signal t = stopped by debugger during trace Z = zombie </pre> <p>Normalmente, los procesos en <em>top</em> estarán en estado S (durmiendo a gusto) o R (corriendo). Si empezamos a ver procesos en D, es señal de que estamos teniendo lo esperas largas de IO.</p> <p>Para sacar algo más de información de que están haciendo nuestros procesos conflictivos, otro comando muy útil y más específico el <em>top</em> es <em>iotop</em>. Ojo, porque este no viene "de serie" en la mayoría de distribuciones, aunque es muy recomendable tenerlo a mano. En Debian, lo tenemos sencillo:</p> <pre> apt-get install iotop</pre> <p>Con <em>iotop</em> tenemos un listado del uso de operaciones de IO por procesos. La primera información que nos muestra son los totales de lectura y escritura del sistema, y después las de cada proceso ordenados por actividad. Y aquí sí que podremos ver de forma muy clara cuáles son los procesos que más recursos están utilizando.</p> <pre> Total DISK READ : 1265.11 K/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 875.85 K/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO&gt; COMMAND 14344 be/4 charles 1265.11 K/s 0.00 B/s 0.00 % 64.06 % du -h / 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H] </pre> <p>Ahora si podemos ver sin duda que el proceso <em>du</em> es el que está leyendo del disco como si no hubiese mañana, y bueno, en este caso la solución es sencilla: podemos matarlo con un <em>kill</em>, con el PID que nos da el <em>iotop</em>.</p> <pre> kill 14344</pre> <p>Si queremos seguir investigando un poco más, podemos usar el comando <em>lsof</em>, que nos va a mostrar un listado de los archivos que está utilizando un proceso, con su PID:</p> <pre> lsof -p 14344</pre> <p>La salida mostrará algo parecido a lo que vemos a continuación, y en muchos casos también nos puede dar pistas de lo que está sucediendo.</p> <pre> COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME du 14883 charles rtd DIR 252,0 4096 2 / du 14883 charles txt REG 252,0 113576 5796815 /usr/bin/du du 14883 charles mem REG 252,0 341146 10477596 /usr/share/locale/es/LC_MESSAGES/coreutils.mo du 14883 charles mem REG 252,0 1729984 13221996 /lib/x86_64-linux-gnu/libc-2.19.so du 14883 charles mem REG 252,0 140928 13221991 /lib/x86_64-linux-gnu/ld-2.19.so du 14883 charles mem REG 252,0 1607632 4309902 /usr/lib/locale/locale-archive du 14883 charles mem REG 252,0 151111 16318536 /usr/share/locale/es/LC_MESSAGES/libc.mo du 14883 charles mem REG 252,0 26258 4322370 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache du 14883 charles 0u CHR 136,1 0t0 4 /dev/pts/1 du 14883 charles 1u CHR 136,1 0t0 4 /dev/pts/1 du 14883 charles 2u CHR 136,1 0t0 4 /dev/pts/1 </pre> <p>Otro comando útil para estos casos es <em>iostat</em>, que nos muestra estadísticas de operaciones de IO sobre los discos. En este caso, no tenemos información de los procesos que las causan, solamente las operaciones globales que se están realizando, y principalmente nos va a permitir descubrir, o confirmar, en cuál de nuestros discos es en el que se están produciendo los bloqueos.</p> <p>Al igual que con <em>iotop</em>, normalmente tendremos que instalarlo a parte. En Debian:</p> <pre> apt-get install iostat</pre> <p>La primera muestra de iostat nos muestra el resumen total desde que levantó la máquina, y en las siguientes iteraciones se muestra la estadística desde el informe anterior, y es donde podremos ver que está pasando.</p> <pre> iostat 2</pre> <p>La salida de <em>iostat</em>, con iteraciones cada 2 segundos:</p> <pre> Linux 4.2.0-1-amd64 (totoro2) 20/10/15 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 2,38 0,32 1,15 2,69 0,00 93,45 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 31,91 84,58 725,86 7867640 67517095 dm-0 37,82 83,47 723,61 7764404 67308108 dm-1 0,64 0,59 2,00 54648 185684 avg-cpu: %user %nice %system %iowait %steal %idle 4,79 0,00 2,52 24,34 0,00 68,35 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 573,50 2304,00 18,00 4608 36 dm-0 580,50 2304,00 18,00 4608 36 dm-1 0,00 0,00 0,00 0 0 avg-cpu: %user %nice %system %iowait %steal %idle 5,51 0,00 2,38 23,53 0,00 68,59 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 197,00 780,00 10,00 1560 20 dm-0 197,00 780,00 10,00 1560 20 dm-1 0,00 0,00 0,00 0 0 </pre> <p>En este caso, vemos que tenemos un iowait de alrededor de un 24%, que se está produciendo en el disco <em>sda</em>. Este comando es muy útil cuando tenemos varios, por ejemplo, y podemos combinar con <em>lsof</em> para indagar más sobre los ficheros que están causando el problema.</p> <p>A partir de aquí, las soluciones dependen del tipo de problema que tengamos entre mano, y eso ya daría no para otro artículo, sino para un libro entero, pero siempre podremos recurrir a nuestro querido <em>kill</em>, al menos para quedarnos agusto.</p> <p>Para ampliar un poco de información, y como fuentes que he utilizado para consulta, recomiendo varias lecturas interesantes, aunque todas en inglés.</p> <p><a href="http://serverfault.com/questions/12679/can-anyone-explain-precisely-what-iowait-is">http://serverfault.com/questions/12679/can-anyone-explain-precisely-wha…</a></p> <p><a href="http://stackoverflow.com/questions/666783/how-to-find-out-which-process-is-consuming-wait-cpu-i-e-i-o-blocked">http://stackoverflow.com/questions/666783/how-to-find-out-which-process…</a></p> <p><a href="http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/">http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/</a></p> <p> </p> </div> </div> <div class="group-footer"> <section> <h2>Comments</h2> <article data-comment-user-id="0" id="comment-1" about="/en/comment/1" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1505613789"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Maria Fargas (no verificado)</span> el Dom, 17/09/2017 - 04:00</span> <span property="schema:dateCreated" content="2017-09-17T02:00:12+00:00" class="hidden"></span> </p> <a href="/en/comment/1#comment-1" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/1#comment-1" class="permalink" rel="bookmark" hreflang="en">IO Wait</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Muchas gracias por este blog.. Me ayudó mucho..</p> <p>Saludos.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=1&amp;1=default&amp;2=en&amp;3=" token="f2l6E3exSxFDxa_4V_oxZaC4lhbUjGxcEMIVDS7iiXI"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-77" about="/en/comment/77" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1565734646"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Angel (no verificado)</span> el Jue, 28/02/2019 - 23:36</span> <span property="schema:dateCreated" content="2019-02-28T22:36:44+00:00" class="hidden"></span> </p> <a href="/en/comment/77#comment-77" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/77#comment-77" class="permalink" rel="bookmark" hreflang="en">buena info, se agradece</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>buena info, se agradece</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=77&amp;1=default&amp;2=en&amp;3=" token="fBZeHvMTZ-hMcEU-2GyaXcKJQN-wkiJ1-4A0Y2WoWH0"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-88" about="/en/comment/88" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1565734598"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Francisco Sánchez (no verificado)</span> el Vie, 12/04/2019 - 13:51</span> <span property="schema:dateCreated" content="2019-04-12T11:51:56+00:00" class="hidden"></span> </p> <a href="/en/comment/88#comment-88" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/88#comment-88" class="permalink" rel="bookmark" hreflang="en">IO Wait</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Muchas gracias por esta entrada, Carlos. Me resultó muy útil</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=88&amp;1=default&amp;2=en&amp;3=" token="yNROpDxHetycA7X96bZ0aaei_TH6OlLk12xsiZxQxwI"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-244" about="/en/comment/244" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1619643910"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Gracias (no verificado)</span> el Dom, 17/05/2020 - 18:17</span> <span property="schema:dateCreated" content="2020-05-17T16:17:52+00:00" class="hidden"></span> </p> <a href="/en/comment/244#comment-244" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/244#comment-244" class="permalink" rel="bookmark" hreflang="en">Util</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Me ha resultado muy util, me estaba volviendo loco.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=244&amp;1=default&amp;2=en&amp;3=" token="eD-S_AZaNj6gnYHVX1mZoAboODL9hfCuk8Y381ywGG0"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-245" about="/en/comment/245" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1619643702"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Gracias (no verificado)</span> el Dom, 17/05/2020 - 18:18</span> <span property="schema:dateCreated" content="2020-05-17T16:18:17+00:00" class="hidden"></span> </p> <a href="/en/comment/245#comment-245" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/245#comment-245" class="permalink" rel="bookmark" hreflang="en">Me ha resultado muy util</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Gracias me estaba volviendo loco</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=245&amp;1=default&amp;2=en&amp;3=" token="kFYKxrJs877MYmVl2h2d9EMQ4Z7OwWWn6_qIe91Rzpc"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-401" about="/en/comment/401" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1619644036"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Elizabeth (no verificado)</span> el Mar, 04/08/2020 - 14:11</span> <span property="schema:dateCreated" content="2020-08-04T12:11:52+00:00" class="hidden"></span> </p> <a href="/en/comment/401#comment-401" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/401#comment-401" class="permalink" rel="bookmark" hreflang="en">Artículo IO</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Hola, quiero agradecerte por este blog y este artículo, lo explicas de una manera sencilla y muy fácil de entender.</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=401&amp;1=default&amp;2=en&amp;3=" token="TyKpyKFb6UbOHCwcl1jBaUwheVDtJ9Ld7fr39ZcVknI"></drupal-render-placeholder> </div> </article> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=9&amp;2=comment&amp;3=comment" token="1g0_Z49MsJ1d2YR9jPRW7ku1mahA70BrmRzz7aT_CCI"></drupal-render-placeholder> </section> </div> </article> Thu, 11 Jun 2015 22:21:19 +0000 root 9 at https://www.carloscarrascal.com