<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Manu Pijierro on Medium]]></title>
        <description><![CDATA[Stories by Manu Pijierro on Medium]]></description>
        <link>https://medium.com/@mpijierro?source=rss-b20eed4a4d21------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*WyCt1lpvvb2-IW4B7g6nMQ.png</url>
            <title>Stories by Manu Pijierro on Medium</title>
            <link>https://medium.com/@mpijierro?source=rss-b20eed4a4d21------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 07:48:50 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@mpijierro/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[#Fixed 11: Solucionado error redondeo cnúmeros en PHP]]></title>
            <link>https://mpijierro.medium.com/fixed-11-solucionado-error-redondeo-cn%C3%BAmeros-en-php-219937eb1fdc?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/219937eb1fdc</guid>
            <category><![CDATA[deveopment]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[fix]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Thu, 25 Jul 2024 16:21:34 GMT</pubDate>
            <atom:updated>2024-07-25T16:21:34.086Z</atom:updated>
            <content:encoded><![CDATA[<h3>#Fixed 11: Solucionado error redondeo con números en PHP</h3><p>Vengo hoy aquí, después de mucho tiempo, a dejar anotado el error y la solución (al menos la que he encontrado) para un problema de redondeo de números enteros y decimales que ocurre en PHP.</p><p>El problema es de esos que te vuelven un poco loco, de esos que ocurren unas veces sí y otras no. Antes de nada, decir que ya me ocurrió con la versión 7.4 de PHP y ahora me ha ocurrido con la versión 8.2.</p><p><strong>El error </strong>me ha ocurrido en una aplicación al realizar una operación sencilla: 1.13 *100. El resultado que debiéramos obtener es bastante obvio: 113. Pues no, en PHP los números que tienen una representación finita en base 10 pueden no tener una representación exacta en representación decimal por lo que en este caso el resultado es un “pelín” distinto.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/255/1*NYL_5L8f-StwMJgxC2RuKQ.png" /><figcaption>Resultado de la multiplicación.</figcaption></figure><p>Efectivamente, el resultado no se representa correctamente ya que nos da un 112.99999999999998579. ¿Qué problema puede ocasionarnos esto? pues que si aplicamos un <em>casting</em> a enteros con (int) el resultado obtenido tenemos:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/232/1*bwlkVSnROG-P1NKRbAVDig.png" /><figcaption>Aplicado casting (aparece con decimales por el formato de impresión aplicado)</figcaption></figure><p>Es decir, donde deberíamos tener un 113 ahora tenemos un 112. Fail total y absoluto.</p><p><strong>Solución</strong>: Pues después de buscar por internet (he perdido la página donde encontré realmente la solución) resulta que podemos hacer uso de la función <a href="https://www.php.net/manual/es/function.bcmul.php"><strong><em>bcmul</em></strong></a> de forma que si lo aplicamos en este ejemplo de la siguiente forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/329/1*dTesGQb8Y_-DTjOQ6aleVg.png" /></figure><p>Tenemos el resultado correcto:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/231/1*VmMOPbetqGTMK83xHF7K4w.png" /></figure><p>Otro ejemplo con el que obtenemos un error es con la operación: (3*5)+21%. El resultado correcto de la operación es 18,15 pero si no aplicamos <strong><em>bcmul</em></strong> PHP nos retorna 18,14, más concretamente 18.14999999999999858. Si aplicamos <strong><em>bcmul</em></strong> de forma correcta como he indicado más arriba obtenemos los 18,15 finales que deben ser.</p><p>Así que, aunque solo sea para mi mismo, dejo anotado el error y la solución en este artículo porque seguramente en un futuro vuelva por aquí a consultarlo.</p><p>Eso es todo, cualquier comentario, sugerencia o corrección es bienvenida.</p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=219937eb1fdc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[La paciencia como valor personal en el desarrollo de software.]]></title>
            <link>https://mpijierro.medium.com/la-paciencia-como-valor-personal-en-el-desarrollo-de-software-86af466ca991?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/86af466ca991</guid>
            <category><![CDATA[habilidades]]></category>
            <category><![CDATA[skills]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Sun, 13 Feb 2022 11:08:46 GMT</pubDate>
            <atom:updated>2022-02-13T11:08:46.239Z</atom:updated>
            <content:encoded><![CDATA[<p>La paciencia, como valor personal, no está de moda. En esta sociedad <em>hiperactiva</em> que venimos construyendo desde hace unos años, la paciencia es una cualidad humana que poco a poco ha ido saliendo de nuestras vidas convirtiéndose en un valor que ha pasado a un segundo plano, relegada al cajón de las cosas que la sociedad actual infravalora. Casi todo lo que gira a nuestro alrededor es instantáneo, necesitamos y exigimos que así sea. Cada vez precisamos más velocidad para todo, para lo personal y para lo profesional, hacer las cosas más rápido y que otros, a su vez, las hagan más rápido todavía. Vivimos la vida con el <em>turbo</em> puesto<em>, </em>impacientes por terminar cuanto antes la siguiente tarea del <em>checklist</em> de asuntos infinitos que siempre tenemos pendientes de finalizar. Sea lo que sea, que sea rápido. Impacientes por comenzar y a continuación impacientes por terminar. Impacientes por vivir el futuro sin pararnos a reflexionar con la paciencia y serenidad suficientes el presente que día a día vivimos y que olvidamos de disfrutar.</p><p>La consecuencia principal de la impaciencia generada por esa velocidad de nuestras vidas hace que, en general, no tengamos en cuenta los detalles ni el contexto de la realidad y suelen ser estos detalles, casi siempre, los que contienen lo más importante y la esencia de todo lo que nos rodea. Recuerda que, la paciencia te lleva a la esencia de las cosas y esa esencia te lleva a la verdad.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h89Sm-O0PGOfa-VU-VG0Ig.jpeg" /><figcaption>Pocas cosas requieren más paciencia en esta vida que cultivar un bonsai.</figcaption></figure><h3>Paciencia pensando problemas y soluciones</h3><p>El consejo del carpintero: “Mide dos veces, corta una”. Se paciente a la hora de seleccionar una solución para un problema y que las prisas no te lleven a dar por buena la primera que venga a tu cabeza. Hay excepciones, por supuesto, problemas sencillos o problemas para los que experiencias similares ya te han dotado de una capacidad suficiente para tomar decisiones de una forma más acelerada. Pero, en general, resolver un problema medianamente complejo te llevará un tiempo hasta que logres entenderlo lo suficientemente bien como para extraer el contexto necesario que te lleve a la mejor solución. Habrás de comprender el problema desde el punto de vista del cliente o del negocio, sus necesidades y sus objetivos y también, por supuesto, desde el punto de vista tecnológico para saber como implementar la mejor solución posible.</p><p>Piénsalo bien, ¿cuántas veces te ha ocurrido que la primera solución que aplicaste a un problema luego resultó no ser tan buena? ¿cuántas veces elegimos mal la tecnología, el <em>framework o </em>el algoritmo?…y lo que es peor, ¿cuál es el coste económico y de recursos de esa mala decisión por no haber tenido la paciencia suficiente para estudiar el par <em>problema-solución</em> de la forma necesaria?</p><p>Supongo que la presión diaria de entregar el trabajo pendiente, ‘<em>deadlines</em>’ y compromisos difíciles de asumir hacen que tener la paciencia y serenidad necesarias para comprender problemas y crear soluciones sea complicado. Pero en la medida de lo posible, no debemos permitir que esa presión nos genere una impaciencia contraproducente para nuestros objetivos y los del proyecto.</p><h3>Paciencia en el entorno laboral</h3><p>La paciencia en el entorno laboral es un valor personal clave para crear un ambiente de trabajo positivo y productivo. Las relaciones diarias entre personas suelen generar desavenencias que únicamente con las dosis adecuadas de paciencia y empatía se pueden superar sin menoscabar las relaciones personales del grupo.</p><p>El impaciente suele trazar planes en su cabeza sobre como deberían desarrollarse los acontecimientos a su alrededor y cuando estos no se cumplen sus expectativas se frustran y comienza a repartir culpas y responsabilidades generando entre los compañeros, en muchas ocasiones, presiones innecesarias debidas únicamente a su impaciencia y la mala gestión de las emociones que conllevan, especialmente la ira. Además, el impaciente suele simplificar los problemas para intentar llegar cuanto antes a la meta pero, en general, esa simplificación es errónea ya que precisamente no ha sabido o no ha querido dedicar el tiempo suficiente para definir el mejor modo de llegar a la solución. El impaciente se frustra y puede llegar a generar un ambiente de trabajo tóxico exigiendo tiempos y trabajos alejados de la realidad.</p><p>Por el contrario, ser pacientes ayudará a saber diferenciar lo evitable de lo inevitable y nos hará más fácil vislumbrar los problemas importantes de los no importantes. Ser pacientes, además, mejorará la comunicación con otras personas permitiendo relaciones personales más agradables. Ser pacientes no implica aceptar todo y tener capacidad de sufrimiento infinitas, ser pacientes implica tener pensamientos más racionales con el fin de conocer lo que debe ser aceptado y lo que no y, además, para saber dónde puedes poner un límite dentro de las relaciones personales. Ser pacientes no trata de ser pasivos, trata de saber cuál es el mejor momento para actuar, de forma responsable evitando que las situaciones nos puedan llegar a generar ansiedad.</p><h3>Aprender requiere ser paciente</h3><p>La formación y el proceso del aprendizaje es otro punto en el que la paciencia es un valor clave para poder avanzar y afianzar conocimientos que nos aporten una buena base teórica que llevar a la práctica. Ser capaz de centrarnos y permanecer el tiempo necesario en un curso, un libro, un <em>podcast</em>, un simple ejercicio práctico…etc., para interiorizarlo de tal forma que seamos capaces de aplicarlo en problemas/soluciones de la ‘<em>vida real</em>’.</p><p>El camino de la formación para alguien que se dedique al desarrollo del software puede ser cansado y estresante si no se mantiene la calma necesaria para diferenciar lo básico y lo importante de lo efímero y la moda tecnológica del momento. Si nos dejamos llevar, si no somos pacientes, iremos pasando de puntillas por materias y conocimientos sin afianzar y sin profundizar en cada uno de ellos, lo cual hará que no podamos asimilarlos para poder aplicarlos en un futuro. Solo leer no te hace aprender. Para aprender hay que dedicar tiempo suficiente y dedicar tiempo suficiente a cualquier tema implica de forma explícita ser paciente.</p><h4>Paciencia con los que están aprendiendo</h4><p>Si debemos ser pacientes con nosotros mismos cuando se trata de aprender, habrá que poner especial cuidado y atención cuando sean terceras personas las que están aprendiendo, más aún cuando su aprendizaje dependa directamente de nosotros. Habrá que ser pacientes para facilitar el tiempo y las explicaciones necesarias de forma que interioricen los conocimientos de forma sólida y persistente. Esto, no solo será bueno para ellos sino que con toda seguridad estaremos ‘<em>sembrando</em>’ en esas personas la semilla de la paciencia para que en el futuro sean ellos los pacientes cuando tengan que enseñar a la siguiente generación.</p><p>Por el contrario, ser impacientes con alguien que está aprendiendo solo le provocará ansiedad, tensión y frustración lo que a la larga es más que probable que le genere un rechazo hacia las materias o conocimientos que necesita aprender.</p><p>La <strong>paciencia</strong> que debemos mostrar debe partir de la <strong>humildad</strong> de reconocer que hubo un tiempo pasado en el que fuimos nosotros los que no teníamos el conocimiento necesario para realizar una tarea de la mejor forma posible. Reconocer nuestras propias limitaciones y debilidades nos hará ser más pacientes con las limitaciones y debilidades de los demás.</p><p>Muchas gracias por tener la paciencia de leer hasta el final :)</p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=86af466ca991" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#Fixed 10: Configurar el idioma de PHP en español en Ubuntu]]></title>
            <link>https://mpijierro.medium.com/fixed-10-configurar-el-idioma-de-php-en-espa%C3%B1ol-en-ubuntu-366a666cf7d2?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/366a666cf7d2</guid>
            <category><![CDATA[language]]></category>
            <category><![CDATA[idiomas]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[ubuntu]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Tue, 06 Apr 2021 14:18:29 GMT</pubDate>
            <atom:updated>2021-04-06T14:18:29.359Z</atom:updated>
            <content:encoded><![CDATA[<p>En una instalación nueva que tuve que hacer en un servidor con <strong>Ubuntu</strong> me encontré con que el nombre de los meses y días de las semana (entre otras cosas) en <strong>PHP</strong> aparecían en inglés.</p><p>En el código tenía configurado el idioma de la siguiente manera pero esto por sí solo no llegaba a funcionar.</p><pre>setlocale(LC_ALL, &#39;es_ES&#39;);</pre><p>Así que lo que hice fue lo siguiente:</p><h4>Configurar idiomas del sistema</h4><p>En primer lugar configuraremos los idiomas disponibles en el sistema y el idioma por defecto del mismo. Esto lo haremos mediante el comando <strong>dpkg-reconfigure locales</strong>. Al ejecutarlo, aparece una aplicación que te guía paso a paso por la configuración.</p><ul><li>En primer lugar seleccionas los idiomas que quieres instalar</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2YF_Uc4crDML0VCoJ_L5HA.png" /></figure><ul><li>En segundo lugar seleccionas el idioma que quieres por defecto en el entorno del sistema.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XMzxEaGAXTmauZT4hnnGLg.png" /></figure><p>Una vez terminada la selección, la información que aparece por consola nos va indicando el proceso de generación de los idiomas.</p><pre>root@vmixxxxx:~# <strong>dpkg-reconfigure locales</strong><br>Generating locales (this might take a while)...<br>  en_AG.UTF-8... done<br>  en_AU.UTF-8... done<br>  en_BW.UTF-8... done<br>  en_CA.UTF-8... done<br>  en_DK.UTF-8... done<br>  en_GB.UTF-8... done<br>  en_HK.UTF-8... done<br>  en_IE.UTF-8... done<br>  en_IL.UTF-8... done<br>  en_IN.UTF-8... done<br>  en_NG.UTF-8... done<br>  en_NZ.UTF-8... done<br>  en_PH.UTF-8... done<br>  en_SG.UTF-8... done<br>  en_US.UTF-8... done<br>  en_ZA.UTF-8... done<br>  en_ZM.UTF-8... done<br>  en_ZW.UTF-8... done<br>  es_ES.UTF-8... done<br>Generation complete.</pre><h4>Reiniciar Apache</h4><p>En mi caso tuve que reiniciar <strong>Apache</strong> para que los cambios tuvieran efecto sobre <strong>PHP</strong>.</p><pre>~#<strong>sudo service apache2 restart</strong></pre><p><strong>Configurar aplicación PHP</strong></p><p>Después de hacer varias pruebas, conseguí que los meses y los días de la semana aparecieran en español añadiendo al principio del código lo siguiente:</p><pre><strong>setlocale(LC_ALL, &#39;es_ES.UTF-8&#39;);</strong></pre><p>Estoy seguro que debe haber alguna configuración u opción global de hacer que funcione en todo el sistema y en todos los proyectos <strong>PHP</strong> instalados en el servidor pero, la verdad, ahora mismo no tengo tiempo de mirarlo 😐</p><p>Si sabes como hacerlo, <strong>por favor</strong>, deja un comentario indicando el proceso y lo añado al artículo. Muchas gracias por adelantado :)</p><p>Eso es todo, cualquier comentario, sugerencia o corrección es bienvenida.</p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=366a666cf7d2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Integrar el API de Telegram con PHP]]></title>
            <link>https://mpijierro.medium.com/integrar-el-api-de-telegram-con-php-ef0a62093e48?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/ef0a62093e48</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[telegram]]></category>
            <category><![CDATA[laravel]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Fri, 02 Apr 2021 10:05:42 GMT</pubDate>
            <atom:updated>2021-04-05T09:59:41.620Z</atom:updated>
            <content:encoded><![CDATA[<p>Hoy voy a contar mi experiencia integrando el API de <a href="https://telegram.org/"><strong><em>Telegram</em></strong></a> con una aplicación <strong>PHP</strong> real de uno de mis clientes, los problemas que teníamos y como la integración con <a href="https://telegram.org/"><strong>Telegram</strong></a> nos ayudó a solucionarlos. Esta integración la realizaremos a través de la librería <a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*JMSR5coclcQ6CjJH4sce7w.jpeg" /></figure><p>Antes de comenzar, unas aclaraciones.</p><ul><li>1) Cuando hablo del <a href="https://core.telegram.org/api">API de Telegram</a> no me estoy refiriendo a la creación de Bot’s, sino al uso del API ‘<em>real</em>’ que ofrece y que te da la oportunidad de crear tu propio cliente de mensajería.</li><li>2) El objetivo de este artículo es intentar ofrecer al menos un punto de partida inicial para saber más o menos cómo empezar a usar el API de <strong>Telegram</strong> con <strong>PHP</strong>. Lo que se suele conocer como ‘<em>saber por dónde van los tiros</em>’…o el post que a mi me hubiera gustado leer cuando empecé.</li><li>3) Por lo tanto…‘<em>disclaimer</em>’: lo que vas a leer a continuación es parte de mi experiencia con este API. Aún hay partes (muchas) que desconozco y a día de hoy todavía sigo aprendiendo y pegándome (mucho…muchísimo) con él para seguir integrando parte de la aplicación <strong>PHP</strong>.</li></ul><h3>¿Para qué usar el API de Telegram? Problema a resolver</h3><h4>Contexto inicial</h4><p>Uno de los clientes para los que trabajo desde hace años como profesional autónomo es una academia de formación que prepara oposiciones, principalmente de Educación. Actualmente, estudian en ella algo más de 600 alumnos divididos en 65 grupos. Por un lado, antes de la integración con <strong>Telegram</strong>, la forma natural de comunicarse con los alumnos y los grupos era vía <strong>Whatsapp</strong>. Por otro lado, llevo desarrollándoles desde hace más de cinco años una aplicación <strong>PHP</strong> (<a href="https://laravel.com/"><strong>Laravel</strong></a>) con la que prácticamente gestionan todo el negocio: alumnos, grupos, profesores, clases, exámenes, documentación, facturación, contabilidad, mensajería interna, calendarios…etc, etc.</p><h4>Problema</h4><p>La tarea de comunicación a través de <strong>Whatsapp</strong> era totalmente manual y resultaba muy tediosa, complicada y daba lugar a muchos errores. Imaginad tener que crear y/o gestionar casi de forma manual cientos y cientos de contactos, crear los grupos, meter a cada contacto en cada grupo…y luego, conforme pasa el curso, eliminar a los que se dan de baja, gestionar los cambios de grupo, nuevas altas, envíos de mensajes a los alumnos casi personalizados…etc., y esto, además, con cada nuevo curso académico. En definitiva, se dedicaba muchísimo tiempo en la gestión de las comunicaciones con sus alumnos tanto que, podríamos decir, había una persona dedicada casi en exclusiva a esta tarea.</p><h3>Misión</h3><p>La misión era simple, que no sencilla. Se trataba de poder gestionar y automatizar toda la comunicación con los grupos y alumnos de forma directa y transparente desde la aplicación <strong>PHP</strong> a través de una aplicación móvil de mensajería (la que fuera). Dicha automatización debería incluir, por ejemplo:</p><ul><li>Grupo nuevo en <strong>PHP</strong> -&gt; canal de difusión privado nuevo en app mensajería.</li><li>Alumno nuevo en <strong>PHP</strong> -&gt; contacto nuevo en app mensajería.</li><li>Alumno entra en un grupo -&gt; contacto entra al canal privado del grupo.</li><li>Alumno sale de un grupo -&gt; contacto sale del canal privado del grupo.</li><li>Alumno cambia de grupo -&gt; contacto sale del canal privado del primer grupo y entra al segundo.</li><li>…etc, etc.</li></ul><p>En resumen, toda la gestión de contactos y de grupos/canales, envío de mensajes de texto, envío de mensajes con archivos adjuntos, lectura de los mismos, notificaciones…etc., todo, se debería poder hacer desde la aplicación <strong>PHP</strong>.</p><h3>Búsqueda de soluciones</h3><h4>Whatsapp</h4><p>Al ser <strong>Whatsapp</strong> la aplicación de mensajería que se estaba utilizando en la academia fue la primera que valoramos. A ver, es cierto que <strong>Whatsapp</strong> tiene un <a href="https://developers.facebook.com/docs/whatsapp/?locale=es_ES">API</a> para desarrolladores pero <strong>no es abierto</strong>. Tienes que solicitar permiso para usarlo (lo hicimos en su día) y ni nos contestaron. <strong>Whatsapp</strong> tiene sus <em>partners</em> y son empresas muy potentes y son con ellos con los que tienes que ‘negociar’ y ni si quiera en el caso de llegar a un acuerdo te dan acceso completo al API. <strong>Whatsapp</strong>, de forma sencilla pero totalmente insuficiente para nuestro objetivo permite el envío de mensajes de texto simples.</p><h4>Otras aplicaciones de mensajería</h4><p>Valoramos las posibilidades de usar otras aplicaciones como <a href="https://developers.line.biz/en/"><strong>Line</strong></a> pero las descartamos también por el bajo uso de esta aplicación en nuestro país y por el API que proporcionaban que, honestamente, por algún motivo que no recuerdo descartamos en su momento.</p><h4>Aplicación propia</h4><p>Contactamos con un desarrollador que tenía experiencia en este tipo de aplicaciones de mensajería con academias de formación. Nos comentó que por un lado tenían cierto grado de complejidad y, además, su experiencia fue ‘mala’ porque los alumnos no se instalaban estas aplicaciones, no les generaban mucha confianza, deshabilitaban notificaciones…etc. Así que la descartamos</p><h4>Telegram</h4><p><strong>Telegram</strong>, no sólo cumple con todas nuestras necesidades de comunicación, sino que además tiene muchísimas más posibilidades de integración gracias a su <a href="https://core.telegram.org/api#getting-started"><strong>API</strong></a> totalmente abierta. Tal es así que, si quisieras, podrías programarte tu propio cliente de mensajería completo usando su infraestructura. Una maravilla, la verdad. Además, su uso está relativamente extendido, es conocida y el funcionamiento básico es similar a <strong>Whatsapp</strong>.</p><p>Como comenté, no se trata de usar los <a href="https://core.telegram.org/bots">Bots de <strong>Telegram</strong></a> ya que estos ofrecen una funcionalidad útil, aunque limitada, para unos casos que no resolvían nuestros problemas. Usar el <a href="https://core.telegram.org/api">API</a> directamente es bastante más avanzado, potente…y complicado, la verdad. Ya aviso, e insisto, al menos para mi, ha sido y está complicado integrar dicho API con la aplicación PHP y sobre todo entender (a nivel de programación) como funciona <strong>Telegram</strong> y el flujo que usa en sus operaciones.</p><h3>Primeros pasos</h3><h4>Crear aplicación en Telegram</h4><p>Lo primero de todo, claro está, es tener una cuenta de <strong>Telegram</strong> y para ello nos descargaremos la aplicación en un teléfono.</p><p>Después iniciaremos sesión como desarrolladores a través del siguiente enlace <a href="https://my.telegram.org/auth">https://my.telegram.org/auth</a>. El acceso será mediante un número de teléfono con <strong>Telegram</strong> al que llegará un código de inicio de sesión.</p><p>Después haremos <em>click</em> en el enlace <a href="https://my.telegram.org/apps">API development tools</a> y crearemos nuestra aplicación. Los datos que tendremos de la misma serán el ‘<em>api_id</em>’, el ‘<em>api_hash</em>’, ‘<em>title</em>’ y ‘short <em>name</em>’.</p><p><strong>Instalar MadelineProto</strong></p><p>Para integrarnos con el API de <strong>Telegram</strong> necesitamos implementar su protocolo de comunicación segura llamado <a href="https://core.telegram.org/mtproto"><strong>MTProto</strong></a>. Por fortuna, salvo que queramos hacerlo y probablemente morir en el intento, no tenemos que implementar dicho protocolo desde cero en nuestra aplicación ya que hay una librería para <strong>PHP</strong> que ya lo hace. Esta librería se llama <a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a> y es básicamente otro API que hace transparente (o casi) la comunicación de nuestra aplicación <strong>PHP</strong> con <strong>Telegram</strong>. <a href="https://docs.madelineproto.xyz/docs/FEATURES.html">Una maravilla, la verdad</a>. Tiene una <a href="https://docs.madelineproto.xyz/"><strong>documentación</strong></a> bastante buena, el <a href="https://github.com/danog/MadelineProto">proyecto está actualizado</a> e incluso tienen un <a href="https://t.me/PHPChatCo">canal en Telegram</a> en el que se resuelven muchas dudas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*nh_Nlq56qrWhU3sp7SksqQ.png" /></figure><p>Antes de instalarlo, echa un vistazo a sus <a href="https://docs.madelineproto.xyz/docs/REQUIREMENTS.html">requerimientos</a>. Una vez cumplidos, para instalar <a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a> en nuestro proyecto <strong>PHP</strong> con <strong>composer</strong> basta ejecutar el siguiente comando:</p><pre>composer require danog/madelineproto</pre><p>Recomiendo encarecidamente la lectura de su documentación para conocer como utilizarla porque tampoco es que sea sencilla. A partir de aquí voy a suponer que le has echado un vistazo y que sabes más o menos como funciona o al menos te suena.</p><h4>Nota</h4><p>En mi caso tengo integrado <a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a> en un proyecto con <strong>Laravel</strong>, lo digo por todo el código que sigue a continuación en el artículo. Habrá cosas específicas de <strong>Laravel</strong> pero bueno, en el fondo, esto sería lo de menos.</p><h3>Iniciar sesión en Telegram con PHP y MadelineProto</h3><p>Una vez instalado <a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a>, supongamos que tenemos nuestra aplicación <strong>PHP</strong> y una ruta hacia un código similar al siguiente con el cual podremos iniciar sesión en <strong>Telegram</strong>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8fc6603532b55d2409de94bb96b307c5/href">https://medium.com/media/8fc6603532b55d2409de94bb96b307c5/href</a></iframe><p>Al ejecutar el código nos saldrá un ‘<em>wizard</em>’ que nos guiará paso a paso en el proceso. Debería ser algo similar a lo que sigue:</p><ul><li><strong>Paso 1</strong>: En primer lugar deberemos indicar <em>api_id</em> y el api_hash que obtuvimos al crear la aplicación. Podemos hacerlo de forma manual o automática. Si elegimos ‘<em>Automatically</em>’, únicamente tendremos que poner el número de teléfono con el que creamos la aplicación…así que esta será nuestra opción:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/547/1*b_3cUoBGDTYi7XFv7g68DQ.png" /></figure><ul><li><strong>Paso 2</strong>: Indicamos el número de teléfono con el que creamos la aplicación.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/599/1*QRkPSv_8nz2hsgXiBJpn7Q.png" /></figure><ul><li>Paso 3: Nos llegará un mensaje de aviso a nuestro Telegram con un código de inicio de sesión</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/445/1*VXucGzVfdu-tsxQnLiMWNg.png" /></figure><ul><li><strong>Paso 4</strong>: Introduciremos el código recibido.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/343/1*xuLpoOcxgfY9FJfDAE8sKw.png" /></figure><ul><li><strong>Paso 5</strong>: A continuación nos preguntará si queremos iniciar sesión como ‘<em>user</em>’ o como ‘<em>bot</em>’. En nuestro caso, como ‘<em>User</em>’.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/352/1*YEWkrY6B3oF4rb5D2bfTWA.png" /></figure><ul><li><strong>Paso 6</strong>: Volvemos a introducir el número de teléfono.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/276/1*Pw750xl1ZAzRbuoR8aU5iw.png" /></figure><ul><li><strong>Paso 7</strong>: Y recibiremos ahora otro mensaje con el código de inicio de sesión.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/1*FWp_k0tfuNuGNC9Swpw5jA.png" /></figure><ul><li><strong>Paso 8</strong>: A continuación indicamos el código recibido</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/290/1*pfMf7yGtciPrjczk_eZcSg.png" /></figure><ul><li><strong>Paso 9</strong>: …y si todo ha ido bien, veremos que en la carpeta de nuestro proyecto tenemos creados los archivos de sesión de <strong>MadelineProto</strong>.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/538/1*PU3IlxUlgj74V0rx25dkMg.png" /></figure><h3>Primera solicitud al API de Telegram con PHP</h3><p>La primera petición que podemos hacer, por ejemplo, para probar el correcto de la conexión con <strong>Telegram</strong> es solicitar nuestros datos. Para este cometido vamos a utilizar la funcion <a href="https://docs.madelineproto.xyz/getSelf.html"><strong><em>getSelf</em></strong></a><em>()</em>. El código es el siguiente:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/47025bcd6d51523f21fcbbb35aa93d59/href">https://medium.com/media/47025bcd6d51523f21fcbbb35aa93d59/href</a></iframe><p>Este va a ser el formato general de uso del API de <strong>Telegram</strong>. Instanciar <strong>MadelineProto</strong>, configurar la petición y procesar la respuesta.</p><p><strong>MadelineProto</strong> puede configurarse de forma que las peticiones se realicen de <a href="https://docs.madelineproto.xyz/docs/ASYNC.html">forma asíncrona</a> lo cual mejora el rendimiento y el procesamiento de peticiones en paralelo. Al instanciar <strong>MadelineProto</strong> podemos pasar un <em>array</em> de configuración. Existen decenas de configuraciones distintas para que cada uno use el API de la forma que más le convenga. Los distintos valores de configuración <a href="https://docs.madelineproto.xyz/docs/SETTINGS.html">están descritos en esta página.</a> Probablemente te habrá llamado la atención el uso de la palabra reservada <a href="https://www.php.net/manual/es/language.generators.overview.php"><strong><em>yield</em></strong></a>, te recomiendo leer la <a href="https://www.php.net/manual/es/language.generators.syntax.php">documentación oficial sobre generadores en PHP</a>.</p><p>La respuesta que nos retorna esta llamada es la siguiente:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/377/1*RvwCfIv_CkowV-vidnuyZA.png" /></figure><p>Como podemos observar, contiene toda la información referente a mi perfil. La inmensa mayoría de respuestas de peticiones al API son en formato <em>json</em> y contienen gran cantidad de información.</p><h3>Otras llamadas al API de Telegram desde PHP</h3><p>A continuación, indicaré de forma resumida algunos ejemplos de otros tipos de peticiones que he conseguido realizar para implementar una gestión más completa de la comunicación con <strong>Telegram</strong>. Teniendo en cuenta el código anterior los ejemplos irían dentro de la llamada al método <em>loop</em>:</p><pre>return $this-&gt;madelineProto-&gt;loop(function () { <br>     ...<br>     ejemplos de código<br>     ...<br>});</pre><h4>Crear un canal</h4><p>Crear un canal en <strong>Telegram</strong> es sencillo. Basta con indicar un título y la descripción del mismo al utilizar el método <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.createChannel.html"><strong><em>createChannel</em></strong></a>. También podríamos especificar otra configuración como crear un supergrupo, la geolocalización…etc.</p><pre>$response = yield $this-&gt;madelineProto-&gt;channels-&gt;<strong>createChannel</strong>([<br>    &#39;title&#39; =&gt; &#39;título del canal&#39;,<br>    &#39;about&#39; =&gt; &#39;texto con alguna descripción&#39;<br>]);</pre><p>En la respuesta, <strong>Telegram</strong> nos retorna muchos datos, para mi el dato más importante en el <em>channel_id</em> que es el que me guardo para usar más tarde en otras operaciones con el canal creado.</p><h4>Invitar a participantes a un canal</h4><p>Usaremos la función <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.inviteToChannel.html"><strong><em>inviteToChannel</em></strong></a>. Aunque la llamada sea sencilla, en función de nuestras necesidades la podemos complicar un poco. La definición de la llamada es como sigue:</p><pre>$response <strong>=</strong> yield $this-&gt;madelineProto<strong>-&gt;</strong>channels<strong>-&gt;inviteToChannel</strong>( [&#39;channel&#39; <strong>=&gt;</strong> <strong>InputChannel</strong>, &#39;users&#39; <strong>=&gt;</strong> [<strong>InputUser</strong>, <strong>InputUser</strong>], ]);</pre><p>Debemos especificar el canal y un <em>array</em> de participantes a incluir. La especificación del canal se puede hacer de múltiples formas tal y como indica la documentación de <a href="https://docs.madelineproto.xyz/API_docs/types/InputChannel.html"><strong><em>InputChannel</em></strong></a>. En nuestro caso la forma más sencilla sería especificarlo de la forma ‘<em>channel#ID</em>’ siendo ID el valor que nos hubiera devuelto, por ejemplo, la llamada a crear un canal en el anterior ejemplo.</p><p>De forma similar, los participantes tienen que estar especificados según el tipo <a href="https://docs.madelineproto.xyz/API_docs/types/InputUser.html"><strong><em>InputUser</em></strong></a>. Aquí nos podríamos encontrar con dos variantes:</p><ul><li>La primera es que fueran contactos conocidos y ya hubiéramos obtenido anteriormente sus ‘<em>userId</em>’ de <strong>Telegram</strong> en alguna otra operación. En este caso no tendríamos más que especificar un array de usuarios del tipo ‘<em>user#ID</em>’, de la forma:</li></ul><pre>$inputUsers = [&#39;user#123&#39;, &#39;user#456&#39;, &#39;user#789&#39;, ...]</pre><ul><li>La segunda es que sean contactos ‘anónimos’, es decir, no los tengamos aún en nuestra ‘agenda’ y desde <strong>Telegram</strong> no hubiéramos interactuado nunca con ellos. En este caso tendremos que importarlos previamente usando la llamada a <a href="https://docs.madelineproto.xyz/API_docs/methods/contacts.importContacts.html"><strong><em>importContacts</em></strong></a>. Para esto, deberíamos hacer algo parecido a lo siguiente:</li></ul><pre><strong>//supongamos que hemos recibido una petición POST la siguiente información:</strong><br>$_POST[&#39;channel_id&#39;] = 123456;<br>$_POST[&#39;participants = [<br> [&#39;phone&#39;=&gt;&#39;6123&#39;,&#39;first_name&#39;=&gt;&#39;Manu&#39;,&#39;second_name&#39;=&gt;&#39;Pijierro&#39;<br> [&#39;phone&#39;=&gt;&#39;6456&#39;,&#39;first_name&#39;=&gt;&#39;Leo&#39;,&#39;second_name&#39;=&gt;&#39;Messi&#39;],<br> [&#39;phone&#39;=&gt;&#39;6789&#39;,&#39;first_name&#39;=&gt;&#39;Cris&#39;,&#39;second_name&#39;=&gt;&#39;Ronaldo&#39;],<br>];</pre><pre><strong>//obtenemos nuestro propio ID</strong><br>$me = yield $this-&gt;madelineProto-&gt;<strong>getSelf</strong>();</pre><pre><strong>//configuramos la identificación del canal al que vamos a invitar</strong><br>$channelKey = &#39;channel#&#39;.$_POST[&#39;channel_id&#39;];</pre><pre><strong>//configuramos el array para la llamada a importContacts</strong><br>$inputContacts = [];<br>foreach ($POST[&#39;participants] as $participant){<br>    $inputContacts[] = [<br>        &#39;_&#39;           =&gt; &#39;inputPhoneContact&#39;,<br>        &#39;client_id&#39;   =&gt; $me[&#39;id&#39;],<br>        &#39;phone&#39;       =&gt; $participant[&#39;phone&#39;],<br>        &#39;first_name&#39;  =&gt; $participant[&#39;first_name&#39;],<br>        &#39;second_name&#39; =&gt; $participant[&#39;second_name&#39;]<br>    ];<br>}</pre><pre><strong>//importamos los contactos a nuestra &#39;agenda&#39;</strong><br>$contacts = yield $this-&gt;madelineProto-&gt;contacts-&gt;<strong>importContacts</strong>([&#39;contacts&#39; =&gt; $inputContacts]);</pre><pre><strong>//...y con la información recibida, construímos el array con los  userId</strong><br>$keyUsers = [];<br>foreach ($contacts[&#39;users&#39;] as $contact) {<br>    $keyUsers[] = &#39;user#&#39;.$contact[&#39;id&#39;];<br>}</pre><pre><strong>//Finalmente, invitamos a los contactos al canal</strong><br>return yield $this-&gt;madelineProto-&gt;channels-&gt;<strong>inviteToChannel</strong>([&#39;channel&#39; =&gt; $channelKey, &#39;users&#39; =&gt; $keyUsers]);</pre><p><strong>Advertencia importante.</strong> Con esta operación <strong>podríamos invitar a cualquier número de teléfono aunque sea anónimo</strong>. Hay que tener en cuenta que los contactos podrían tener configurado su <strong>Telegram</strong> para no ser invitados de forma anónima a ningún canal o configuraciones de privacidad similares por lo que no podríamos obtener el resultado esperado.</p><h4>Expulsar a un contacto de un canal</h4><p>No hay un método de expulsión como tal, si no que lo que hay que hacer es configurar que puede y que no puede hacer un usuario en nuestro canal. Para expulsarlo, haremos uso del método <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.editBanned.html"><strong><em>editBanned</em></strong></a> especificando el ‘<em>channelId’</em>, ‘<em>userId’</em> y configurando un atributo llamado ‘<a href="https://docs.madelineproto.xyz/API_docs/constructors/chatBannedRights.html">banned_rights</a>’ con todo a <em>true.</em></p><h4>Enviar un mensaje a un contacto</h4><p>Para enviar un mensaje haremos uso del método <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendMessage.html"><strong><em>sendMessage</em></strong></a>. Tiene multitud de posibilidades de configuración pero básicamente y simplificando podríamos enviarlo de la siguiente forma:</p><pre>$response = yield $this-&gt;madelineProto-&gt;messages-&gt;<strong>sendMessage</strong>([<br>      &#39;peer&#39;       =&gt; $peer,<br>      &#39;message&#39;    =&gt; &#39;mensaje a enviar&#39;,<br>      &#39;parse_mode&#39; =&gt; &#39;Markdown&#39;<br>  ]);</pre><p>Como en casos anteriores, ‘<em>peer</em>’ (el destinatario) es de tipo <a href="https://docs.madelineproto.xyz/API_docs/types/InputPeer.html"><strong><em>InputPeer</em></strong></a> de forma que si tenemos el <em>userId</em> del contacto podremos utilizarlo y si no habría que importarlo. ‘<em>parse_mode</em>’ indicaría si el marcado del texto es <strong>HTML</strong> o <strong>Markdown</strong>. En la respuesta de <strong>sendMessage</strong> vienen decenas de campos con información del mensaje, el emisor y el receptor. Ahí ya utilizaríamos los que sean útiles para nuestra tarea (yo suelo guardar, como mínimo, el <em>message[‘id’]</em> para posteriores operaciones sobre el mismo.</p><h4>Enviar un mensaje a un canal</h4><p>De igual forma que en el caso anterior solo que el <a href="https://docs.madelineproto.xyz/API_docs/types/InputPeer.html"><strong><em>InputPeer</em></strong></a> debe hacer referencia a un canal, es decir, si antes era ‘<em>user#123456</em>’ en este caso podría ser un ‘<em>channel#98765’</em>.</p><h4>Obtener información de todos los contactos</h4><p>Esta es una operación bastante útil para obtener todos los contactos de tu <strong>Telegram</strong>. Con <a href="https://docs.madelineproto.xyz/API_docs/methods/contacts.getContacts.html"><strong><em>getContacts</em></strong></a> puedes saber que información guardas de cada uno de ellos.</p><pre>$response =  yield $this-&gt;madelineProto-&gt;contacts-&gt;<strong>getContacts</strong>();</pre><h4>Obtener información de un contacto</h4><p>Si lo que quieres es toda la información de un solo contacto hay que llamar a <a href="https://docs.madelineproto.xyz/getFullInfo.html"><strong><em>getFullInfo</em></strong></a>. <em>$inputPeer </em>es del tipo <a href="https://docs.madelineproto.xyz/API_docs/types/InputPeer.html"><strong><em>InputPeer</em></strong></a> y deberás configurarlo con el <em>userId</em> o bien obtener previamente su información de contacto si fuera alguien anónimo para ti, como hemos visto anteriormente.</p><pre>$responseContact =  yield $this-&gt;madelineProto-&gt;<strong>getFullInfo</strong>($inputPeer);</pre><h4>Otras operaciones…</h4><p>Los ejemplos anteriores creo que ya son suficientes para hacerse una idea de como funciona el API de <strong>Telegram</strong> y como interactuar con él desde <strong>MadelineProto</strong>. En mi caso tengo implementada bastante más funcionalidad como enviar mensajes con archivos, mostrar el contenido de los archivos y/o descargarlos, mostrar información completa de los canales, obtener el historial de mensajes de un contacto…en definitiva, cualquier operación que vaya siendo necesaria para que la comunicación sea completa.</p><h3>Obtener actualizaciones desde Telegram</h3><p>Todas las operaciones anteriores tiene una única dirección, es decir, son realizadas desde nuestra aplicación <strong>PHP</strong> con destino a <strong>Telegram</strong> pero, ¿qué ocurre cuando ocurre algo en <strong>Telegram</strong>? ¿<strong>cómo nos enteramos en nuestra aplicación PHP que alguien nos ha contestado a un mensaje</strong>? ¿cómo obtenemos todas las actualizaciones que se han producido?</p><p>Ahora mismo estoy desarrollando esta funcionalidad por lo que lamentablemente no tengo muy claro como lo haré finalmente. Cuando la termine escribiré otro artículo para compartir la solución. <strong>MadelineProto</strong> tiene documentada toda esta ‘<em>movida</em>’ a las que llamada <a href="https://docs.madelineproto.xyz/docs/UPDATES.html"><strong><em>Updates</em></strong></a>.</p><p>Como he comentado anteriormente, aunque he conseguido resolver muchas cuestiones, todavía me encuentro desarrollando muchas partes de la comunicación entre <strong>PHP</strong> y <strong>Telegram</strong>. No obstante, si necesitas ayuda y crees que puedo ayudarte de alguna forma en tu proyecto no tienes más que contactar conmigo y a ver si podemos solucionar algo :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*rRASl-sxI65v1BSQMtukkg.jpeg" /></figure><p>Como siempre, cualquier sugerencia, corrección, comentario…etc., será enormemente agradecido y bienvenido.</p><p>¡<strong>Chimpún</strong>!</p><h3>Bibliografía</h3><ul><li><a href="https://docs.madelineproto.xyz/"><strong>MadelineProto</strong></a></li><li><a href="https://core.telegram.org/"><strong>Api de Telegram</strong></a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ef0a62093e48" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zahoribo: versión 1.2.0]]></title>
            <link>https://mpijierro.medium.com/zahoribo-versi%C3%B3n-1-2-0-9d6d9fccce9d?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/9d6d9fccce9d</guid>
            <category><![CDATA[zahoribo]]></category>
            <category><![CDATA[software]]></category>
            <category><![CDATA[laravel]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Wed, 29 Jul 2020 22:35:39 GMT</pubDate>
            <atom:updated>2020-07-30T07:35:30.886Z</atom:updated>
            <content:encoded><![CDATA[<h3>Zahoribo: versión 1.2.0.</h3><p>Hace varios días he actualizado <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> a la versión <strong>1.2.0.</strong>, cuyo histórico de novedades puede seguirse <a href="https://zahoribo.com/desarrollo">a través de esta página</a>.</p><p>En esta ocasión dichas novedades vienen de la mano de una actualización del histórico de boletines indexando más años, nueva funcionalidad y algunas correcciones.</p><h3>Indexadas más de 1.200.000 páginas nuevas</h3><p>Se han añadido <strong>aproximadamente 1.200.000 páginas nuevas </strong>correspondientes a los años <strong>2006,2007,2008 y 2009</strong> de los boletines principales del buscador: <strong>BOE</strong>, <strong>BORME</strong>, <strong>DOE</strong> y <strong>boletines provinciales de Cáceres y Badajoz</strong>. Se puede hacer un seguimiento del contenido indexado a través del <a href="https://zahoribo.com/calendario">calendario de la aplicación</a>.</p><h4>Problemas en la sala de máquinas</h4><p>Aunque desde el punto de vista técnico queda pendiente escribir un artículo más amplio sobre como está organizado el buscador, en esta ocasión diré que la actualización de contenidos ha supuesto un nuevo reto porque el índice del servidor en el que se ha realizado la operación había llegado a uno de sus límites. Al intentar indexar el contenido se generaba el siguiente error:</p><blockquote>too many string attributes (current index format allows up to 4 GB).</blockquote><p>Antes de añadir este 1,2 millones de páginas el índice estaba dividido en 4 partes. Tras el error, he tenido que dividirlo en 5, para que el tamaño de cada índice estuviera por debajo de esos 4 GB. Es una solución temporal hasta que reorganice el servidor y la configuración del motor de búsqueda.</p><h4>Métricas</h4><p>En el momento de indexar este contenido, la noche del 26 al 27 de Julio, teníamos los siguientes datos:</p><ul><li><strong>servidor 1</strong>: 1.119.507 páginas dividas en dos índices. Dichos índices ocupan un total de 6,2 GB y el tiempo de indexado son aproximadamente 20 minutos. Este servidor tiene 2 cores, 4 GB de memoria RAM y disco SSD.</li><li><strong>servidor 2</strong>: 4.593.410 páginas divididas en cinco índices. Dichos índices ocupan un total de 34 GB y el tiempo de indexado son aproximadamente 115 minutos. Este servidor tiene 4 cores, 8 GB de RAM y disco SSD.</li></ul><p>La base de datos completa ocupa 17 GB.</p><h3>Listado de plenos de ayuntamientos</h3><p>Para tener una visión global del contenido que hay indexado por cada ayuntamiento he añadido en la vista del <a href="https://zahoribo.com/calendario"><strong>calendario</strong></a> unos enlaces sobre el nombre de las poblaciones que te llevan a una pantalla con el listado de documentos, plenos…etc., correspondiente a cada consistorio.</p><h3>Otras mejoras y correcciones</h3><p>He intentado hacer más simpática la <strong>pantalla para cuando la plataforma está en modo mantenimiento</strong> quedando de la siguiente manera:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/763/1*mIunrWu4wi7KnGC8YoJVTA.png" /><figcaption>Vista de Zahoribo cuando se encuentra en modo mantenimiento</figcaption></figure><p>Antes esta página era un texto sin apenas formato y sin personalidad ninguna. Ahora creo que queda mucho mejor.</p><p>Además, he <strong>solucionado un error</strong> relacionado con el contenido que se mostraba al hacer clic en los enlaces de los correos electrónicos enviados en las alertas. Antes se mostraba el contenido correcto de la alerta…y otros resultados correspondientes a otras fechas, lo cual generaba mucho ruido. Ahora únicamente se muestran únicamente los resultados de la alerta quedando mucho más limpio y productivo.</p><p>Y hasta aquí las mejoras más importantes de esta versión <a href="https://zahoribo.com/desarrollo"><strong>1.2.0 de Zahoribo</strong></a>. Cualquier comentario, duda, sugerencia o corrección será bienvenido.</p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9d6d9fccce9d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zahoribo: la cara ‘B’ del desarrollo de un proyecto personal]]></title>
            <link>https://mpijierro.medium.com/zahoribo-la-cara-b-del-desarrollo-de-un-proyecto-personal-196de759d363?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/196de759d363</guid>
            <category><![CDATA[software]]></category>
            <category><![CDATA[desarrollo-de-software]]></category>
            <category><![CDATA[proyectos]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Wed, 29 Jul 2020 08:15:06 GMT</pubDate>
            <atom:updated>2020-07-30T17:23:54.682Z</atom:updated>
            <content:encoded><![CDATA[<p>Hace varias semanas que presenté <a href="https://medium.com/@mpijierro/zahoribo-un-buscador-en-boletines-oficiales-f8abb46c40c9"><strong>Zahoribo</strong></a> y desde entonces, por unos u otros canales, no han dejado de llegar enhorabuenas, felicitaciones, vítores y aplausos variados por parte de conocidos y desconocidos. Y eso está bien, me alegra enormemente que haya tenido tan buena acogida. Además, el 19 de Junio <a href="https://www.elperiodicoextremadura.com/noticias/extremadura/google-boletines-oficiales_1241878.html"><strong>El Periódico Extremadura</strong></a> publicó un artículo sobre <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> que impulsó esa ola anterior de felicitaciones, palmadas en la espalda y enhorabuenas que me han rodeado en los últimos días. Días de vino y rosas que dicen algunos.</p><p>Pero ya basta, <strong>este artículo no va de tirar más flores</strong>. Todo lo contrario, hoy me gustaría <strong>escribir sobre esa cara “<em>B</em>” de los proyectos personales</strong>. De lo que esconden, <strong>del coste personal y profesional que conllevan </strong>y que no siempre es tan positivo como pudiera parecer.</p><p>Seguramente mucho de lo escrito puede resultar muy de <a href="https://inciclopedia.org/wiki/Capit%C3%A1n_Obvio"><strong><em>Captain Obvious</em></strong></a> pero os puedo asegurar que cuando uno se mete en un jaleo así se hace difícil establecer la frontera entre lo asumible y lo inasumible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/333/1*C0PcyzGdkVEsCQK-UkbuSA.jpeg" /><figcaption>Así me he sentido escribiendo algunas partes de este artículo</figcaption></figure><h3>El tamaño sí importa</h3><p>Que no te engañen los que dicen que no. El tamaño (o alcance) del proyecto importa, y mucho, sobre todo si es una única persona la que desarrolla y la que se ocupa de todo, como suele ser lo normal en proyectos personales.</p><p>A mí personalmente <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> se me ha hecho muy extenso en todos los sentidos, demasiado, a veces hasta pesado</strong>. Pensar y programar todo el <em>back</em> y todo el <em>front</em> incluyendo ‘el <em>javascript, el diseño, el responsive y la </em>usabilidad’, gestionar y administrar los servidores, configurar el motor de búsqueda, investigar sobre los boletines, programar todo el indexado diario…etc etc etc. Demasiadas áreas para una sola persona y demasiado complejas algunas de ellas como para conocerlas y llevarlas a cabo correctamente. Al final, uno termina conformándose con hacerlas de forma que no dé mucha vergüenza ajena cuando vean la luz.</p><p><strong>Si vas a llevar a cabo un proyecto personal, valora y mide el alcance de tu proyecto </strong>o al menos de aquella parte que quieras terminar primero. Valora también buscar compañeros de viaje. Gente que te ayude, que te apoye, que resuelva y si puede ser que conozca áreas que no tú no domines.</p><p>¡Ah!, y aunque resulte obvio, <strong>piensa bien las característica que te gustaría incluir en la primera versión</strong>. Cualquier funcionalidad por pequeña que creas que sea siempre se hará más larga de lo calculado en un primer momento. Hay que dedicar tiempo a pensarla, diseñarla para que más o menos encaje en el diseño de forma decente, programarla, probarla..corregirla…reprogramarla si fuera necesario…etc., a mí me ha pasado varias veces. Hay funcionalidad que una vez terminada la tirado a la basura porque no me convencía.</p><p>En resumen, personalmente, <strong>a día de hoy creo que no volvería a llevar a cabo un proyecto con un alcance medio-grande como </strong><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> de forma solitaria</strong>. A día de hoy considero que estaría desarrollada más o menos hasta la mitad de la plataforma de todas las ideas que tenía en un principio. Y ojo, únicamente estoy hablando del proyecto desde el punto de vista técnico, es decir, realizando trabajos para la solución técnica del problema. Si además añadimos tareas de negocio relacionadas con intentar crear un producto…eso ya si que, al menos para mi, se presenta como una tarea imposible para una sola persona dentro del concepto de proyecto personal.</p><h3>La presión del fullstack</h3><p>El término “<em>fullstack development</em>” cada vez me genera más estrés. Si hay alguien que no lo conoce le dejo <a href="https://www.google.com/search?q=que+es+ser+programador+fullstack&amp;oq=que+es+ser+programador+fullstack&amp;aqs=chrome..69i57.3369j0j1&amp;sourceid=chrome&amp;ie=UTF-8">esta búsqueda de Google</a>. Cualquier enlace de los aparecidos explicará más o menos el mismo concepto.</p><p>No sé cuáles serán las expectativas de la mayoría cuando piensa en el término <em>fullstack</em> pero yo personalmente veo muy complejo saber y ser bueno en todo. La tecnología, los lenguajes, los <em>frameworks</em>, las herramientas…etc., cambian y evolucionan tan rápidamente que me parece increíble poder estar al día y desarrollar con solvencia en cualquiera de los ámbitos referidos.</p><p>En mi caso con <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>, he lidiado con las muchas áreas de conocimiento que engloban un proyecto así pero reconozco que, por ejemplo, las he <a href="https://blogs.20minutos.es/yaestaellistoquetodolosabe/de-donde-procede-la-expresion-pasarlas-canutas/">pasado canutas</a> con parte del diseño y de la gestión de los servidores. Son áreas en las que me defiendo a base de <em>googlear</em> y <a href="https://stackoverflow.com/"><em>stackoverflowear</em></a> mucho…pero yo no me atrevería a poner en mi currículum que soy fullstack. <strong>Ni la vida ni la mente me da para tener tanto conocimiento</strong>.</p><h4>Libros y tutoriales</h4><p>Aún así, en un intento por hacer las cosas lo mejor posible e intentar mejorar mis áreas de conocimiento para el desarrollo de software en general y <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> en particular, me he leído el famoso libro de usabilidad “<a href="https://stevekrug.com/dmmt.html"><strong>No me hagas pensar</strong></a>” de <a href="https://stevekrug.com/dmmt.html"><strong>Steve Krug</strong></a>. Sobre el motor de búsqueda me leí su <a href="http://sphinxsearch.com/docs/manual-2.3.2.html">documentación</a> y el <a href="https://www.oreilly.com/library/view/introduction-to-search/9780596809546/">libro de <strong>Sphinx Search</strong></a>, Además, seguí el <a href="https://www.youtube.com/watch?v=O9CKO86teyM&amp;list=PLI7nHlOIIPOJtTDs1HVJABswW-xJcA7_o"><strong>curso de Javascript del canal de Ada Lovecode</strong></a> y varios vídeos con tutoriales sobre <strong>CSS</strong>, <strong>Bootstrap 4</strong> y <strong>CSS</strong> <strong>Flexbox</strong>. La verdad que ha sido enriquecedor.</p><p>Para terminar este apartado me gustaría mostrar mi admiración, respeto y reconocimiento para todos ellos que de verdad sean desarrolladores <em>fullstack</em>.</p><h3>Dedicación: horas, horas…y más horas</h3><p>Ni siquiera sé cuántas han sido exactamente, pero han sido muchas. Diría que demasiadas. Diría, incluso, que si hubiera llevado un control exacto del tiempo dedicado probablemente habría tirado la toalla hace tiempo y creo que nunca hubiera terminado <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>. Digo que son muchas teniendo en cuenta que es un proyecto personal, que puede que no me dé nada o solo disgustos en el peor de los casos.</p><p>Seguro que voy a decir otra obviedad pero hay que tener en cuenta que <strong>los proyectos personales salen del tiempo libre de cada uno</strong>. Y tiempo libre significa sacrificar <strong>tiempo de familia, tiempo de ocio personal o tiempo de descanso</strong>. En mi caso han sido muchos días de muchas semanas levantándome a horas intempestivas para dedicarle al menos una o dos horas diarias aumentando esta cantidad los fines de semana. He sacrificado mucho y ahora mismo estoy en un punto en el que no sé si he hecho bien o mal.</p><p><strong>Es difícil justificar de forma continuada durante semanas o meses en el entorno familiar o en el círculo de amistades, el tiempo dedicado a un proyecto</strong> sobre cuyo final recae una alta incertidumbre. Soportar la presión no es fácil y hacer entender a personas no relacionadas con el mundo del software que a veces programar puede ser también un <em>hobbie</em> puede resultar bastante complicado…y cansado.</p><p>…si hasta la redacción de este artículo me ha llevado fácilmente algo más de cuatro horas…</p><h3>Una línea de meta cada vez más lejos</h3><p><strong>El paso del tiempo hace que los proyectos personales parezcan no tener fin</strong>. Lo que al principio veías asumible y cercano vas notando que con el paso de las semanas todo se complica y el objetivo se aleja. Lo difícil sigue siendo difícil y lo fácil se convierte en difícil, eso es así.</p><p><strong>El paso del tiempo hace que asalten todo tipo de dudas personales y profesionales</strong>. ¿Estaré haciendo bien?, ¿conseguiré terminarlo?, ¿quedará algo decente o será una chapuza?, ¿valdrá la pena el tiempo invertido?…Todas estas dudas y muchas otras surgen conforme avanza el tiempo de desarrollo. Dudas que se vuelven más intensas cuando, por ejemplo, llegas a callejones sin salidas y tienes que <em>reprogramar</em> algunas partes de la aplicación o te das cuenta que has recorrido un camino equivocado y toca seguir invirtiendo más tiempo. A veces pasa y frustra mucho.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/543/1*GCAAl8BK_Kh45UosA_3hEw.jpeg" /><figcaption>Ilustración perfecta de lo que es un proyecto personal</figcaption></figure><p><strong>El paso del tiempo hace que la motivación decrezca</strong>. Recuerdo las primeras semanas, estaba deseando tener un rato libre para dedicarle al proyecto. Sin embargo, <strong>ha habido semanas en las que realmente se me ha atragantado y no encontraba ni la motivación ni la fuerza mental suficiente para programar en él</strong>. No ver resultados a corto plazo y de manera continua facilita la pérdida del interés y la motivación y, por lo tanto, <strong>es difícil mantener la intensidad y la concentración en un proyecto personal a largo plazo.</strong></p><p><strong>El paso del tiempo hace que transites por rachas positivas y negativas de ánimo respecto al objetivo marcado</strong>. Supongo que como todo en la vida, en un período largo de tiempo, da tiempo, valga la redundancia, a pasar por épocas positivas en las que todo marcha bien y ves la salida del túnel y épocas negativas, en las que te preguntas ¿qué ******* estoy haciendo con mi vida?</p><p><strong>El perfeccionismo es otro enemigo que aleja la meta</strong>. Creo que ser demasiado perfeccionista puede hacer que conviertas un proyecto personal en algo infinito. A poco que te lo propongas, seguro que siempre encuentras motivos para dedicar más tiempo a mejorarlo. No seas tan exigente y busca un punto intermedio que te ponga entre lo perfecto e imperfecto y lo finito y lo infinito. Seguro que lo hay.</p><p>Por último, si estás desarrollando un proyecto personal y te encuentras en alguna fase de estas…mucho ánimo, de todo se sale :) …ya llegarán tiempos mejores. No te fuerces y descansa.</p><h3>Síndrome del impostor</h3><p>A continuación, dos párrafos muy personales.</p><p>Creo que cuando alguien presenta un proyecto propio al resto del mundo en cierto modo es un salto al vacío en el que queda expuesto de forma personal y profesional. Ese salto da vértigo, la verdad. En esos días previos a la presentación es fácil dejarse llevar por pensamientos del tipo “<em>vaya chapu me está quedando</em>”, “<em>esto no va a ir bien</em>”, “<em>seguro que se cae</em>”, “<em>el diseño se verá mal</em>”, “<em>que vergüenza</em>”, “<em>otros lo harían mucho mejor</em>”, “<em>todo funcionará mal</em>”, “<em>¿cómo vas a enseñar esto?</em>”…etc. Lo peor de estos pensamientos es el desgaste que produce protegerse uno mismo de sus propios pensamientos. Es curioso, pero es así. Supongo que tengo una idea bastante asumida de que todo el mundo sabe mucho de todo y yo mucho de poco y/o incluso poco…de poco, en comparación con el resto.</p><p>Pero, una vez superado ese salto al vacío anterior, por suerte y en mi caso llegan las enhorabuenas y los ‘<em>cracks</em>’. Es como irse al otro extremo, de pensar que todo va a salir mal a parecer que todo es perfecto gracias a que uno es un “<em>crack</em>”. “Eres un <em>crack</em>”, “vaya <em>crack</em>”, “menudo <em>crack</em>”…¿yo?, ¿seguro?, ¿has mirado bien?, ¿<em>crack</em> yo?, ¿de verdad?. Y es justo aquí cuando aparece el <a href="https://es.wikipedia.org/wiki/S%C3%ADndrome_del_impostor">síndrome del impostor</a> con más fuerza. Honesta y sinceramente no creo que sea ningún <em>crack</em> ni por este proyecto ni por ningún otro. Que va. Ni por asomo. Ni en sueños. Yo me conozco, sé dónde están mis límites y hasta dónde llegan mi conocimiento y experiencia. No sé que tipo de expectativas ha generado todo esto sobre mí en lo personal y en lo profesional pero sí sé que no deberían ser nada especiales. Me da cierto reparo que algún día no pueda cumplir con estas expectativas que se han generado en torno a mi persona como profesional por el éxito, mayor o menor, siempre relativo, que puedan tener proyectos como <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>.</p><p>A fin de cuentas, yo lo único que hago es dedicarle mucho tiempo a la programación, que me gusta mucho, y ya está, tampoco tiene, ni tengo, mucho más misterio. Así que ‘<em>vamo a calmarno</em>’.</p><p>Como dijo <strong>Sócrates</strong>:</p><blockquote>Solo sé que no sé nada</blockquote><h3>La corona de espinas</h3><p>Desarrollar y finalizar un proyecto personal de programación con “<em>éxito” </em>(lo entrecomillo porque el significado de éxito es bastante subjetivo y depende de cada uno), es algo así como colocarse una corona de espinas. Te coronas, si, pero ojo a las marcas y las consecuencias que deja. El tiempo, el esfuerzo, los pensamientos, las dudas,…son espinas de esa corona que tienes que aprender a sobrellevar de la mejor manera posible. Tras el “<em>éxito</em>” que pueda tener un proyecto de este tipo, hay un coste personal y profesional muchas veces oculto e infravalorado que desgasta mucho al programador y a su entorno.</p><p>Pero si llegas al final te alegras y el pensamiento de que todo ha merecido la pena gana lugar en tu mente. Y al final llegas sobre todo porque no queda otra, porque no hay plan ‘B<em>’</em>, porque sacas fuerzas y ánimo para continuar, porque lees, porque te documentas, porque pruebas y lo intentas una y otra vez y sobre todo porque tienes un objetivo y un compromiso que cumplir contigo mismo y, además, porque llega el momento en el que te encuentras en un punto de no retorno en el que sabes que ya no hay marcha atrás y solo queda continuar y terminar. Y también porque en el camino aprendes mucho y aprender es bonito. Y también porque <strong>te das cuenta que tu proyecto ayuda a la gente y construir cosas para ayudar a los demás también es bonito</strong>.</p><p>No quisiera terminar sin enviar un fuerte abrazo y <strong>un recuerdo a todos esos programadores y sus respectivos proyectos personales que se quedaron a medias</strong> y no vieron la luz. <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> también va dedicado a vosotros.</p><p>Y hasta aquí esta reflexión sobre lo que puede suponer llevar a cabo un proyecto personal. Cómo siempre, cualquier comentario, duda, sugerencia y/o corrección son bienvenidos. Gracias por llegar hasta aquí.</p><p>¡Chimpún!</p><h3>Créditos</h3><ul><li>Imagen del Captain Obvius extraída de aquí: <a href="https://inciclopedia.org/wiki/Capit%C3%A1n_Obvio">https://inciclopedia.org/wiki/Capit%C3%A1n_Obvio</a></li><li>Imaen <em>‘plan vs reality</em>’ extraída de aquí: <a href="https://planningengineer.net/your-plan-and-the-reality/">https://planningengineer.net/your-plan-and-the-reality/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=196de759d363" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[#Fixed 9: Solucionado error con ‘supervisor’ caído]]></title>
            <link>https://mpijierro.medium.com/fixed-9-solucionado-error-con-supervisor-ca%C3%ADdo-d8c846c499f2?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/d8c846c499f2</guid>
            <category><![CDATA[supervisor]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[debian]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Thu, 23 Jul 2020 17:04:51 GMT</pubDate>
            <atom:updated>2020-07-23T17:04:51.064Z</atom:updated>
            <content:encoded><![CDATA[<p>Como en otras ocasiones, utilizaré el blog a modo de cuaderno de bitácoras para recordar como solucionar algunos problemas recurrentes con los que me encuentro en mi día a día y que de alguna manera u otra, consigo solucionar.</p><p>En esta ocasión tiene que ver con el <a href="http://supervisord.org/"><strong><em>supervisor</em></strong></a> configurado en un servidor en el que está funcionado la aplicación de un cliente.</p><h3>Problema</h3><p>Todo viene porque el servidor <strong>Apache</strong> se ha caído dos o tres veces en una semana después de estar meses y meses sin caerse. Para estos casos, instalé un supervisor que levantara <strong>Apache</strong> en caso de caída…pero, <strong>supervisor</strong> tampoco funcionó.</p><p>Aunque entiendo que principalmente debería resolver que es lo que hizo que <strong>Apache</strong> cayera, en este caso, he investigado el motivo por el que supervisor no funcionó.</p><p>Primeramente, lo que intenté fue reiniciar el servicio de supervisor</p><pre>root@********:/etc/supervisor/conf.d# /etc/init.d/supervisor restart<br>[….]<strong> Restarting supervisor (via systemctl): supervisor.serviceJob for supervisor.service failed</strong>. See ‘systemctl status supervisor.service’ and ‘journalctl -xn’ for details.<br> failed!</pre><p>por algún oscuro no conseguía reiniciar, así que tiré de otro comando para comprobar el <em>status</em>:</p><pre>root@*********:/etc/supervisor/conf.d# systemctl status supervisor.service<br>* supervisor.service — LSB: Start/stop supervisor<br> Loaded: loaded (/etc/init.d/supervisor)<br> Active: failed (Result: exit-code) since jue 2020–07–23 16:25:58 CEST; 2min 12s ago<br> Process: 14944 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS)<br> Process: 14949 ExecStart=/etc/init.d/supervisor start (code=exited, status=2)</pre><pre>jul 23 16:25:58 ********* systemd[1]: Starting LSB: Start/stop supervisor…<br>jul 23 16:25:58 ********* supervisor[14949]: <strong>Starting supervisor: Error: Another program is already listening on a port that one of our HTTP servers is configure…pervisord.</strong><br>jul 23 16:25:58 ********* supervisor[14949]: For help, use /usr/bin/supervisord -h<br>jul 23 16:25:58 ********* systemd[1]: supervisor.service: control process exited, code=exited status=2<br>jul 23 16:25:58 ********* systemd[1]: Failed to start LSB: Start/stop supervisor.<br>jul 23 16:25:58 ********* systemd[1]: Unit supervisor.service entered failed state.<br>Hint: Some lines were ellipsized, use -l to show in full.</pre><p>Este mensaje ya decía algo más. ‘<em>Another program</em>’ se estaba ejecutando o estaba activo y hacía que supervisor estuviera bloqueado.</p><h3>Solución</h3><p>Como en estos temas de servidores no soy experto (bueno, y en casi nada realmente), me toca <em>googlear</em> y documentarme para buscar posibles soluciones a este problema. Tras varias lecturas y pruebas, di con este hilo en <a href="https://stackoverflow.com/questions/25121838/supervisor-on-debian-wheezy-another-program-is-already-listening-on-a-port-that"><strong>stackoverflow</strong></a>, en el que a un problema similar sugerían una posible solución eliminando el siguiente archivo :</p><pre><strong>sudo unlink /var/run/supervisor.sock</strong></pre><p>Puedes leer más sobre la configuración de <strong>supervisor</strong> y sobre este archivo de configuración <a href="http://supervisord.org/configuration.html?highlight=sock#unix-http-server-section-settings">a través de este enlace</a>.</p><p>Posteriormente, solo quedó reiniciar <strong>supervisor</strong>.</p><pre>#/etc/init.d/supervisor restart</pre><p>Y volver a comprobar el estado del mismo para comprobar que supervisor quedaba activo:</p><pre>#<strong>systemctl status supervisor.service</strong><br>* supervisor.service - LSB: Start/stop supervisor<br>   Loaded: loaded (/etc/init.d/supervisor)<br>   <strong>Active: active (running) since jue 2020-07-23 16:34:11 CEST; 47s ago</strong><br>  Process: 14944 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS)<br>  Process: 15097 ExecStart=/etc/init.d/supervisor start (code=exited, status=0/SUCCESS)<br>   CGroup: /system.slice/supervisor.service<br>           |-  507 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf<br>           `-15102 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf</pre><p>Eso si, queda pendiente de ver porque Apache se cae…pero esto será para otro artículo.</p><p>Cualquier sugerencia, corrección o comentario será bienvenido.</p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d8c846c499f2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zahoribo: mejorando el algoritmo de búsqueda]]></title>
            <link>https://mpijierro.medium.com/zahoribo-mejorando-el-algoritmo-de-b%C3%BAsqueda-ad55e267abe9?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/ad55e267abe9</guid>
            <category><![CDATA[boe]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[zahoribo]]></category>
            <category><![CDATA[boletines-oficiales]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Mon, 29 Jun 2020 23:16:54 GMT</pubDate>
            <atom:updated>2020-07-01T10:52:33.281Z</atom:updated>
            <content:encoded><![CDATA[<p>La versión <a href="https://zahoribo.com/desarrollo">1.1.0 de <strong>Zahoribo</strong></a> trae novedades importantes. Por un lado hemos añadido nuevo contenido indexado con varios años más al histórico de boletines y, por otro lado, hemos mejorado el algoritmo de búsqueda haciendo que los resultados obtenidos sean mucho más precisos sin intervención del usuario.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*HJgg_f2LkwWdOGG601MGGQ.jpeg" /><figcaption>Rapidez y precisión son características de <a href="https://zahoribo.com/">Zahoribo</a></figcaption></figure><p>¿Quieres saber más?, sigue leyendo.</p><h3>Casi 1.500.000 páginas más indexadas</h3><p>Se han añadido aproximadamente 1.500.000 páginas más de contenido indexado en los últimos siete días. Los boletines y fechas añadidas han sido los siguientes:</p><ul><li><strong>BOE</strong>: Desde 01–01–2010 hasta el 31–12–2013.</li><li><strong>BORME</strong>: Desde el 01–01–2010 hasta el 31–12–2013.</li><li><strong>D.O.E.</strong>: Desde el 01–01–2010 hasta el 31–12–2011.</li><li><strong>Boletín Provincia Badajoz</strong>: Desde 01–01–2010 al 31–12–2014.</li><li><strong>Boletín Provincia Cáceres</strong>: Desde 01–01–2010 al 31–12–2011.</li></ul><p>De esta manera queda normalizado el histórico de los boletines más importantes comenzando todos estos el 1 de Enero de 2010 hasta hoy. Pero esto no termina aquí, en los próximos días seguiremos añadiendo años al histórico.</p><h3>Mejorando el algoritmo de búsqueda</h3><p>Este ha sido un cambio importante por todo lo que implica a la hora de usar la plataforma. A partir de hoy <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> se esfuerza en obtener resultados de búsqueda lo más exactos posibles</strong>. Ahora cuando el usuario realiza una búsqueda lo prioritario es encontrar exactamente lo que ha escrito, posteriormente cosas parecidas pero en el mismo orden y por último nos conformamos con que al menos existan las palabras buscadas. Lo explicamos a continuación.</p><h4>¿Cómo funcionaba antes?</h4><p>Hasta ayer, cuando un usuario realizaba una búsqueda sin utilizar ningún modificador de búsqueda avanzada, por ejemplo:</p><blockquote>ayudas individuales</blockquote><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> llevaba a cabo la opción de búsqueda menos estricta, es decir, buscaba páginas que tuvieran al menos las dos palabras, en cualquier orden y utilizando lexemas. Gracias a las característica de búsquedas por raíz (<a href="https://zahoribo.com/ayuda/manual#consejo2">lexemas</a>), equivaldría a buscar lo siguiente:</p><blockquote>ayud individu</blockquote><p>dejándose al usuario la opción de utilizar modificadores para encontrar resultados más precisos.</p><p>Esto hacía que, ante la misma fecha de publicación, pudiera aparecer una página que tuviera al principio la palabra ‘<em>ayuda</em>’ y al final la palabra ‘<em>individual</em>’ antes que una página que tuviera realmente ‘<em>ayudas individuales</em>’ en su contenido. La forma que tenía el usuario de mejorar este resultado pasaba porque leyera el manual de uso y aplicara los <a href="https://zahoribo.com/ayuda/manual#punto4">consejos 2 y 3</a> para buscar palabras y frases exactas</p><h4>¿Cómo funciona ahora?</h4><p>Tal y cómo hemos comentado, desde hoy <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> se esfuerza en encontrar exactamente lo que ha buscado el usuario y se lo ofrece en primer lugar.</p><p>Siguiendo con el ejemplo anterior, si usuario buscara lo siguiente:</p><blockquote>ayudas individuales</blockquote><p>el algoritmo de búsqueda, internamente, puede llegar a realizar hasta tres búsquedas teniendo en cuenta un máximo de 1000 resultados :</p><ol><li>En primer lugar hace una <a href="https://zahoribo.com/ayuda/manual#consejo3">búsqueda por frase y palabra exacta</a>:</li></ol><blockquote>“=ayudas =individuales”</blockquote><p>de manera que se buscan páginas con esas palabras escritas exactamente así (sin <a href="https://zahoribo.com/ayuda/manual#consejo2">lexemas</a>) y además tienen que estar en ese orden. Es decir, encontrar exactamente eso.</p><p>2. En segundo lugar, siempre que no se hayan alcanzado los anteriores 1000 resultados, hace una<a href="https://zahoribo.com/ayuda/manual#consejo4"> búsqueda por frase exacta</a>:</p><blockquote>“ayudas individuales”</blockquote><p>de manera que ahora se buscan páginas con esas palabras escritas por su raíz (<a href="https://zahoribo.com/ayuda/manual#consejo2">lexemas</a>) “<em>ayud individu</em>” pero teniendo que existir al menos en ese orden.</p><p>3. Por último, y siempre que entre las dos búsquedas anteriores no se hayan alcanzado los 1000 resultados, se realiza una búsqueda ‘normal’:</p><blockquote>ayudas individuales</blockquote><p>que es la búsqueda menos estricta, es decir, se buscan páginas con esas palabras escritas por su raíz (<a href="https://zahoribo.com/ayuda/manual#consejo2">lexemas</a>) sin tener en cuenta el orden en el que aparecen. Es suficiente con que existan.</p><p>Es importante destacar que <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> tomará el mando de la búsqueda siempre y cuando el usuario no use modificadores de búsqueda avanzada, búsquedas anidadas o agrupe resultados. En estos casos, será el usuario el que decida el tipo de búsqueda a realizar <a href="https://zahoribo.com/ayuda/manual#punto4">ayudándose de los modificadores disponibles</a>.</p><p>En resumen: <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> buscará primero exactamente las palabras buscadas, luego buscará aquello que se le parezca pero al menos esté en el mismo orden escrito y finalmente buscará páginas que contengan al menos las palabras buscadas.</p><h3>Otras modificaciones</h3><p>En esta <a href="https://zahoribo.com/desarrollo">versión 1.1.0.</a> se han llevado a cabo otras modificaciones menores.</p><h4>Quitada la forma de ordenar resultados por relevancia</h4><p>Se ha quitado de los filtros la posibilidad de ordenar resultados por relevancia. El motivo es que no tenía mucho sentido esta funcionalidad en el conjunto de datos existente y el tipo de búsqueda realizadas y, además, tampoco quedaba claro para el usuario que era más relevante y que era menos relevante. El propio concepto de relevancia no es algo simple ni inmediato y serían necesarias muchas variables para proporcionar búsquedas con cierta relevancia, tal y como hace <strong>Google</strong> por ejemplo.</p><h4>Quitado enlace ‘ver más’ en resultados concretos del Boletín Provincial de Badajoz</h4><p>En la parte inferior de cada resultado de páginas individuales hay un enlace ‘<em>ver más</em>’ en el que al hacer clic se despliega el contenido de la página completo. El contenido del <strong>Boletín Provincial de Badajoz </strong>anterior al 5 de diciembre de 2019 no contiene archivos <em>PDF’s</em> con los anuncios y páginas individuales, sino que cada boletín diario era un único texto <em>html</em> que podían corresponderse con varias, decenas o centenares de páginas haciendo que mostrarse desplegado fuera inviable. Se ha sustituido el enlace ‘<em>ver más</em>’ por un enlace al boletín original.</p><h4>Mejorado el resaltado de palabras en los resultados</h4><p>El resaltado con fondo amarillo en los resultados de búsqueda se ha mejorado para las búsquedas sobre resultados de búsquedas anteriores. Antes solo se resaltaba la búsqueda actual. Ahora se resalta el contenido de todas las búsquedas que se vayan haciendo de manera recursiva.</p><p>Internamente, a nivel de programación y configuración de índices se han realizado muchos cambios pero esto será en otro artículo con una orientación más técnica.</p><p>De momento, esto es todo. Cualquier consideración, duda, sugerencias, corrección…será bienvenida.</p><p>¡Chimpún!</p><h3>Bibliografía</h3><ul><li>La imagen que ilustra el artículo es original de <strong>Ricardo Arce</strong> y puede conseguirse aquí: <a href="https://unsplash.com/photos/cY_TCKr5bek">https://unsplash.com/photos/cY_TCKr5bek</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ad55e267abe9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zahoribo, un buscador en boletines oficiales]]></title>
            <link>https://mpijierro.medium.com/zahoribo-un-buscador-en-boletines-oficiales-f8abb46c40c9?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/f8abb46c40c9</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[programación]]></category>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[desarrollo-web]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Mon, 22 Jun 2020 08:01:33 GMT</pubDate>
            <atom:updated>2020-07-09T10:50:59.389Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es el último proyecto personal en el que he estado trabajando los últimos meses. Por fin ve la luz una herramienta de búsqueda de información pública que honestamente creo que puede ayudar a mucha gente.</p><p>¿Quieres conocer de qué se trata? ¿cómo funciona? ¿cómo puede ayudar a personas y empresas? Sigue leyendo que te lo cuento pero antes, te dejo un índice del contenido de este artículo:</p><ol><li>¿Qué es Zahoribo?</li><li>Problemas del mundo real que resuelve</li><li>¿Cómo resuelve estos problemas Zahoribo?</li><li>¿A quién se los resuelve?</li><li>¿Qué contenido indexa?</li><li>¿Cómo funciona el indexado de contenido?</li><li>¿Cómo funciona el buscador?</li><li>Búsquedas avanzadas</li><li>Otras secciones productivas de Zahoribo</li><li>Telegram y extensiones para navegadores</li><li>Funcionalidad para usuarios registrados</li><li>Tecnología</li><li>Proceso de desarrollo</li><li>Reflexión personal</li><li>Futuro del proyecto</li><li>Agradecimientos</li><li>Próximos artículos</li><li>Actualizaciones</li></ol><h3>1. ¿Qué es Zahoribo?</h3><p><a href="https://medium.com/://zahoribo.com"><strong>Zahoribo</strong></a> se trata de un buscador en boletines oficiales cuya <strong>misión principal</strong> es simple y directa:</p><blockquote><strong>Organizar la información oficial y hacer que sea útil y accesible para todos</strong></blockquote><p>En esencia se comporta como un pequeño ‘<em>Google</em>’ dentro de una temática muy específica como es la información oficial y pública existente en nuestras administraciones.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/906/1*JymAxrt7Knu5AsXeIPTL3w.png" /><figcaption>Buscador inicial de Zahoribo. Cuenta a día de hoy (22–06–2020) con algo más de tres millones de páginas indexadas.</figcaption></figure><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es una <strong>herramienta de búsqueda de información honesta y transparente</strong> que nace con un claro compromiso de servicio público <strong>para mejorar la vida de las personas y las empresas</strong> en la medida de lo posible.</p><blockquote><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> nace con el compromiso de mejorar de forma significativa la productividad del mayor número de personas posible.</strong></blockquote><p>Se trata de una herramienta que procura aportar el mayor beneficio posible a la sociedad.</p><h4>¿De dónde viene el nombre de <a href="https://zahoribo.com/">Zahoribo</a>?</h4><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> viene de la palabra <strong><em>zahorí</em></strong> que se suele emplear para referirse a <em>personas que son capaces de encontrar lo que está oculto</em>, especialmente manantiales subterráneos. Además, en las <em>hurdes extremeñas</em> los <em>zajorilis hurdanos</em> eran considerados hombres sabios, buenos, justos, e incluso con ciertas facultades para la adivinación o la videncia.</p><p>De <em>zahorí</em> hemos cogido el concepto de buscador de cosas ocultas y le hemos añadido el sufijo <strong>bo</strong>, de boletín, para formar el nombre completo <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>, un buscador en boletines.</p><h3>2. Problemas del mundo real que resuelve</h3><p>Como es bien sabido, en <strong>España</strong> tenemos multitud de entidades públicas de ámbito nacional, regional y local. La inmensa mayoría de estas entidades publican con una periodicidad casi diaria boletines con información relativa a sus competencias. Esta <strong>información tiene carácter público y oficial</strong>, es decir, es accesible y <strong>de obligado cumplimiento e interés para cada persona o empresa de este país</strong>.</p><p>Entonces, ¿cuáles son los problemas a resolver? Muchos, pero principalmente los tres siguientes:</p><ul><li><strong>La cantidad de información</strong>. Son miles de páginas diarias las que se publican entre todos los boletines y esto hace virtualmente imposible a una persona estar al tanto de todo lo que se publica.</li><li><strong>Fuentes de información diversas y no normalizadas</strong>. Cada boletín es accesible a través de la página web oficial de cada administración. Una persona que quisiera encontrar información de su interés tendría que ir ‘<em>saltando</em>’ de página web en página web realizando la misma búsqueda una y otra vez con la consiguiente pérdida de tiempo. Además, cada web tiene su propia forma personalizada de acceder a la información lo cual dificulta el acceso entre varias fuentes.</li><li><strong>Buscadores oficiales que no funcionan como deberían</strong>. Por ejemplo, basta ilustrar con el buscador del <a href="http://doe.gobex.es/busquedas/bus_avanzada.php">Diario Oficial de Extremadura</a> para darse cuenta del poco <em>cariño</em> que se ha puesto en su desarrollo y experiencia de usuario. Y eso cuando existe, porque hay contenido público en el que cual directamente no se puede buscar. Por ejemplo, la información de los plenos de los ayuntamientos suele estar ‘<em>colgada</em>’ en forma de archivos <strong><em>PDF’s</em></strong> cuya búsqueda en ellos de forma eficiente es prácticamente imposible.</li></ul><p>¿Y en qué se traduce todo esto? pues al final <strong>se trata también de dinero</strong>. Cada uno de los problemas expuestos anteriormente, <strong>de forma directa</strong>, hace que las personas y empresas que buscan información pública pierdan tiempo y la pérdida de tiempo se traduce la mayoría de las veces en pérdida de dinero. Y, <strong>de forma indirecta</strong>, cada uno de los problemas puede suponer la pérdida de oportunidades en forma de ayudas, subvenciones, oportunidades laborales, anuncios y publicaciones de interés para empresas y particulares…etc., que son publicadas diariamente en cada uno de los boletines.</p><h3>3. ¿Cómo resuelve estos problemas Zahoribo?</h3><p><a href="https://zahoribo.com/"><strong>Zahoribo </strong></a>es un buscador <strong>pensado para solucionar</strong> de la mejor forma posible los <strong>problemas</strong> mencionados anteriormente.</p><ul><li><strong>Centralizar y normalizar la información</strong> de manera que exista un único lugar con toda la información que cada día se publica en los distintos boletines. Esto supone una gran ventaja para los usuarios ya que evitan ir ‘<em>saltando</em>’ de administración en administración buscando sus intereses.</li><li><strong>Configurar un motor de búsqueda potente, rápido y fiable</strong>. <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> está funcionando sobre <a href="http://sphinxsearch.com/"><strong>Sphinx Search</strong></a>, un software libre que básicamente lo que hace es crear índices para acceder de forma muy rápida a los datos.</li><li><strong>Filtros potentes de información</strong>: Buscar entre millones de página puede ser una tarea complicada. <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> ha desarrollado una serie de filtros simples y avanzados para realizar búsquedas que nos lleven con éxito hasta la información deseada de forma rápida y eficiente</li><li><strong>Funcionalidad que ayuda al usuario</strong>: como las <strong>alertas</strong>, gracias a las cuales <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> busca tus intereses por ti cada día entre todo lo que se publica y te envía un correo electrónico con las novedades encontradas. O los <strong>marcadores</strong> que te ayudan a guardar en tu lista de favoritos los boletines, anuncios o páginas que más te interesen. O las <strong>etiquetas</strong>, que son palabras que etiquetan resultados de búsqueda en tiempo real ayudándote a clasificar los resultados obtenidos.</li><li><strong>Experiencia de usuario</strong>: hemos intentado que el uso del buscador sea lo más sencillo posible para cualquier persona y la presentación de la información clara y simple.</li></ul><h3>4. ¿A quién se los resuelve?</h3><p>Teóricamente <strong>todos los ciudadanos y empresas son usuarios potenciales e interesados en </strong><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>. Ya que <strong>la información oficial que publica cada administración</strong> <strong>es de obligado conocimiento y cumplimiento </strong>por parte de cada ciudadano y cada empresa.</p><p>Pero, si aún concretamos más, y pensando en usuarios de uso diario tenemos por ejemplo a cualquier persona que trabaje en la administración pública, empresas como asesorías fiscales, laborales, consultorías de todo tipo, empresas o profesionales relacionadas con el mundo legal, personas o empresas pendientes de publicaciones relacionadas con ayudas, subvenciones o puestos de trabajo…etc., sindicatos, asociaciones, fundaciones,…etc. En realidad, como hemos dicho anteriormente, cualquiera puede ser usuario potencial de <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>.</p><h3>5. ¿Qué contenido indexa?</h3><p>Actualmente <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> indexa cada día el contenido de los siguientes boletines oficiales:</p><ul><li>Boletines de ámbito nacional: <a href="https://www.boe.es/"><strong>Boletín Oficial del Estado</strong></a> (BOE) y su anexo de notificaciones que suman miles y miles de páginas cada día y el <a href="https://www.boe.es/diario_borme/"><strong>Boletín Oficial del Registro Mercantil</strong></a> (BORME).</li><li>Boletines de ámbito regional: el <a href="http://doe.gobex.es/"><strong>Diario Oficial del Extremadura</strong></a> (DOE), el <a href="https://www.dip-badajoz.es/bop/"><strong>Boletín Oficial de la Provincia de Badajoz</strong></a>, el <a href="https://bop.dip-caceres.es/bop/index.html"><strong>Boletín Oficial de la Provincia de Cáceres</strong></a>.</li><li>Boletines de ámbito local: De momento están recogidos los plenos de los ayuntamientos de <a href="https://www.ayto-caceres.es/"><strong>Cáceres</strong></a>, y los pueblos de <a href="https://www.fregenaldelasierra.es/"><strong>Fregenal de la Sierra</strong></a> y <a href="http://www.fuentedelmaestre.es/"><strong>Fuente del Maestre</strong></a> de la provincia de <strong>Badajoz</strong>.</li></ul><p>Hasta la fecha, <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> tiene entre sus objetivos principales información oficial y pública extremeña. En un futuro no muy lejano lo más probable es que abarque otras comunidades autónoma.</p><p>Puedes seguir <a href="https://zahoribo.com/calendario">el calendario de <strong>Zahoribo</strong></a> para revisar el contenido indexado.</p><h3>6. ¿Cómo funciona el indexado de contenido?</h3><p>La mayoría de los boletines se publican todos los días laborales y alguno, dependiendo de la ocasión, en fines de semana, festivos, etc. Se suelen publicar a primeras horas de la mañana y, es posible, que durante un día, y debido a motivos de urgencia e importancia, una administración publique más de un boletín sin esperar al día siguiente, los llamados boletines extras.</p><p>Teniendo esto en cuenta, <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>, cada día desde las 06:00 horas, en intervalos de 15 minutos y hasta las 09:00 horas accede a cada publicación para revisar si hay alguna publicación nueva. Si la hay la obtiene, procesa cada página extrayendo la información en ella contenida y la indexa. Además, desde las 09:00 hasta las 23:59 de cada día, durante cada hora se buscan esos boletines extras que pudieran aparecer a lo largo de la jornada.</p><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> cuenta a día de hoy (22 de Junio de 2020) con algo más de tres millones de páginas indexadas.</p><h3>7. ¿Cómo funciona el buscador?</h3><p>El funcionamiento es sencillo y similar a como funciona un buscador como <strong>Google</strong>.</p><p>La página inicial de <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> tiene un buscador en el cual iniciar el proceso de búsqueda de contenido. Además cuenta con una primera batería de filtros muy simples para seleccionar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/906/1*JymAxrt7Knu5AsXeIPTL3w.png" /><figcaption>Buscador de la página principal</figcaption></figure><p>Una vez se realice una búsqueda, se presenta la página con los resultados obtenidos en el que aparece en la parte de la izquierda la sección de los filtros que se pueden utilizar y en la parte derecha los resultados obtenidos. Cada resultado corresponde a una página y se indica el boletín y el anuncio al que pertenece, la fecha, enlaces a los mismos, un pequeño extracto que contiene el texto buscado y además la búsqueda realizada resaltada en amarillo. También es posible desplegar el contenido para ver el resultado ‘<em>en bruto</em>’ de la página.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oY5veEyGPycYuHlbEkD9rg.png" /><figcaption>Ejemplo de una página de resultados de Zahoribo</figcaption></figure><p>Dependiendo de los filtros aplicados la página puede variar en contenido pero será significativamente similar a esta vista mostrada.</p><h3>8. Búsquedas avanzadas</h3><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> funciona gracias a <a href="http://sphinxsearch.com/"><strong>Sphinx Search</strong></a>, un potente motor de búsqueda que además de rapidez en la búsqueda proporciona un sinfín de posibilidades para filtrar de forma muy avanzada millones de páginas de texto.</p><p>Aunque puedes <a href="https://zahoribo.com/ayuda/busquedas"><strong>acceder a nuestro manual de uso</strong></a> para leer más sobre estas búsquedas avanzadas, a continuación te exponemos algunas de las cosas que se pueden hacer:</p><ul><li><strong>Buscar palabras exactas</strong>: los motores de búsqueda suelen buscar por <a href="https://es.wikipedia.org/wiki/Lexema">lexemas</a>, esto es, buscar por la raíz de la palabra. Si buscas <em>subvención</em>, en realidad se buscará <em>subvenc</em> y devolverá resultados que contengan palabras como <em>subvención</em>, <em>subvenciones</em>, <em>subvencionable</em>…etc. Pero con <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es posible buscar palabras exacta. En este caso valdría buscar <em>=subvención </em>para encontrar resultados que tuvieran esa palabra exactamente.</li><li><strong>Buscar frases exactas</strong>: de igual forma, escribiendo las palabras clave entre comillas dobles se puede buscar contenido que tenga todas las palabras buscadas y en el mismo orden.</li><li><strong>Excluir palabras</strong>: se pueden hacer búsquedas que no contengan alguna palabra en concreto. Por ejemplo, puedes buscar <em>ayuda -educacion</em> y se obtendrán resultados que contenga la palabra <em>ayuda</em> pero no contenga <em>educación</em>.</li><li><strong>Buscar unas palabras u otras</strong>: es decir, puedes realizar búsquedas ‘<em>or</em>’ de forma que devuelva resultados si existe una palabra u otra. Sirve muy bien para buscar sinónimos, por ejemplo, se puede buscar <em>coches | vehículos</em> y se obtendrán resultados que contengan la palabra <em>coches</em> o <em>vehículos</em>.</li><li><strong>Al menos una palabra</strong>: se pueden hacer búsquedas e indicar que deban encontrarse resultados que incluyan una o varias de las palabras buscadas.</li><li><strong>Agrupar búsquedas</strong>: usando paréntesis se pueden agrupar búsquedas de forma que podemos hacer lo siguiente: <em>(ayudas educación) | (ayudas movilidad)</em> lo que nos daría resultados que tuvieran <em>ayudas educación</em> o <em>ayudas movilidad</em>.</li><li><strong>Buscar en campos específicos:</strong> <a href="https://zahoribo.com/ayuda/manual#consejo9">cada resultado está organizado en varios campos</a>. El @tema, @asunto y @contenido. Se pueden hacer búsquedas individuales en cada uno de ellos y/o combinarlas. Por ejemplo <em>@tema consejería educación @contenido ayudas</em> nos daría resultados que tuvieran <em>consejería</em> <em>de educación</em> en el campo tema y <em>ayudas</em> en el contenido de la página en si.</li><li><strong>Búsquedas anidadas</strong>: para buscar entre millones de páginas hace falta, en ocasiones, filtrar mucho, por eso, <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> incorpora funcionalidad para poder buscar entre resultados de búsquedas anteriores de forma recursiva.</li></ul><p>Si quieres más posibilidades de búsqueda y más ejemplos de uso te recordamos que puedes seguir el <a href="https://zahoribo.com/ayuda/busquedas"><strong>manual del usuario</strong></a>.</p><h3>9. Otras secciones productivas de Zahoribo</h3><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es básicamente un buscador de contenido pero, además, hemos querido ampliar las funcionalidades que facilitan la organización de los boletines y la búsqueda de contenido.</p><ul><li><a href="https://zahoribo.com/resumen-diario"><strong>Resumen diario</strong></a>: en esta sección se puede ver cada día un resumen de los boletines y anuncios publicados. El objetivo es que en una misma pantalla puedas revisar lo más importante del día. Además desde este resumen diario se puede acceder a un buscador de boletines por fecha o por boletín, número y año.</li><li><a href="https://zahoribo.com/calendario"><strong>Calendario</strong></a>: como su propio nombre indica es un calendario en el que se indican todos los boletines publicados por día y mes. El objetivo es que se pueda acceder fácilmente a uno de ellos por día y mes y además que el usuario pueda hacerse una idea visual de cuál y cuándo se ha publicado un boletín.</li><li><a href="https://zahoribo.com/ayuda/busquedas"><strong>Manual del usuario</strong></a>: <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> por defecto funciona de forma potente y precisa pero es posible aumentar dicha potencia y calidad de los resultados de búsqueda. Hemos creado un amplio <a href="https://zahoribo.com/ayuda/manual">manual del usuario</a> en el que se explica como funciona el buscador y una serie de consejos para poder realizar búsquedas avanzadas.</li></ul><h3>10. Telegram y extensiones para navegadores</h3><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es accesible desde otras aplicaciones. Para facilitar a los usuarios las búsquedas rápidas en nuestro contenido hemos desarrollado para las siguientes plataformas:</p><h4>Telegram</h4><p>Se ha creado un <strong><em>bot</em></strong> llamado <strong>@zahoribot</strong>. Una vez añadido como contacto, puedes realizar búsquedas con el comando<em> </em><strong><em>/buscar</em></strong><em> contenido de la búsqueda.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/980/1*7Q-7dLTpGIB6zqJgQPkziQ.png" /><figcaption>Bot de Telegram para hacer búsquedas en Zahoribo</figcaption></figure><h4>Extensiones para Chrome y Firefox</h4><p>Tanto para el navegador <strong>Chrome</strong> como para el navegador <strong>Firefox</strong> hemos creado extensiones para hacer búsquedas rápidas de contenido sobre <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>. Si quieres instalar y probar estas extensiones solo tienes que hacer clic en los siguientes enlaces y añadirlas a tu navegador favorito.</p><ul><li><a href="https://chrome.google.com/webstore/detail/zahoribo/amiicegeicphkabjpbaokkgfalmnkfmh?hl=es">Instalar extensión para Chrome</a></li><li><a href="https://addons.mozilla.org/es/firefox/addon/zahoribo/">Instalar extensión para Firefox</a></li></ul><p>Una vez instaladas podrás utilizarlas para realizar búsquedas rápidas y obtener resultados resumidos con un enlace hacia los resultados expandidos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/373/1*JOF3h4Impu7RWIqBClaPdA.png" /><figcaption>Vista de la extensión tras realizar una búsqueda</figcaption></figure><h3>11. Funcionalidad para usuarios registrados</h3><p>El posible usar <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> de forma anónima para buscar contenido. No hay problema. Ahora bien, como <a href="http://zahori.com/ayuda/manual#punto5"><strong>usuario registrado tendrás funcionalidad extra</strong></a> que podrás aprovechar para sacar mayor rendimiento a tus búsquedas.</p><h4>Alertas</h4><p>Las <strong>alertas</strong> no son más que un mecanismo que te permite ahorrar tiempo dejando que <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> busque por ti y para ti todo aquello que te interesa cada día con los nuevos boletines que se publiquen. El usuario define una búsqueda clave y si se encuentra contenido <strong>se envía un correo electrónico al usuario con los resultados de búsqueda</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/637/1*KUZ5UntzTTeorRrG0Gfh3g.png" /><figcaption>Ejemplo de alerta enviada mediante correo electrónico</figcaption></figure><h4>Etiquetas</h4><p>Un usuario registrado también puede crear <strong>etiquetas</strong>. Las etiquetas no son más que palabras (se pueden añadir hasta tres sinónimos) que ayudan a clasificar y a dar mayor contexto a cada resultado de búsqueda en tiempo real.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/322/1*4CVp5q3XAadG0W7sOFqVfw.png" /><figcaption>Ejemplo de etiqueta con la palabra principal y sinónimos</figcaption></figure><p>Una vez creada una etiqueta, cada resultado de búsqueda se etiquetará con la palabra principal si contiene esa palabra o cualquiera de sus sinónimos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/405/1*EdLVbBwSQxztWU9ij6a96g.png" /><figcaption>Visualización de las etiquetas en resultados de búsqueda</figcaption></figure><h4>Marcadores</h4><p>Los <strong>marcadores</strong> son elementos favoritos de un usuario que puede guardar junto a una descripción. Estos elementos pueden ser boletines, anuncios o páginas.</p><p>Para añadir un marcador únicamente hay que hacer clic en el icono correspondiente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/501/1*Qq-LAROn4sFb6RTPzF8VZQ.png" /><figcaption>Elementos sobre los que se puede crear un marcador</figcaption></figure><p>Y, si fuera necesario, indicar una descripción al mismo nos servirá para recordar el motivo por el que lo añadimos a nuestros marcadores favoritos:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/669/1*2YaDLUMqdps61xJ03eN1Lw.png" /><figcaption>Formulario de creación de un marcador</figcaption></figure><p>Posteriormente se pueden revisar en el panel privado de cada usuario y tenerlos siempre disponibles y además en cada búsqueda si aparece un boletín, anuncio o página marcada se mostrará visible.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/504/1*Hu4Wnfw7ALulhrBfEp16zw.png" /><figcaption>Ejemplo de marcador en resultado de búsqueda</figcaption></figure><h3>12. Tecnología</h3><p>Desarrollar un buscador que busque entre millones de páginas y que cada día se actualice con varias miles más ha supuesto para mi un reto tecnológico importante. Próximamente en este blog se publicará un artículo mucho más detallado con información técnica sobre la arquitectura y el indexado pero a modo de resumen tenemos los siguientes elementos:</p><ul><li>Dos servidores <strong>Linux</strong>.</li><li>Programado con <a href="https://laravel.com/"><strong>Laravel 6.0</strong></a>, un framework <strong>PHP</strong> y base de datos con <strong>MySql</strong>.</li><li>En cada uno de los servidores hay una instancia de <a href="http://sphinxsearch.com/"><strong>Sphinx Search</strong></a> funcionando. Ambas instancias están configuradas como índices distribuidos teniendo uno de ellos información hasta el 31 de diciembre de 2019 y el servidor principal al que accede al usuario con información desde el 1 de enero de 2020 siendo el que se actualiza diariamente.</li></ul><h3>13. Proceso de desarrollo</h3><p>Comencé a programar en el proyecto allá por noviembre de 2019 creo recordar. Una primera versión inicial no fue costosa conseguirla. El objetivo era poder mostrar el potencial de un buscador de este tipo. Con esa primera versión inicial hablé con varias personas usuarias del <strong>Diario Oficial de Extremadura</strong>. Todas me dijeron que la idea y el funcionamiento eran muy buenos, así que digamos que pude validar la idea original.</p><p>Esta fórmula he ido aplicándola en sucesivas rondas. Aplicaba mejoras y las enseñaba. Con el <em>feedback</em> recibido intentaba mejorar el producto y así sucesivamente. En todo este tiempo he hablado con personas que pertenecen tanto a entidades públicas como privadas y todas se han visto interesadas en una plataforma de este tipo. Aún así he dado algunos tumbos que me han hecho programar funcionalidad…para luego quitarla.</p><p>La parte que más me ha costado ha sido el diseño de la aplicación, tres versiones he hecho hasta que he llegado a la versión final (de momento). Además, reconozco que la parte de diseño es algo en lo que no soy bueno y por lo tanto tampoco he podido hacer mucho más que dejarlo decente, o eso espero.</p><p>También me ha llevado algún tiempo entender bien como funciona un motor de búsqueda, su uso, configuración y optimización para que los resultados fueran los mejores.</p><p>Durante el desarrollo he leído al menos dos libros para intentar que el resultado fuera el mejor posible. Uno ha sido <a href="https://www.oreilly.com/library/view/introduction-to-search/9780596809546/"><strong>Introduction to Search with Sphinx</strong></a>, y el clásico <a href="https://www.casadellibro.com/libro-no-me-hagas-pensar-actualizacion/9788441537279/2610920"><strong>No me hagas pensar</strong></a> de <strong>Steve Drug</strong>.</p><p>La publicación de la primera versión supone un punto y seguido en este proyecto cuyo futuro está lleno de novedades.</p><h3>14. Reflexión personal</h3><p><a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> es un proyecto personal. 100% personal. Todo lo que se ve y lo que no se ve lo he programado yo solo. La programación de la parte pública y privada de usuarios, la configuración de los servidores, la configuración del motor de búsqueda, el funcionamiento del propio buscador, el diseño de la página, la redacción de los textos, la distribución de la información, la programación de las extensiones para <strong>Chrome</strong> y <strong>Firefox</strong>, la interacción con el bot de <strong>Telegram</strong>, la redacción de este mismo post …etc. Todo.</p><p>Es un proyecto bonito, a mi me me gusta mucho…si no fuera así, no creo que hubiera podido finalizar y publicar la primera versión. No solo me gusta por la temática, la tecnología, el reto que ha supuesto para mi y todo lo que implica sino que además creo que <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> honestamente puede ayudar a mucha gente</strong>.</p><p>Aún así, <strong>el coste personal ha sido alto</strong>. Me ha llevado muchas horas el desarrollo y he tardado más de seis meses en publicar la primera versión y dando ‘<em>gracias</em>’ al mes en el que por el <em>coronavirus</em> los proyectos profesionales que llevo como autónomo se pararon casi todos. Ese mes lo aproveché para tirar horas de desarrollo en <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>. Desde entonces, muchos días de muchas semanas levantándome muy temprano para aprovechar un par de horas diarias, o más, al proyecto y no quitar tiempo de desarrollo a mis clientes en mi trabajo de autónomo.</p><p>Cualquier cambio, funcionalidad, configuración o incluso la redacción de este mismo artículo suponen una gran cantidad de horas que a veces es complicado asumir y justificar ante el entorno familiar, eso es así. No he medido el tiempo de desarrollo y creo que si lo hubiera medido no me habría hecho nada bien. Los proyectos personales los veo más como desarrollos en los que disfrutar sin la presión del tiempo…aunque esa presión la sienta uno de manera inconsciente cuando ve que se alargan las jornadas de programación.</p><p>A decir verdad, <strong>llevar a cabo de forma individual un proyecto grande como este es muy cansado física y mentalmente</strong>. En un período tan largo de desarrollo supone atravesar distintas fases de ánimo. Días que piensas que todo va a ir bien y días en los que piensas que el final queda muy lejos y no vas a tener ni tiempo ni energía para terminarlo. Hoy por hoy me pensaría volver a llevar un desarrollo así yo solo, lo más probable es que buscara compañeros de viaje.</p><p><strong>Pero bueno, una vez hecho, al final merece la pena</strong>, una vez lo terminas ves que todo tiene sentido (o al menos lo piensas así) y uno se siente orgulloso de lo que ha conseguido. Construir herramientas tecnológicas que ayudan a otras personas aporta mucha satisfacción personal. Atrás quedaron las noches sin dormir, las horas y horas leyendo <a href="https://stackoverflow.com/"><strong>Stackoverflow</strong></a> y otros foros similares para buscar ayuda a problemas a los que nunca me había enfrentado.</p><p>También es justo decir que <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> <strong>me ha hecho aprender mucho.</strong></p><p>Espero que <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a> ayude a otras personas. Aunque sea a una sola, con que haga la vida más fácil a una sola persona me daré por satisfecho.</p><h3>15. Futuro del proyecto</h3><p>El futuro del proyecto pasa ahora mismo por darle visibilidad y por llegar a cuantas más personas e instituciones sea posible. Además, una vez descanse, que será pronto, iré añadiendo más funcionalidad que tengo pendiente de incluir para mejorar las búsquedas y la funcionalidad que ayude al usuario.</p><p>También pasa por incluir más información, más boletines, más ayuntamientos, más información pública para ponerla a disposición de todas las personas. Este ’<em>nicho</em>’ es muy amplio y la cantidad de información por analizar todavía es enorme. Poco a poco.</p><p>Además, quedan algunos retos técnicos por llevar a cabo como es el desarrollo de un API para poder consultar Zahoribo desde cualquier otra aplicación o la integración con procesadores de lenguaje natural para poder hacer búsquedas más ‘humanas’ y no únicamente por palabras. Igualmente, poco a poco.</p><p>A raíz de <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>, también he observado una serie de necesidades en empresas y entidades públicas a las cuáles daré una solución tecnológica en las próximas semanas, a ver que tal sale. De momento son solo ideas…me las guardo y cuando las ejecute y lleve a cabo hablaré de ellas. A mi me gusta más hacer que hablar.</p><p>Y, finalmente, ojalá pudiera convertir <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a><strong> en un producto</strong>. Conseguir que alguien pague (aunque sea poco) por su uso. Haber aportado una solución a los problemas de personas y empresas y que estas consideren adecuado pagar por esa solución. Esto será otro frente que tendré que atacar muy pronto y enfrentarme a otro paradigma al cual no me he enfrentado nunca.<strong> La venta de un producto digital</strong>.</p><h3>16. Agradecimientos</h3><p>Como he comentado anteriormente, el 100% del proyecto lo he llevado en solitario, pero también es cierto que hay personas que me han dado su opinión muchas veces y a las que he preguntado quizás más de lo debido. Gracias por sus aportes y por aguantarme a <a href="https://twitter.com/RicardoOjalvo"><strong>Ricardo</strong></a> (que además me proporcionó una idea de fuente para el título muy buena y mejoras y correcciones a algunos textos) y a <a href="https://twitter.com/civantoz"><strong>Civantos</strong></a>.</p><p>Y también, en general, a todos los que desarrollan software libre y crean herramientas maravillosas para que otros podamos llevar a cabo nuestros proyectos, especialmente a los creadores de <a href="https://laravel.com/"><strong>Laravel</strong></a> y <a href="http://sphinxsearch.com/"><strong>Sphinx Search</strong></a>.</p><h3>17. Próximos artículos</h3><p>En próximos artículos del blog explicaré de forma detallada aspectos más técnicos del proyecto sobre como funciona el indexado diario, el buscador, como se configura <strong>Sphinx</strong> para obtener los mejores resultados o para funcione de forma distribuida.</p><h3>18. Actualizaciones</h3><ul><li>Artículo escrito el 30 de Junio de 2020 que explica la actualización del algoritmo de búsquedas y otras actualizaciones de la versión 1.1.0. Haz <a href="http://Actualización día 30 de Junio de 2020. Nuevo artículo sobre Zahoribo explicando las actualizaciones https://medium.com/@mpijierro/zahoribo-mejorando-el-algoritmo-de-b%C3%BAsqueda-ad55e267abe9"><strong>clic aquí para leerlo</strong></a>.</li></ul><p>Y esto es todo de momento, queda oficialmente publicada la versión 1.0.0 de <a href="https://zahoribo.com/"><strong>Zahoribo</strong></a>.</p><p>Cualquier comentario, duda, sugerencia o corrección será bienvenida. <strong>Gracias por llegar hasta el final del artículo :)</strong></p><p>¡Chimpún!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f8abb46c40c9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vida ‘freelance’ II: gestión del tiempo,  organizar el horario y generar hábitos profesionales y…]]></title>
            <link>https://mpijierro.medium.com/vida-freelance-ii-gesti%C3%B3n-del-tiempo-organizar-el-horario-y-generar-h%C3%A1bitos-profesionales-y-1a891c9bd1fe?source=rss-b20eed4a4d21------2</link>
            <guid isPermaLink="false">https://medium.com/p/1a891c9bd1fe</guid>
            <category><![CDATA[laravel]]></category>
            <category><![CDATA[emprendimiento]]></category>
            <category><![CDATA[desarrollo-personal]]></category>
            <category><![CDATA[negocios]]></category>
            <category><![CDATA[freelance]]></category>
            <dc:creator><![CDATA[Manu Pijierro]]></dc:creator>
            <pubDate>Sun, 27 Oct 2019 20:53:28 GMT</pubDate>
            <atom:updated>2019-10-28T16:57:18.221Z</atom:updated>
            <content:encoded><![CDATA[<h3>Vida ‘freelance’ II: gestión del tiempo, organizar el horario y generar hábitos profesionales y personales</h3><p>Una de las ideas más extendidas que existen alrededor de la figura del autónomo es que no tiene un horario definido. En el fondo tiene parte de razón ya que se es autónomo veinticuatro horas al día durante los siete días de la semana, y más aún cuando hablamos de sectores laborales como el desarrollo de software en el que priman labores intelectuales, ¿quién no ha estado pensando sin descanso en la solución a un problema en su ‘tiempo libre’? La mente no para.</p><p>En esta nueva etapa como ‘<em>freelance</em>’, una de las cosas que me planteé casi desde un principio era gestionar de la mejor forma posible el tiempo de mi día a día, el tiempo de mi vida. Tengo mi casa con mujer e hija de cinco años, tengo una vida profesional que me apasiona, una vida ‘personal’ con actividades que me gustaría seguir haciendo, una vida social fuera de las tres anteriores y sobre todo, un límite máximo de veinticuatro horas al día para gestionar mis prioridades. Esta palabra es muy importante en todo este tema, <strong>prioridades</strong>. Es definitiva, el objetivo es ser dueño de mi tiempo y liderarlo para sacar de cada minuto la mayor satisfacción posible.</p><h3>Tiempo limitado, tiempo suficiente</h3><p>Seguro que has pensado alguna vez, o al menos escuchado, “<em>…yo no tengo tiempo…</em>”, “<em>…imposible, no puedo, me faltan horas al día…</em>”. Uno de mis primeros cambios en la gestión del tiempo fue ser plenamente consciente del límite de veinticuatro horas que tiene un día. Me sirvió para quitarme de la cabeza ideas como la anterior “…me faltan horas…”, que lo único que me aportaban era pensar en que si yo tuviera más horas al día, podría hacer más cosas. Cuando, precisamente, es al contrario, no me faltaban horas para hacer todo lo que yo quería, sino que <strong>lo que tenía que hacer era definir realmente lo que yo quería a través de establecer una serie de <em>prioridades </em>personales y profesionales</strong>. Me hacía falta tener claro lo que de verdad me aportaba valor a mi vida que siempre, siempre, siempre, tiene que ver con lo que de verdad me apasiona. Una vez definido, solo quedaba encajar esas prioridades en veinticuatro horas diarias. El tiempo es finito, es el que es. El tiempo no se puede gestionar, va pasando, lo que si puedes hacer es gestionar tus intereses y prioridades y como las vas adaptando a ese paso del tiempo.</p><h3>Orden y progreso</h3><p>Este es el lema de la bandera de <strong>Brasil</strong>: “<em>Orden y progreso</em>”. Así de primeras suena bien, ¿verdad? Hace ya mucho tiempo que me llamó la atención esta frase y de manera interna la voy repitiendo de manera consciente y constantemente en muchas situaciones de mi vida, normalmente cuando tengo la sensación de pérdida de control de la actividad que esté realizando. Cuando programo y veo que me estoy liando…paro, pongo orden, y progreso poco a poco nuevamente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/360/1*DlX9yWEKoinC4ZiE-mziWw.png" /><figcaption>Bandera de Brasil</figcaption></figure><blockquote>Orden y progreso es un término que proviene de una frase de <a href="https://es.wikipedia.org/wiki/Auguste_Comte"><strong>Auguste Comte</strong></a>, exponente de la ideología y filosofía del positivismo: «L’amour pour principe et l’ordre pour base; le progrès pour but» — « El amor por principio, el orden por base, el progreso por fin», en francés.</blockquote><p>En mi opinión,<strong> la gestión del tiempo necesita el desarrollo de dos habilidades personales: <em>orden</em> y <em>compromiso</em></strong>. <strong>Orden</strong> significa saber colocar cada prioridad personal y profesional en el momento en el que le corresponde en el tiempo. <strong>Compromiso</strong> significa mantener un contrato contigo mismo de cumplimiento del orden establecido, es decir, ser consciente de que tienes un deber que cumplir de forma que lo mantengas en el tiempo hasta el punto justo en el que seas capaz de generar un hábito correcto de vida. Entendiendo por correcto aquel que satisfaga a cada uno de manera persona y profesional.</p><h3>Un calendario</h3><p>Tenía claras las prioridades y tenía claro el objetivo, pero sentía que todas estas ideas relacionadas con la gestión del tiempo las tenía que plasmar de alguna forma. La costumbre hizo que lo primero que hiciera fuera buscar aplicaciones para el móvil, encontré varias y ninguna me convencía. La casualidad hizo que hace ya varias semanas me tuviera que sentar con mi hija para hacer su calendario de actividades semanal. ¡<a href="https://es.wikipedia.org/wiki/%C2%A1Eureka!"><strong>Eureka</strong></a>!. Eso es, un calendario, un simple calendario en un papel situado en un lugar muy visible en mi mesa de trabajo haría que tuviera siempre presenta el ‘<em>roadmap</em>’ de mi día a día.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*35bBXertag7OewrIIBalZw.png" /><figcaption>Mi ‘APaPel’ calendario personal y profesional</figcaption></figure><p>Este calendario lo tengo pegado en la pared, casi a la altura de los ojos encima de mi mesa de trabajo diario. <strong>Es como un vigilante, hace que no me desvíe en el día a día sobre que debo hacer y cuando</strong>. Está diseñado pensando en todas esas prioridades que considero me aportan más valor en mi día a día y las mejores horas para hacerlas. Antes de comentar algunos detalles del mismo, es necesario entender un par de cuestiones: Si, me levanto muy temprano. Me encanta, aprovecho muy bien el tiempo a esas horas algo intempestivas. Claro que, por otro lado, me acuesto muy temprano también.</p><p>Algunos detalles del mismo son los siguientes:</p><ul><li><strong>Color naranja, tiempo dedicado a formación</strong>: La primera hora del día. Creo que, profesionalmente, soy una persona que siempre está en constante período formativo. Pero ahora, además, quería establecer un tiempo diario de formación principalmente por dos motivos. El primero, como ya comenté, orden. Además, no únicamente estableciendo un orden temporal de dedicación, sino que además, <strong>orden siguiendo cursos con un sentido y objetivo definidos</strong>. El segundo, <strong>tener la seguridad de que mi compromiso con la formación es lo suficientemente importante como para dedicarle al menos una hora al día como mínimo</strong>. La formación de hoy estoy seguro que me dará de comer en el medio y/o largo plazo.</li><li><strong>Color azul, tiempo dedicado a trabajo</strong>: Lo he dividido en tres bloques. Creo que esto me viene bien. La experiencia me dice que, de modo general, incluido yo, trabajar durante muchas horas seguidas suele tener como consecuencia una pérdida de rendimiento conforme pasa el tiempo. El descanso mental es necesario. Por eso, prefiero dividir este tiempo y cada bloque estar con las menores distracciones y máxima concentración posible. El tiempo de trabajo implica, por supuesto, programación, gestión comercial, facturación…etc.</li><li><strong>Color rosa, Inés</strong>: Mi hija. Para mi, sin duda, las mejores horas de cada día. Llevarla al cole y recogerla a mediodía. Además, este año como aliciente tenemos un remolque para la bici que usamos todos los días. Es que lo tengo que poner, no me aguanto:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*tsUrwox8cluv7iFND0AOcw.jpeg" /></figure><ul><li><strong>Color verde, deporte</strong>: Im-pres-cin-di-ble. Tener un rato de actividad física diaria en una profesión como la nuestra en la que pasamos demasiadas horas sentados debería ser obligatorio para todos. El cuerpo es nuestro vehículo de vida y mantenerlo con un buen estado de salud nos proporcionará la suficiente fuerza y energía para el día a día. Siendo autónomo, si cabe, tiene un poco más de importancia ya que dependes exclusivamente de ti mismo y mantenerte sano es clave personal y profesionalmente.</li></ul><p>Dos detalles más: Celdas en blanco…básicamente, tiempo de familia o tiempo para otras tareas que surjan. El domingo es libre, me permito hacer laboralmente lo que yo quiera o necesite hasta las 11:00, incluso no hacer nada si no fuera necesario.</p><h3>Mejorando la toma de decisiones</h3><p>Tener un horario para mi ha implicado compromiso de cumplirlo. Como cuando íbamos al cole, gracias a tener un horario podíamos planificar las asignaturas o tareas del día siguiente. Ahora es parecido.</p><p>De manera explícita, con una decisión he evitado múltiples decisiones diarias, es decir, una vez decidido el horario he dejado de estar tomando decisiones cada mañana sobre como va a ser mi día a día. Ya no hace falta pensar que hago mañana, a que hora lo hago, como compagino mi vida personal y profesional, cuando llevo a cabo las tareas pendientes…etc.. La decisión ya está tomada. La división ya está hecha. <strong>Para mi, planificar, significa reducir estrés. Generar hábitos, significa crear un sistema que proporcione la tranquilidad de estar haciendo lo que se debe cuando se debe, es decir, la tranquilidad de estar haciendo lo correcto en el momento oportuno.</strong></p><h3>Ser flexible</h3><p>Eso si, hay que ser prácticos y flexibles. Si la carga de trabajo aumenta por el motivo que sea para cumplir con plazos de entrega se puede modificar el horario, aumentar horas o reducirlas de algún sitio pero siempre teniendo en mente que debe ser de manera puntual. De nada sirve tener un horario si no se va a cumplir. Si adquieres el compromiso debes hacer el esfuerzo por llevarlo a cabo. Pero si las circunstancias llevan a tener que modificarlo, se hace y, en cuanto se pueda, se vuelve a la rutina.</p><h3>Tres semanas</h3><p>He querido escribir este artículo después de tres semanas cumpliendo con el horario y las prioridades que fijé en su momento. He de decir que la sensación de aprovechamiento del tiempo que tengo es muy muy muy alta porque he conseguido llevar todo lo que me gusta en mi vida…a cada día.</p><p><a href="https://pijamasurf.com/2017/06/cuanto_tiempo_se_necesita_para_formar_un_habito_aqui_la_respuesta/">Entre 21 y 66 días dicen que es necesario realizar una actividad para generar un hábito</a>. Tres semanas cumpliendo un compromiso para seguir comprometido con él mucho tiempo más.</p><p>Eso es todo por el momento. Como siempre, cualquier comentario, sugerencia, correción…etc., son bienvenidos.</p><p>¡Chimpún!</p><h3>Bibliografía</h3><ul><li><a href="https://es.wikipedia.org/wiki/Orden_y_progreso">https://es.wikipedia.org/wiki/Orden_y_progreso</a></li><li><a href="https://pijamasurf.com/2017/06/cuanto_tiempo_se_necesita_para_formar_un_habito_aqui_la_respuesta/">https://pijamasurf.com/2017/06/cuanto_tiempo_se_necesita_para_formar_un_habito_aqui_la_respuesta/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1a891c9bd1fe" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>