<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on The Flip Flop Developer</title>
    <link>https://cristiansuarez.dev/posts/</link>
    <description>Recent content in Posts on The Flip Flop Developer</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es</language>
    <lastBuildDate>Fri, 05 Dec 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://cristiansuarez.dev/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Qué es Kanban: origen, propósito y su aplicación en IT</title>
      <link>https://cristiansuarez.dev/scrum/que-es-kanban-origen-y-aplicacion-en-it/</link>
      <pubDate>Fri, 05 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/scrum/que-es-kanban-origen-y-aplicacion-en-it/</guid>
      <description>Descubre qué es Kanban, su origen en la industria manufacturera japonesa, cómo se ha adaptado al desarrollo de software y una reflexión crítica sobre su aplicación en el sector IT.</description>
    </item>
    
    <item>
      <title>JSConf JP 2025 — Bitácora de un domingo intenso</title>
      <link>https://cristiansuarez.dev/bitacora/jsconf-jp-2025/</link>
      <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/bitacora/jsconf-jp-2025/</guid>
      <description>Bitácora completa de JSConf JP 2025: desde passkeys y Qwik hasta tendencias del ecosistema web, desarrollo asistido por IA y las diferencias culturales entre eventos tech en Japón y España.</description>
    </item>
    
    <item>
      <title>Guía para redactar un post-mortem efectivo &#43; Plantilla en Markdown</title>
      <link>https://cristiansuarez.dev/operaciones/guia-para-redactar-un-post-mortem-efectivo-plantilla-en-markdown/</link>
      <pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/operaciones/guia-para-redactar-un-post-mortem-efectivo-plantilla-en-markdown/</guid>
      <description>Guía práctica paso a paso para redactar post-mortems efectivos con una plantilla profesional en Markdown lista para usar. Incluye mejores prácticas y técnicas de análisis de causa raíz.</description>
    </item>
    
    <item>
      <title>Qué es un post-mortem y por qué es útil</title>
      <link>https://cristiansuarez.dev/operaciones/que-es-un-post-mortem-y-por-que-es-util/</link>
      <pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/operaciones/que-es-un-post-mortem-y-por-que-es-util/</guid>
      <description>Aprende qué es un post-mortem, cómo transforma incidentes en aprendizaje organizacional y por qué es esencial para promover una cultura blameless que fortalece la resiliencia de tus sistemas.</description>
    </item>
    
    <item>
      <title>Un año programando con inteligencia artificial: aprendizajes y reflexiones</title>
      <link>https://cristiansuarez.dev/bitacora/un-ano-programando-con-ia/</link>
      <pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/bitacora/un-ano-programando-con-ia/</guid>
      <description>Un año de experimentos personales programando con IA: de Bolt.new, Lovable, Codespaces, Copilot, Claude Sonnet 4 y las expectativas con GPT-5 Codex.</description>
    </item>
    
    <item>
      <title>Comunicación en Tiempo Real en la Web: SSE, Webhooks y WebSockets</title>
      <link>https://cristiansuarez.dev/arquitectura/sse-vs-webhooks-vs-websockets/</link>
      <pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/arquitectura/sse-vs-webhooks-vs-websockets/</guid>
      <description>Comparativa visual y funcional entre Server-Sent Events (SSE), Webhooks y WebSockets para entender sus diferencias y casos de uso.</description>
    </item>
    
    <item>
      <title>Caso práctico con LangChain4j: asistente vertical con cálculos y preferencias</title>
      <link>https://cristiansuarez.dev/ia/caso-practico-asistente-vertical-langchain4j/</link>
      <pubDate>Tue, 02 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ia/caso-practico-asistente-vertical-langchain4j/</guid>
      <description>Cómo diseñar un asistente vertical con LangChain4j que combina herramientas, memoria estructurada y lógica determinista para ofrecer recomendaciones personalizadas.</description>
    </item>
    
    <item>
      <title>Guía visual y explicativa para no perderte en el mundo agentic (LangChain4j edition)</title>
      <link>https://cristiansuarez.dev/ia/guia-vocabulario-visual-langchain4j/</link>
      <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ia/guia-vocabulario-visual-langchain4j/</guid>
      <description>Glosario visual y funcional de conceptos clave en LangChain4j, con ejemplos y sugerencias para presentaciones y formación.</description>
    </item>
    
    <item>
      <title>El DCA y mi forma de aprender: cómo la constancia me ha cambiado</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/el-dca-y-mi-forma-de-aprender-como-la-constancia-me-ha-cambiado/</link>
      <pubDate>Tue, 26 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/el-dca-y-mi-forma-de-aprender-como-la-constancia-me-ha-cambiado/</guid>
      <description>Formarse un poco cada día es invertir en uno mismo: el conocimiento crece como el capital a largo plazo.</description>
    </item>
    
    <item>
      <title>Cómo implementar Inbox Zero en Gmail: guía técnica paso a paso</title>
      <link>https://cristiansuarez.dev/herramientas/como-implementar-inbox-zero-en-gmail-guia-tecnica-paso-a-paso/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/herramientas/como-implementar-inbox-zero-en-gmail-guia-tecnica-paso-a-paso/</guid>
      <description>Gmail ofrece herramientas perfectas para llevar Inbox Zero a la práctica de forma eficaz. Estos pasos reflejan una combinación de buenas prácticas y experiencia directa.
1. Activar funciones necesarias Ve a Configuración &amp;gt; Avanzado y habilita &amp;ldquo;Avance automático&amp;rdquo;. Luego, en Configuración &amp;gt; General &amp;gt; Avance automático, selecciona &amp;ldquo;Ir a la siguiente conversación (más reciente)&amp;rdquo;. Activa los atajos de teclado desde Configuración &amp;gt; General &amp;gt; Atajos de teclado &amp;gt; Activados. 2. Crear etiquetas clave Desde Configuración &amp;gt; Etiquetas, crea:</description>
    </item>
    
    <item>
      <title>Inbox Zero con Gmail: claridad mental y control sobre tu bandeja de entrada</title>
      <link>https://cristiansuarez.dev/herramientas/inbox-zero-con-gmail-claridad-mental-y-control-sobre-tu-bandeja-de-entrada/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/herramientas/inbox-zero-con-gmail-claridad-mental-y-control-sobre-tu-bandeja-de-entrada/</guid>
      <description>En un entorno saturado de correos electrónicos, el método Inbox Zero ofrece una solución pragmática basada en una filosofía: la bandeja de entrada no es una lista de tareas, sino un espacio para procesar información y decidir cuándo y cómo actuar.
Origen y esencia del método El concepto Inbox Zero surgió alrededor de 2006, creado por Merlin Mann, un escritor y consultor en productividad. Mann lo presentó en una serie de charlas y publicaciones en su blog 43 Folders.</description>
    </item>
    
    <item>
      <title>Mi experiencia dando una lightning talk en la Software Crafters Barcelona 2024</title>
      <link>https://cristiansuarez.dev/ponencia/mi-experiencia-dando-una-lightning-talk-en-la-software-crafters-barcelona-2024/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/mi-experiencia-dando-una-lightning-talk-en-la-software-crafters-barcelona-2024/</guid>
      <description>Hablar 7 minutos sobre TDD en la Software Crafters Barcelona fue más difícil de lo que pensaba: condensar, priorizar y aprender a confiar en lo breve.</description>
    </item>
    
    <item>
      <title>Software Crafter Barcelona 23</title>
      <link>https://cristiansuarez.dev/ponencia/software-crafter-barcelona-23/</link>
      <pubDate>Mon, 23 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/software-crafter-barcelona-23/</guid>
      <description>Les cuento mi experiencia facilitando un taller en el evento de Barcelona Software Crafters 2023</description>
    </item>
    
    <item>
      <title>Cómo ser un speaker</title>
      <link>https://cristiansuarez.dev/ponencia/como-ser-un-speaker/</link>
      <pubDate>Sat, 03 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/como-ser-un-speaker/</guid>
      <description>Consejos y recursos para empezar a dar charlas en conferencias, desde cómo mandar propuestas hasta tener charlas preparadas.</description>
    </item>
    
    <item>
      <title>Buenas prácticas documentando</title>
      <link>https://cristiansuarez.dev/reflexion/buenas-practicas-documentando/</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexion/buenas-practicas-documentando/</guid>
      <description>Reflexión sobre cómo escribir documentación clara y efectiva, evitando ambigüedades y siendo lo más concreto posible.</description>
    </item>
    
    <item>
      <title>Ese momento en el que eres el ejemplo a seguir</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/ese-momento-en-el-que-eres-el-ejemplo-a-seguir/</link>
      <pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/ese-momento-en-el-que-eres-el-ejemplo-a-seguir/</guid>
      <description>Reflexión sobre cómo ser un ejemplo para otros puede generar presión y responsabilidad inesperada.</description>
    </item>
    
    <item>
      <title>CESINF 2022</title>
      <link>https://cristiansuarez.dev/ponencia/cesinf-2022/</link>
      <pubDate>Wed, 23 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/cesinf-2022/</guid>
      <description>Otro año más que la organización del CESINF ha querido contar conmigo. Este año, he querido aportar mi granito de arena hablando de un tema transversal que se está normalizando cada vez más y he notado, hablando con amigos y conocidos, que no siempre lo llevamos de la mejor forma. ¿A que qué refiero? Al trabajo remoto.
He preparado una sesión contando varios puntos que considero clave después de casi 5 años trabajando en remoto.</description>
    </item>
    
    <item>
      <title>El gimnasio invisible del cerebro</title>
      <link>https://cristiansuarez.dev/reflexion/gimnasio-invisible-cerebro/</link>
      <pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexion/gimnasio-invisible-cerebro/</guid>
      <description>Una reflexión sobre cómo entrenar la mente cuando no existen mancuernas ni rutinas visibles, y la metáfora del gimnasio se vuelve invisible.</description>
    </item>
    
    <item>
      <title>Comó controlo mi tiempo con Toggl</title>
      <link>https://cristiansuarez.dev/herramientas/como-controlo-mi-tiempo-con-toggl/</link>
      <pubDate>Thu, 24 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/herramientas/como-controlo-mi-tiempo-con-toggl/</guid>
      <description>En estos días hemos estado hablando @ulisesantana y yo sobre Toggl. Una herramienta de tracking de tiempo que llevo usando ya unos cuantos años y se ha vuelto en mi día a día casi sin darme cuenta. Con esta aplicación puedo ver como uso mi tiempo. Principalmente, la uso para controlar las tareas que hago en las horas de trabajo.
En esta publicación les voy a contar como lo tengo configurado y como hago uso de ella.</description>
    </item>
    
    <item>
      <title>¿Qué puede mejorar de los Jupyter Notebooks?</title>
      <link>https://cristiansuarez.dev/big-data/que-puede-mejorar-de-los-jupyter-notebooks/</link>
      <pubDate>Wed, 26 Jan 2022 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/que-puede-mejorar-de-los-jupyter-notebooks/</guid>
      <description>Últimamente, a Medea que voy avanzando en el mundo del big data, me voy alejando del inicio del sistema como ingeniero de datos y me acerco un poco más a la parte de análisis de datos he visto que gusta bastante explorar datos e incluso desarrollar ciertas partes con Jupyter Notebooks. Esto, persé, no es un problema soy defensor de los Notebooks bajo situaciones concretas.
Antes de nada, te cuento muy resumidamente como funciona un Notebook.</description>
    </item>
    
    <item>
      <title>CESINF 2021 - Código sostenible</title>
      <link>https://cristiansuarez.dev/ponencia/cesinf-2021-codigo-sostenible/</link>
      <pubDate>Thu, 02 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/cesinf-2021-codigo-sostenible/</guid>
      <description>El pasado día 2 de diciembre me brindaron la oportunidad de participar en el VII congreso de estudiantes de ingeniería informática (CESINF) en la universidad de la laguna, Tenerife.
Ciertamente no esperaba tener tan buena recepción tanto por parte de la organización como de los asistentes al evento. Desde el momento de mi llegada me sentí arropado por todas las personas allí presentes.
Si bien es cierto que algunas ponencias (de las pocas a las que pude asistir) se alargaron más de lo previsto, pero la organización supo como gestionarlo quitando tiempo de la parte final de preguntas y ajustando algunos de los eventos internos que tenían preparados.</description>
    </item>
    
    <item>
      <title>He participado en coding is caring</title>
      <link>https://cristiansuarez.dev/ponencia/he-participado-en-coding-is-caring/</link>
      <pubDate>Sun, 31 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ponencia/he-participado-en-coding-is-caring/</guid>
      <description>El pasado día 11 de Octubre de 2021 me invitaron al canal de Twitch de CodignIsCaring con mis amigas Yodra y Maria. Hemos hablado de muchas cosas entre ellas IA y big data pero sobre todo nos hemos reído bastante.
No te prometo que vayas a salir de ese directo con mucho conocimiento de estos temas pero te lo vas a pasar bien seguro. La idea era hacer una introducción a estos temas ya que no conocían nada sobre ellos.</description>
    </item>
    
    <item>
      <title>pipenv vs venv</title>
      <link>https://cristiansuarez.dev/python/pipenv-vs-venv/</link>
      <pubDate>Thu, 14 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/python/pipenv-vs-venv/</guid>
      <description>Virtualenv fue la primera version para gestionar entornos en python, esto evolucionó a pipenv para tener una interfaz más cómoda y fácil de usar.
En la propia web de python recomiendan usar pipenv.
Tool recommendations: If you’re familiar with Python packaging and installation, and just want to know what tools are currently recommended, then here it is.
Application dependency management: Use Pipenv to manage library dependencies when developing Python applications. See Managing Application Dependencies for more details on using pipenv.</description>
    </item>
    
    <item>
      <title>No somos etiquetas</title>
      <link>https://cristiansuarez.dev/reflexion/no-somos-etiquetas/</link>
      <pubDate>Mon, 04 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexion/no-somos-etiquetas/</guid>
      <description>Una reflexión directa sobre por qué dejar de clasificarnos en grupos y abrazar la complejidad humana.</description>
    </item>
    
    <item>
      <title>He participado en mi primer Datathon</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/he-participado-en-mi-primer-datathon/</link>
      <pubDate>Sun, 26 Sep 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/he-participado-en-mi-primer-datathon/</guid>
      <description>El pasado día 17 de septiembre participé en mi primer datathon y, ciertamente, la experiencia ha sido extraña y mejorable 🤷‍♀️
Antes de este evento había participado en otro tipo de hackathones dónde tienes una serie de ideas (proyectos) y ciertos recursos. Con esto y un tiempo limitado (un fin de semana normalmente) tienes que desarrollar la idea en cuestión y traerla a la vida.
En este tipo de eventos no se espera que termines con una aplicación funcionando que puedas sacar al mercado.</description>
    </item>
    
    <item>
      <title>El riesgo de los resúmenes infinitos</title>
      <link>https://cristiansuarez.dev/reflexion/riesgo-resumenes-infinitos/</link>
      <pubDate>Mon, 30 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexion/riesgo-resumenes-infinitos/</guid>
      <description>Una reflexión sobre cómo en informática la técnica pierde su sentido cuando el mensaje original se diluye en resúmenes de resúmenes, y la importancia de recuperar el porqué detrás de cada práctica.</description>
    </item>
    
    <item>
      <title>Gráficas de distribución</title>
      <link>https://cristiansuarez.dev/big-data/graficas-de-distribucion/</link>
      <pubDate>Tue, 24 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/graficas-de-distribucion/</guid>
      <description>Existen multitud de gráficos para visualizar la distribución de nuestros datos y poder ver patrones. Hoy le toca el turno a dos gráficos con los que podremos ver de mejor forma como se distribuye la frecuencia de aparición de una variable respecto de otra. Estamos hablando del histograma (histogram) y el kernel density estimate (KDE, no sé cómo traducirlo 🤷‍♀️)
Histograma Un histograma no es una gráfica de barras, puede parecerlo pero tiene diferencias como que en este caso el valor por el que se distribuyen nuestra frecuencia no es un valor categórico, es continuo.</description>
    </item>
    
    <item>
      <title>Disciplina mejor que motivación</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/disciplina-mejor-que-motivacion/</link>
      <pubDate>Wed, 18 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/disciplina-mejor-que-motivacion/</guid>
      <description>Últimamente me han preguntado varias veces como consigo sacar tiempo y ganas después del trabajo para lograr seguir un rato más generando contenido. Aparte de esto me he topado con varias publicaciones y vídeos motivacionales hablando de lo importante que es estar motivado, tener un trabajo que te encante para disfrutar cada día, etc. 😃
No vengo a desmentirlo ya que ayuda muy mucho para tener más energías pero, cuándo eres una persona exigente que cada día busca mejorar más y más llegará un punto en el que te cansarás hasta de tu hobby favorito.</description>
    </item>
    
    <item>
      <title>Este mundo no es en blanco y negro</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/este-mundo-no-es-en-blanco-y-negro/</link>
      <pubDate>Fri, 06 Aug 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/este-mundo-no-es-en-blanco-y-negro/</guid>
      <description>Últimamente no sé si es que mi círculo cercano está cambiando o que estoy viendo la vida de otra forma, pero me he percatado de que cada vez más la sociedad en la que vivimos intenta polarizar toda opinión que escucha.
En este artículo quiero reflexionar sobre este tema y sobre todo me gustaría conocer tu opinión al respecto para saber si realmente es porque estoy sesgado (al fin y al cabo no conozco a todas las personas del mundo 😂)</description>
    </item>
    
    <item>
      <title>Roles dentro del big data</title>
      <link>https://cristiansuarez.dev/big-data/roles-dentro-del-big-data/</link>
      <pubDate>Fri, 16 Jul 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/roles-dentro-del-big-data/</guid>
      <description>Es normal que en cualquier ámbito de la vida existan roles para definir el alcance y los límites que tiene una persona dentro de un contexto. En parte es lo que hacemos cuando le damos nombre a las profesiones, no tiene las mismas responsabilidades un desarrollador que un tester de calidad, por ejemplo.
Dentro del ámbito del Big Data específicamente ocurre lo mismo, existen varios roles dependiendo de las responsabilidades que tengas en este tipo de proyecto.</description>
    </item>
    
    <item>
      <title>Por qué nos centramos en las herramientas más que en las bases</title>
      <link>https://cristiansuarez.dev/reflexion/por-que-nos-centramos-en-las-herramientas-mas-que-en-las-bases/</link>
      <pubDate>Wed, 23 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexion/por-que-nos-centramos-en-las-herramientas-mas-que-en-las-bases/</guid>
      <description>Reflexión sobre cómo nos centramos en buscar herramientas antes de entender realmente el problema que queremos resolver.</description>
    </item>
    
    <item>
      <title>Gráficas de relación</title>
      <link>https://cristiansuarez.dev/big-data/graficas-de-relacion/</link>
      <pubDate>Thu, 03 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/graficas-de-relacion/</guid>
      <description>Cuando nos enfrentamos a un conjunto de datos nuestro cerebro intenta crear relaciones entre los distintos conjuntos. Esto es normal, ya que como seres humanos que somos, siempre intentamos buscar una relación, es la forma que tenemos de asociar acciones. Si bebo agua me quita la sed, a mayor número de ventas de videojuegos en una consola más popular es ¿o no?
Estas relaciones que buscamos inconscientemente pueden tener o no sentido y es ahí dónde entra el papel del analista de datos.</description>
    </item>
    
    <item>
      <title>Primeras impresiones de Twitch</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/primeras-impresiones-de-twitch/</link>
      <pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/primeras-impresiones-de-twitch/</guid>
      <description>Hace unos días una compañera me preguntó: ¿hey qué tal llevas eso de hablar solo? y pensé: &amp;ldquo;ostras, ha notado que estoy loco 😅&amp;rdquo; pero antes de que hablase me aclaró. Me refiero a los directos en Twitch y demás, ¿Qué tal vas?
Sensaciones Ciertamente, no sé muy bien como explicarlo. Han sido muchas sensaciones en tan poco tiempo. Al inicio choca bastante, empiezas el directo y no sabes bien que hacer&amp;hellip; ¿Empiezo ya a hablar o espero que alguien entre?</description>
    </item>
    
    <item>
      <title>Porque me gustan los notebooks de Jupiter</title>
      <link>https://cristiansuarez.dev/big-data/porque-me-gustan-los-notebooks-de-jupiter/</link>
      <pubDate>Wed, 19 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/porque-me-gustan-los-notebooks-de-jupiter/</guid>
      <description>Cuando me inicié en este mundo no tenía claro que diferenciaba un notebook de un script de Python con texto de por medio. Ahora que ya he normalizado su uso puedo mirar atrás y comentar las principales ventajas que le veo.
Los datos se mantienen en memoria La principal ventaja que veo a trabajar con notebooks en la fase de exploración de los datos, si tenemos cuidado, es que la lectura inicial de los datos desde el origen ocurre una vez aunque &amp;ldquo;rompas&amp;rdquo; los datos.</description>
    </item>
    
    <item>
      <title>¿Cual es la diferencia entre variables cuantitativas y cualitativas?</title>
      <link>https://cristiansuarez.dev/big-data/cual-es-la-diferencia-entre-variables-cuantitativas-y-cualitativas/</link>
      <pubDate>Tue, 11 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/cual-es-la-diferencia-entre-variables-cuantitativas-y-cualitativas/</guid>
      <description>Cuando estamos trabajando con datos más temprano que tarde nos damos cuenta de que no todos los datos son iguales. Desde el tipo del dato (número, cadena de texto, número natural, etc.) hasta la forma de interpretar que tenemos esas mismas variables. No es lo mismo el número de quejas sobre un tema que el tamaño de una carretera. Estas diferencias tienen un nombre el cual vamos a explicar hoy.</description>
    </item>
    
    <item>
      <title>¿Qué son las series y los dataframes? Librería Pandas</title>
      <link>https://cristiansuarez.dev/big-data/que-son-las-series-y-los-dataframes-libreria-pandas/</link>
      <pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/que-son-las-series-y-los-dataframes-libreria-pandas/</guid>
      <description>Pandas es la librería más usada en el mundo del big data si trabajamos con Python. Esta librería tiene unas entidades propias para gestionar los datos las cuales son similares a las que ya existen en el lenguaje. Esto me ha llamado la atención y es por ello que he investigado cuales son las principales diferencias entre las listas de una y dos dimensiones respecto a las series y dataframes.</description>
    </item>
    
    <item>
      <title>Cómo facilitar una retrospectiva</title>
      <link>https://cristiansuarez.dev/scrum/como-facilitar-una-retrospectiva/</link>
      <pubDate>Fri, 30 Apr 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/scrum/como-facilitar-una-retrospectiva/</guid>
      <description>Hoy en día raro es el equipo en el que trabajamos y no usa las ceremonias &amp;ldquo;típicas&amp;rdquo;, o alguna de ellas, provenientes del framework Scrum. Hablamos de reunión diaria, planificación del sprint, revisión del sprint, retrospectiva, etc. También conocidas en Inglés como daily meeting, sprint planning, retrospective, etc.
En esta ocasión venimos a hablar en concreto sobre la retrospectiva, pero antes de empezar te contamos en que consiste.
Una reunión de retrospectiva consiste en una sesión de unos 90 minutos (a decidir por el equipo).</description>
    </item>
    
    <item>
      <title>Escribir correos con sentido</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/escribir-correos-con-sentido/</link>
      <pubDate>Fri, 23 Apr 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/escribir-correos-con-sentido/</guid>
      <description>Hace unas semanas desde English 4 Devs me invitaron a una sesión sobre hablar en público. De primeras pensaba que sería una como tantas con los mismos tres consejos, pero&amp;hellip; nada de eso 😁 Fue una sesión muy interactiva, con ejercicios por medio para poner en práctica lo aprendido y poder asentar mejor las ideas.
Uno de los puntos que más valoré entre todos los que vimos ha sido que hablar en público no ocurre solamente cuando facilitamos una charla sobre un tema con sus diapositivas, etc.</description>
    </item>
    
    <item>
      <title>Comprendiendo los heatmap (mapa de calor)</title>
      <link>https://cristiansuarez.dev/big-data/comprendiendo-los-heatmap-mapa-de-calor/</link>
      <pubDate>Tue, 20 Apr 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/big-data/comprendiendo-los-heatmap-mapa-de-calor/</guid>
      <description>Este tipo de gráfico, mapa de calor, es muy útil a la hora de comparar valores numéricos de una relación. Es decir, si por ejemplo tenemos las ventas de videojuegos clasificadas por plataforma y año como se muestra a continuación
Plataforma Año Ventas Wii 2000 100 Wii 2001 150 Wii 2002 50 DS 2000 98 DS 2001 118 DS 2002 134 Si esta tabla de datos fuera mucho mayor con cientos de miles de entradas sería bastante complicado hacer una comparación de sus datos con otro tipo de gráficas.</description>
    </item>
    
    <item>
      <title>Persistencia</title>
      <link>https://cristiansuarez.dev/docker/persistencia/</link>
      <pubDate>Sat, 20 Mar 2021 00:00:01 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/persistencia/</guid>
      <description>He escuchado varias veces decir que alguien no usa Docker porque al borrar el contenedor o al parar una base de datos toda la información se perderá en el olvido pero, nada más lejos de la realidad. Docker persiste la información en nuestro sistema no lo crea y lo mantiene en un limbo virtual 👻
Con esto quiero decir que cuando creamos un contenedor de Docker automáticamente, si no se lo indicamos, nos creará un directorio en nuestro sistema para guardar toda la información que se encuentre dentro del mismo.</description>
    </item>
    
    <item>
      <title>Trabaja con Docker sin el terminal</title>
      <link>https://cristiansuarez.dev/docker/trabaja-con-docker-sin-el-terminal/</link>
      <pubDate>Sat, 20 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/trabaja-con-docker-sin-el-terminal/</guid>
      <description>Si eres de esas personas que no le gusta mucho trabajar desde el terminal o, simplemente tienes un día en el que no te apetece escribir mucho, estás de enhorabuena. Existen varias extensiones tanto para Visual Studio Code como intellij con las que podrás gestionar docker, sus contenedores y mucho más.
Visual Studio Code Para este editor existen dos extensiones que harán tú día a día con Docker mucho más cómodo.</description>
    </item>
    
    <item>
      <title>Comandos útiles</title>
      <link>https://cristiansuarez.dev/docker/comandos-utiles/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:07 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/comandos-utiles/</guid>
      <description>En el CLI de docker existen muchas opciones, aquí te dejo las que más suelo usar explicadas.
docker container run -d IMAGE segundo plano -i IMAGE mantiene el input abierto (interactivo) -t IMAGE asigna un pseudo terminal. Estas dos últimas las suelo usar juntas casi siempre -it de esta forma (si la imagen lo permite) al arrancar se me queda una terminal abierta esperando ser usada desde dentro del contenedor. -p 8000:5000 IMAGE mapear el puerto para poder acceder.</description>
    </item>
    
    <item>
      <title>Optimización de imágenes</title>
      <link>https://cristiansuarez.dev/docker/optimizacion-de-imagenes/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:04 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/optimizacion-de-imagenes/</guid>
      <description>En este artículo veremos un comportamiento importante a la hora de crear nuestras imágenes.
Organización en capas Como veremos más adelante en nuestros Dockerfile cuando configuramos nuestra imagen ejecutamos ciertos comandos y cada comando RUN, COPY o ADD es considerado una capa. Con cada nueva instrucción de este conjunto mencionado tenemos una nueva capa que se pone sobre la anterior. Cuando nosotros creamos una imagen basada en Node, por ejemplo, esta imagen que creamos está basada en la capa de node que viene de DockerHub de node.</description>
    </item>
    
    <item>
      <title>¿Cómo crear mi primer contenedor?</title>
      <link>https://cristiansuarez.dev/docker/como-crear-mi-primer-contenedor/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:03 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/como-crear-mi-primer-contenedor/</guid>
      <description>Ahora vamos a ver como crear nuestro primer contenedor, para ello primero debemos crear una imagen de la que partir, para esto crearemos un fichero de configuración Docker. Este fichero se llama Dockerfile, en él se indican todas las instrucciones que tiene que seguir para crear la imagen y su contenido.
Proyecto de ejemplo Para este ejemplo vamos a crear una imagen de Docker que contenga un servidor en Node con un endpoint que nos devuelva un texto.</description>
    </item>
    
    <item>
      <title>¿Cómo funciona Docker?</title>
      <link>https://cristiansuarez.dev/docker/como-funciona-docker/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:02 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/como-funciona-docker/</guid>
      <description>Para comenzar basta con instalar Docker en nuestra máquina. Dependiendo de nuestro sistema operativo tendremos que seguir unos pasos u otros. La documentación oficial de Docker es muy buena y nos hará de guía en este proceso.
El caso de Windows es un poco especial, tienes que tener en cuenta que no puedes al mismo tiempo usar las máquinas virtuales y Docker porque da problemas con el Hyper-V. No estoy al día con este tema, uso Ubuntu, pero he escuchado hablar mucho sobre este problema a mis compañeros.</description>
    </item>
    
    <item>
      <title>Conceptos básicos de la toma de requisitos</title>
      <link>https://cristiansuarez.dev/toma-de-requisitos/conceptos-basicos-de-la-toma-de-requisitos/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:01 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/toma-de-requisitos/conceptos-basicos-de-la-toma-de-requisitos/</guid>
      <description>Antes de empezar necesitamos tener una serie de conceptos claros que nombraremos bastante a menudo. Estos son imagen, contenedor y volumen. Estas palabras las usaremos con frecuencia, ya que son la base de Docker.
Imagen Una imagen es una configuración para un contenedor, podemos hacer el símil cuando creamos una clase para instanciar un objeto en programación. Creamos un molde con cierta configuración y funciones en su interior que podemos instanciar (crear) tantas veces como queramos en varios objetos y siempre será de la misma forma.</description>
    </item>
    
    <item>
      <title>¿Qué es Docker?</title>
      <link>https://cristiansuarez.dev/docker/que-es-docker/</link>
      <pubDate>Mon, 15 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/docker/que-es-docker/</guid>
      <description>Docker es la forma de tener una misma configuración de un proyecto independientemente de la máquina o el sistema en el que te encuentres, siempre que tenga Docker instalado. Facilitando así los despliegues y desarrollos de aplicaciones.
Además de esto con Docker podrás trabajar y jugar con distintas herramientas y tecnologías sin llenar de paquetes que no te interesan en tu máquina.
Quiero dejar claro que Docker no es una máquina virtual, aunque de primeras puede parecerse bastante cuando veamos como funciona realmente comprobaremos que no se parece en nada.</description>
    </item>
    
    <item>
      <title>Guardar modelos en la base de datos</title>
      <link>https://cristiansuarez.dev/rails/guardar-modelos-en-la-base-de-datos/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/rails/guardar-modelos-en-la-base-de-datos/</guid>
      <description>.save devuelve true o false dependiendo de si se ejecutó correctamente o no la sentencia.
.save! lanza un error si no puede completar la sentencia.
User.new(name: &amp;#39;Pepe&amp;#39;, location: &amp;#39;ES&amp;#39;).save! User.new(name: &amp;#39;Pepe&amp;#39;, location: &amp;#39;ES&amp;#39;).save es equivalente
User.create(name: &amp;#39;Pepe&amp;#39;, location: &amp;#39;ES&amp;#39;) </description>
    </item>
    
    <item>
      <title>Helper</title>
      <link>https://cristiansuarez.dev/rails/helper/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/rails/helper/</guid>
      <description>Supongamos que tienes guardado en sesión el correo del usuario actual (una cookie) y que quieres acceder a ella en varias vistas de la aplicación. Para ello tendrías que hacer algo similar a session[:current_user_email] en cada una de las vistas donde hiciera falta.
Rails te permite simplificar y unificar esto, para ello solamente tendrás que crear un helper, si nos dirigimos a al directorio /app/helpers dentro del fichero application_helper.rb podemos crear una función de la siguiente forma.</description>
    </item>
    
    <item>
      <title>Migraciones</title>
      <link>https://cristiansuarez.dev/rails/migraciones/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/rails/migraciones/</guid>
      <description>rails generate migration no soporta valores por defecto, si queremos uso de ello tendremos que hacerlo a mano ya que Rails si que lo soporta.
Una vez nos genere la migracion, por ejemplo que tipo de formulario usa una pregunta (selección única, múltiple, completar, etc)
class AddFormTypeToQuestions &amp;lt; ActiveRecord::Migration[5.2] def change add_column :questions, :formType, :string end end Nosotros le tendremos que añadir el valor por defecto que queremos antes de ejecutar la migración con rails db:migrate</description>
    </item>
    
    <item>
      <title>Rollback una migración concreta</title>
      <link>https://cristiansuarez.dev/rails/rollback-una-migracion-concreta/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/rails/rollback-una-migracion-concreta/</guid>
      <description>Si necesitamos volver al estado anterior a la última migración en la base de datos, deshacer los cambios rails tiene una funcionalidad para ello, típica en las bases de datos rollback
rake db:rollback STEP=1 Si en lugar de deshacer una migración queremos por ejemplo deshacer 5, basta con indicarlo en el parámetro STEP
rake db:rollback STEP=5 Una vez los rollback se completan podemos borar las migraciones que se nos habían generado en /db/migration que hemos desecho.</description>
    </item>
    
    <item>
      <title>Testear módulos</title>
      <link>https://cristiansuarez.dev/javascript/testear-modulos/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/testear-modulos/</guid>
      <description>Vamos a probar el modulo que hemos sacado en la parte anterior del juego saberganar.
const saberganarQuestionNavigator = require(&amp;#39;../src/questionNavigator&amp;#39;); describe(&amp;#39;question navigator&amp;#39;, function () { let questions, navigator; beforeEach(function () { questions = [ { id: 1, question: &amp;#34;¿De que colo es el caballo blanco de santiago?&amp;#34;, answers: [ {id: 0, answer: &amp;#34;Es un unicornio, no un caballo&amp;#34;, isCorrect: false, idQuestion: 1}, {id: 1, answer: &amp;#34;Verde&amp;#34;, isCorrect: false, idQuestion: 1}, {id: 2, answer: &amp;#34;Blanco&amp;#34;, isCorrect: true, idQuestion: 1} ] }, { id: 2, question: &amp;#34;¿Como sale un perro de un tanque de agua?</description>
    </item>
    
    <item>
      <title>Validaciones presente campo false</title>
      <link>https://cristiansuarez.dev/rails/validaciones-presente-campo-false/</link>
      <pubDate>Sat, 23 Jan 2021 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/rails/validaciones-presente-campo-false/</guid>
      <description>Si tenemos un campo booleano en nuestro modelo que queremos que sea obligatorio y lo intentamos hacer con presence: true mira lo que ocurre.
Nuestro modelo option con dos campos un texto, y un boolean (is_correct)
class Option &amp;lt; ApplicationRecord validates :text, presence: true validates :is_correct, presence: true end En la base de datos las migraciones estan correctas.
ActiveRecord::Schema.define(version: 2018_08_29_112851) do create_table &amp;#34;options&amp;#34;, options: &amp;#34;ENGINE=InnoDB DEFAULT CHARSET=utf8&amp;#34;, force: :cascade do |t| t.</description>
    </item>
    
    <item>
      <title>Poner siempre llaves y return en las funciones</title>
      <link>https://cristiansuarez.dev/javascript/poner-siempre-llaves-y-return-en-las-funciones/</link>
      <pubDate>Sat, 02 Jan 2021 18:24:26 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/poner-siempre-llaves-y-return-en-las-funciones/</guid>
      <description>Ejemplo sobre porque es relevante poner las llaves y el return en javascript cuando definimos una función.
// returns: undefined // explanation: an empty block with an implicit return ((name) =&amp;gt; {})() // returns: &amp;#39;Hi Jess&amp;#39; // explanation: no block means implicit return ((name) =&amp;gt; &amp;#39;Hi &amp;#39; + name)(&amp;#39;Jess&amp;#39;) // returns: undefined // explanation: explicit return required inside block, but is missing. ((name) =&amp;gt; {&amp;#39;Hi &amp;#39; + name})(&amp;#39;Jess&amp;#39;) // returns: &amp;#39;Hi Jess&amp;#39; // explanation: explicit return in block exists ((name) =&amp;gt; {return &amp;#39;Hi &amp;#39; + name})(&amp;#39;Jess&amp;#39;) // returns: undefined // explanation: a block containing a single label.</description>
    </item>
    
    <item>
      <title>Conceptos básicos de la toma de requisitos</title>
      <link>https://cristiansuarez.dev/toma-de-requisitos/conceptos-basicos-de-la-toma-de-requisitos/</link>
      <pubDate>Wed, 20 Mar 2019 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/toma-de-requisitos/conceptos-basicos-de-la-toma-de-requisitos/</guid>
      <description>Para una buena toma de requisitos hay que centrarse en las 5 W. Las cuales vienen del inglés
What, ¿Qué es lo que necesitan?¿Cuál es su objetivo? Lo importante es saber cual es el objetivo, no como quieren que lo solucionemos o cual es el proyecto. Lo importante es cual es el objetivo de todo esto. Why, ¿Porqué lo necesitan? ¿No hay nada actualmente en el mercado que cumpla con sus necesidades?</description>
    </item>
    
    <item>
      <title>Resumen 2018</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-2018/</link>
      <pubDate>Tue, 22 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-2018/</guid>
      <description>&amp;ldquo;Quien mucho abarca poco aprieta&amp;rdquo; Esta es la frase que resume este año 2018 a la perfección. Ha sido un año con muchos cambios en todos los sentidos y a pesar de todas las vueltas que he dado creo que voy por el buen camino. He empezado tantas cosas este año y acabado tan pocas que hasta podría pensar que ha sido un mal año&amp;hellip; Pero no lo ha sido, todo lo contrario, me atrevería a decir que ha sido de los mejores de mi vida hasta el momento.</description>
    </item>
    
    <item>
      <title>Expresar agradecimiento mediante la comunicación no violenta</title>
      <link>https://cristiansuarez.dev/libros/expresar-agradecimiento-mediante-la-comunicacion-no-violenta/</link>
      <pubDate>Wed, 09 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/expresar-agradecimiento-mediante-la-comunicacion-no-violenta/</guid>
      <description>&amp;ldquo;Tu informe es muy bueno.&amp;rdquo;
&amp;ldquo;Eres una persona muy sensible.&amp;rdquo;
&amp;ldquo;Anoche fuiste muy amable al ofrecerte a acompañarme a casa.&amp;rdquo;
Estas son frases típicas de agradecimiento en nuestras vidas, y por sorprendente que parezca alienan de la vida. Si nos fijamos no revela nada de la persona que lo está emitiendo al mismo tiempo que emite juicios.
Además de esto existen personas los usan porque &amp;ldquo;funcionan&amp;rdquo;, porque según los estudios demuestran que los empleados trabajan más si los elogias.</description>
    </item>
    
    <item>
      <title>Comó liberarnos nosotros y asesorar a los demás</title>
      <link>https://cristiansuarez.dev/libros/como-liberarnos-nosotros-y-asesorar-a-los-demas/</link>
      <pubDate>Tue, 08 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/como-liberarnos-nosotros-y-asesorar-a-los-demas/</guid>
      <description>En ciertas situaciones no somos conscientes ni nosotros mismos del &amp;ldquo;mal&amp;rdquo;, estámos tan acostumbrado a verlo en el día a día que lo consideramos parte de la &amp;ldquo;rutina&amp;rdquo; diaria. Para darnos cuenta de ellos hace falta una gran cantidad de energía y un alto nivel de conciencia.
Esto requiere saber identificar las diversas necesidades y tener la capacidad de conectarse consigo mismo. En nuestra cultura ambas cosas son difíciles, no se nos ha enseñado nunca a conocer cuáles son nuestras necesidades y además están mal vistas.</description>
    </item>
    
    <item>
      <title>El uso protector de la fuerza</title>
      <link>https://cristiansuarez.dev/libros/el-uso-protector-de-la-fuerza/</link>
      <pubDate>Sat, 05 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/el-uso-protector-de-la-fuerza/</guid>
      <description>Existen situaciones, excepcionales, em las cuales el uso de la fuerza es inevitable. Como por ejemplo cuando la otra persona no está dispuesta a comunicarse y el peligro es inminente. Son situaciones en las que el uso de la fuerza es necesario, pero para ello tendremos que diferenciar entre los usos protectores y los usos primitivos.
Al usar la fuerza de manera protectora buscamos impedir daños o injusticias. La intención del uso de la fuerza de manera primitiva es la de hacer sufrir a la otra persona las consecuencias de sus malos actos.</description>
    </item>
    
    <item>
      <title>La expresión plena de la ira</title>
      <link>https://cristiansuarez.dev/libros/la-expresion-plena-de-la-ira/</link>
      <pubDate>Fri, 04 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/la-expresion-plena-de-la-ira/</guid>
      <description>Para expresar la ira con la comunicación no violenta tenemos que desconectar de los demás la responsabilidad de que nosotros estemos furiosos. Es decir tenemos que eliminar ideas de nuestra cabeza tales como: &amp;ldquo;Él o ella me hizo que me pusiera furioso cuando hizo esto otro&amp;rdquo; Nunca nos enfadamos por lo que hizo la otra persona, lo que la persona haya hecho es solo un estímulo no la causa de nuestro enfado.</description>
    </item>
    
    <item>
      <title>La conexión con uno mismo a través de la compasión</title>
      <link>https://cristiansuarez.dev/libros/la-conexion-con-uno-mismo-a-traves-de-la-compasion/</link>
      <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/la-conexion-con-uno-mismo-a-traves-de-la-compasion/</guid>
      <description>Quizás, la comunicación no violenta tenga su aplicación más importante en uno mismo. Como somos interiormente, si nos tratamos de manera violenta es difícil que seamos compasivos con los demás.
Ante nuestras propias equivocaciones, solemos enredarnos en un sentimiento de odio hacia nosotros mismos en lugar de beneficiarnos de conocer una nueva limitación que tenemos con la que poder avanzar en nuestro crecimiento personal. Si la manera con la que nos evaluamos nos lleva a sentir vergüenza y con ello cambiamos nuestra conducta, hacemos que nuestro crecimiento y aprendizaje esté guiado por el odio que nos damos a nosotros mismos ¿cómo podemos pretender actuar de distinta forma con el resto de personas?</description>
    </item>
    
    <item>
      <title>La recepción empática</title>
      <link>https://cristiansuarez.dev/libros/la-recepcion-empatica/</link>
      <pubDate>Fri, 28 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/la-recepcion-empatica/</guid>
      <description>Parafrasear lo que nos ha dicho el interlocutor puede ser de ayuda, ya que al hacer esto estámos comprendiendo y empatizando con el mensaje que trata de darnos. Es por ello que en ocasiones sea una buena práctica parafrasear el mensaje que acaba de transmitirnos. ¿Cuándo debo parafrasear y cuando no? Esto no se puede medir o dar una regla exacta, tenemos que saber en cada situación como actuar en función de distintos factores.</description>
    </item>
    
    <item>
      <title>Lo que pedimos a los demas para enriquecer nuestra vida</title>
      <link>https://cristiansuarez.dev/libros/lo-que-pedimos-a-los-demas-para-enriquecer-nuestra-vida/</link>
      <pubDate>Thu, 27 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/lo-que-pedimos-a-los-demas-para-enriquecer-nuestra-vida/</guid>
      <description>¿Cómo hago lo que no hay que hacer? Lo único que sé es que no quiero hacer lo que no hay que hacer
La letra de esta canción pone de relieve los dos problemas que surgen cuando alguien pide una cosa en forma negativa. La gente se confunde y no sabe qué se le pide en realidad. Además, lo más probable es que las peticiones negativas provoquen resistencia en la persona que las recibe.</description>
    </item>
    
    <item>
      <title>Asumir la responsabilidad de nuestros sentimientos</title>
      <link>https://cristiansuarez.dev/libros/asumir-la-responsabilidad-de-nuestros-sentimientos/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/asumir-la-responsabilidad-de-nuestros-sentimientos/</guid>
      <description>Otro de los componentes de la comunicación no violenta es reconocer el origen de nuestros sentimientos. Nuestros sentiemientos son el resultado de cómo elegimos tomarnos lo que dicen y hacen los demás.
Cuando alguien nos transmite un mensaje negativo, tenemos cuatro opciones con respecto a la manera de recibirlo. Una es tomárselo de manera personal, captando en él acusaciones y críticas. Por ejemplo, alguien nos dice:
&amp;ldquo;¡Eres la persona más egocéntrica que he conocido en mi vida!</description>
    </item>
    
    <item>
      <title>Dar desde el corazón</title>
      <link>https://cristiansuarez.dev/libros/dar-desde-el-corazon/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/dar-desde-el-corazon/</guid>
      <description>Los 4 componentes de la CNV:
Observación Sentimiento Necesidades Petición Por ejemplo una madre podría manifestar esos tres aspectos del proceso diciéndole a su hijo adolescente: &amp;ldquo;Félix, me molesta (sentimiento) ver dos calcetines sucios hechos una bola debajo de la mesita del café (observación) y otros tres al lado del televisor, porque estoy necesitando (necesidad) más orden en las habitaciones de la casa que compartimos&amp;rdquo; Acto seguido la madre abordaría el componente número cuatro, que es una petición muy específica: &amp;ldquo;¿Estarías dispuesto a recoger los calcetines y llevártlos a tu habitación o meterlos en la lavadora?</description>
    </item>
    
    <item>
      <title>Identificar y expresar los sentimientos</title>
      <link>https://cristiansuarez.dev/libros/identificar-y-expresar-los-sentimientos/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/identificar-y-expresar-los-sentimientos/</guid>
      <description>En la actualidad se nos educa para orientarnos hacia los demás más que para estar en contacto con nosotros mismos. Tenemos metida en la cabeza la siguiente pregunta: &amp;ldquo;¿Qué quieren los demás que yo diga y haga?&amp;rdquo;
Una vez tenía un compañero de habitación que ponía la música a un volumen tan alto que no me dejaba dormir, y me preguntaron que era lo que sentía con eso. A lo que respondí: &amp;ldquo;Siento que por la noche no habría que poner la música tan alta&amp;rdquo;.</description>
    </item>
    
    <item>
      <title>La comunicación que bloquea la compasión</title>
      <link>https://cristiansuarez.dev/libros/la-comunicacion-que-bloquea-la-compasion/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/la-comunicacion-que-bloquea-la-compasion/</guid>
      <description>La comunicación que nos aliena de la vida surge de las sociedades jerárquicas o de dominación, y las sustenta. Cuando los pueblos están controlados por un número pequeño de individuos que buscan el beneficio propio, a los reyes, zares, nobles, etc., les resulta muy útil que las masas se eduquen con una mentalidad de esclavos. A tal efecto, el lenguaje de lo incorrecto y de expresiones como &amp;ldquo;deberías&amp;rdquo; y &amp;ldquo;tienes que&amp;rdquo; es totalmente adecuado para ese propósito: cuanto más acostumbramos a las personas a pensar en términos de juicios moralistas que implican lo que está mal o incorrecto, tanto más aprenden a mirar hacia fuera de sí mismos.</description>
    </item>
    
    <item>
      <title>Observar sin evaluar</title>
      <link>https://cristiansuarez.dev/libros/observar-sin-evaluar/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/observar-sin-evaluar/</guid>
      <description>Observar si envaluar Si combinamos la observación y la evaluación seguramente la otra persona escuchará una crítica
La comunicación no violenta, no nos dice que seamos totalmente objetivos ni tampoco que nos abstengamos de hacer evaluaciones. Lo único que nos dice es que mantengamos una separación entre nuestras observaciones y nuestras evaluaciones.
Comunicación Ejemplo observación con evaluación Ejemplo observación sin evaluación Uso del verbo “ser” sin indicar si la persona que evalúa acepta o no la responsabilidad de la evaluación Eres demasiado generoso Cuando te veo darle a alguien el direno para tu almuerzo, creo que eres demasiado generoso Uso de verbos con connotaciones evaluativos Pepe siempre posterga las cosas Pepe sólo estudia para los exámenes la noche anterior Dar por sentado que las inferencias que uno hace de las ideas, los sentimientos, los proyectos y los deseos de otra persona son las únicas posibles No terminará el trabajo a tiempo No creo que termine el trabajo a tiempo Confundir una predicción con una certeza Si tu alimentación no es equilibrada, vas a enfermarte Si tu alimentación no es equilibrada, temo que te enfermes No ser específico al citar ejemplos Las minorías no cuidan su vivienda No he visto que la familia que vive en el número 123 de la calle Pepe retire la nieve de la acera de su casa Usar palabras que implican habilidad sin precisar que se hace una evaluación Pepe Pérez juega mal al fútbol Pepe Pérez no ha marcado un gol en veinte partidos Usar adverbios y adjetivos de maneras que no indiquen que se hace una evaluación Pepito es feo No encuentro a Pepito físicamente atractivo Palabras como &amp;ldquo;a menudo&amp;rdquo; o &amp;ldquo;rara vez&amp;rdquo; contribuyen también a confundir la observación con la evaluación.</description>
    </item>
    
    <item>
      <title>Feeders</title>
      <link>https://cristiansuarez.dev/proyectos/feeders/</link>
      <pubDate>Mon, 17 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/proyectos/feeders/</guid>
      <description>Este proyecto comenzó a inicios de 2016, un amigo (Pablo) y yo queríamos tener dónde poder ver los partidos oficiales de League of Legends de las distintas ligas. Porque hasta ese día si queríamos ver algo era ir uno a la casa del otro y no siempre teníamos la casa disponible. Nuestra idea era hablar con algún local que nos quedase cerca a ambos si nos dejaba los Jueves, que por aquel entonces eran los días de los partidos de la liga española (LVP), poner en una tele estos partidos e ir allí con más gente.</description>
    </item>
    
    <item>
      <title>Ver recursos del sistema en tiempo real</title>
      <link>https://cristiansuarez.dev/ubuntu/ver-recursos-del-sistema-en-tiempo-real/</link>
      <pubDate>Thu, 11 Oct 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ubuntu/ver-recursos-del-sistema-en-tiempo-real/</guid>
      <description>Instalar indicator-multiload
sudo apt install indicator-multiload Iniciar el programa. Por defecto, te mostrara un grafico en la barra superior del sistema. Si pulsamos sobre él y nos dirigimos a preferencias podremos seleccionar que quiere que se muestre en el gráfico, personalmente no uso esta parte. Pero si nos vamos a Indicator items... aqui esta la de lo que se esta mostrando en mi barra.
&amp;ndash; CAPTURA DEL ESCRITORIO INDICANDO QUE BARRA HABLO</description>
    </item>
    
    <item>
      <title>Cambiar mensaje del bash</title>
      <link>https://cristiansuarez.dev/ubuntu/cambiar-mensaje-del-bash/</link>
      <pubDate>Tue, 09 Oct 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ubuntu/cambiar-mensaje-del-bash/</guid>
      <description>Típicamente tu bash en linux tendrá la siguiente estructura
nombre-de-usuario@nombre-de-maquina/host:directorio-actual~$ cristian-suaver@maquina-linux-de-criskrus:/Descargas~$ Esto puede llegar a se mucho y taparnos la pantalla casi por completo es por ello que lo podemos cambiar a nuestro gusto. Para hacer esto cambio tenemos que modificar una variable llamada PS1, si queremos hacerlo de manera que persista en el sistema lo haremos desde el archivo .bashrc en nuestro directorio home (~). Una vez abierto buscamos donde declara la variable y lo modificamos a nuestro gusto.</description>
    </item>
    
    <item>
      <title>Módulos clases y mixin</title>
      <link>https://cristiansuarez.dev/ruby/modulos-clases-y-mixin/</link>
      <pubDate>Thu, 27 Sep 2018 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/modulos-clases-y-mixin/</guid>
      <description>Las clases son objetos.
Los módulos son librerías. Estos proveen métodos que se pueden usar en diferentes clases.
Class Module instantiation puede ser instanciado NO puede ser instanciado usage crear objetos facilidad para el mixin, te provee un namespace superclass module object methods métodos de clase y métodos de instancia métodos de módulo y métodos de instancia inheritance hereda el comportamiento y puede ser la base de la herencia NO herencia inclusion NO puede ser incluido puede ser incluido en clases y módulos usando el comando include (incluye todos los métodos de instancia como métodos instancia en una clase/módulo) extension NO puede ser extendido con el comando extend (solo con herencia) puede extender la instancia usando el comando extend (extiende la instancia dada con métodos singleton del módulo (module)) Mixins Si incluyes con el mixin un módulo en una clase, puedes hacer uso de todos los métodos del módulo en una instancia de la clase.</description>
    </item>
    
    <item>
      <title>Absence validator</title>
      <link>https://cristiansuarez.dev/ruby/absence-validator/</link>
      <pubDate>Tue, 25 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/absence-validator/</guid>
      <description>En Ruby on Rails existe un validador con el nombre de absence, este la primera vez que lo vi pensé &amp;quot;¿Para que quiere comprobar que un valor no existe?&amp;quot; Pero luego leyendo este post me ha parecido útil a la hora de definir campos en el modelo que se encuentran en la base de datos y esta los genera automáticamente. Como por ejemplo un ID
class User include ActiveModel::Validations attr_accessor :id, :name validates :id, absence: true end De esta forma modelamos que el usuario tiene un ID pero no puede ser impuesto desde el la aplicación, lo dejamos para la base de datos.</description>
    </item>
    
    <item>
      <title>Curiosidades de ruby parte 2</title>
      <link>https://cristiansuarez.dev/ruby/curiosidades-de-ruby-parte-2/</link>
      <pubDate>Sun, 23 Sep 2018 09:01:14 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/curiosidades-de-ruby-parte-2/</guid>
      <description>Si queremos tener métodos que son independientes del objeto podemos hacerlos con métodos de clase.
class Foo def self.class_method true end end Estos métodos se llaman directamente desde la clase y no desde el objeto Foo.class_method
Re-Raising exceptions Articulo original ruby-doc.org
Con la sentencia raise lanzas una excepción con el mensaje que le pasemos por parámetro.
raise &amp;#34;ouch&amp;#34; De esta manera nos llegará una excepción de esta forma.
RuntimeError: ouch rescue HatchError =&amp;gt; err puts $!</description>
    </item>
    
    <item>
      <title>Ejecutar un solo test</title>
      <link>https://cristiansuarez.dev/ruby/ejecutar-un-solo-test/</link>
      <pubDate>Sat, 15 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/ejecutar-un-solo-test/</guid>
      <description>En nuestros test podemos definir etiquetas, si queremos ejecutar un solo test podemos definir una que sea :focus de manera que en el test que queramos que se ejecute hacemos :focus =&amp;gt; true
describe &amp;#34;group with tagged specs&amp;#34; do it &amp;#34;example I&amp;#39;m working now&amp;#34;, :focus =&amp;gt; true do; end it &amp;#34;special example&amp;#34;, :type =&amp;gt; &amp;#39;special&amp;#39; do; end it &amp;#34;slow example&amp;#34;, :skip =&amp;gt; true do; end it &amp;#34;ordinary example&amp;#34;, :speed =&amp;gt; &amp;#39;slow&amp;#39; do; end it &amp;#34;untagged example&amp;#34; do; end end Si ahora cuando ejecutamos nuestros test hacemos rspec .</description>
    </item>
    
    <item>
      <title>Test en ruby</title>
      <link>https://cristiansuarez.dev/ruby/test-en-ruby/</link>
      <pubDate>Sat, 08 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/test-en-ruby/</guid>
      <description>Artículo original en rspec-info
Instalar la gema Primero creamos un archivo Gemfile en la raiz de nuestro proyecto con al menos el siguiente contenido
source &amp;#34;https://rubygems.org&amp;#34; gem &amp;#39;rspec&amp;#39;, &amp;#39;~&amp;gt; 3.0&amp;#39; Luego instalamos las gemas que hemos indicado en nuestro fichero Gemfile mediante
bundle install --binstubs Con todo instalado iniciamos la suite de test
bin/rspec --init Creamos nuestro primer test
require &amp;#39;rspec&amp;#39; describe &amp;#39;My first test&amp;#39; do it &amp;#39;should do works fine&amp;#39; do expect(true).</description>
    </item>
    
    <item>
      <title>Resumen segundo trimestre</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-segundo-trimestre/</link>
      <pubDate>Wed, 05 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-segundo-trimestre/</guid>
      <description>Hola voy a intentar ponerte al día lo más rápido que pueda de estos cuatro meses, pero te aviso han dado para mucho y han sido muy moviditos jajaja
Grado Primero lo primero, he acabado el grado en ingeniería informática. Ya he presentado el trabajo fin de grado y todo correcto me he orlado y ya puedo decir adiós a la universidad, bueno casi&amp;hellip; Aún tengo que ir a solicitar el título que no he tenido lugar y ahora entenderás porque.</description>
    </item>
    
    <item>
      <title>Yield</title>
      <link>https://cristiansuarez.dev/ruby/yield/</link>
      <pubDate>Mon, 03 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/yield/</guid>
      <description>Artículo completo en ruby-doc.org
Una sentencia yield es similar a un callback en JavaScript. Defines un bloque de código y lo pasas como argumento de un método, este segundo que lo recibe lo ejecuta internamente donde quiere mediante el uso de yield. Como se verá en el ejemplo siguiente defines tu método y luego a este le envías un bloque de código que dentro ejecutas dos veces.
def twice yield yield end twice {puts(&amp;#34;Hello World!</description>
    </item>
    
    <item>
      <title>Blocks procs lambda</title>
      <link>https://cristiansuarez.dev/ruby/blocks-procs-lambda/</link>
      <pubDate>Sat, 01 Sep 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/blocks-procs-lambda/</guid>
      <description>Los proc se crean de la siguiente forma: p = Proc.new {|bla| puts &amp;#34;I&amp;#39;m a proc that says #{bla}!&amp;#34; } p = proc {|bla| puts &amp;#34;I&amp;#39;m a proc that says #{bla}!&amp;#34; } Las lambda se crean de la siguiente forma: lmb = lambda {|bla| &amp;#34;I&amp;#39;m also a proc, and I say #{bla}&amp;#34; } also_lmb = -&amp;gt;(bla) { &amp;#34;I&amp;#39;m also a proc, and I say #{bla}&amp;#34; } Diferencias Procs son como blocks, lambdas son como métodos anónimos.</description>
    </item>
    
    <item>
      <title>Filtros</title>
      <link>https://cristiansuarez.dev/ruby/filtros/</link>
      <pubDate>Wed, 29 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/filtros/</guid>
      <description>Cuando estamos implementando nuestro controlador en Ruby es posible que en algunos casos tengamos que comprobar antes de cada acción (método) algo como por el ejemplo el caso de la sesión. Es decir, comprobar que el usuario está logeado para poder realizar esa acción concreta o ver las credenciales del mismo para comprobar si tiene permisos para ello.
Esto se puede hacer en Ruby de manera sencilla con los filtros (filters).</description>
    </item>
    
    <item>
      <title>Constantes</title>
      <link>https://cristiansuarez.dev/ruby/constantes/</link>
      <pubDate>Mon, 27 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/constantes/</guid>
      <description>Las constantes se definen escribiendo la primera letra en mayúsculas, pero normalmente se escriben todas ellas. Si despues de definir esta constante tratas de modificarla te salta un aviso de que estás modificando una constante.
MAX_SPEED = 100 MAX_SPEED = 1000 # warning: already initialized constant MAX_SPEED # warning: previous definition of MAX_SPEED was here En cambio si la constante es un objeto y tratas de modificarlo no dice nada (dado que está guardando la referencia a memoria), para poder evitar que nos modifiquen una constante objeto existe el método freeze.</description>
    </item>
    
    <item>
      <title>Variables</title>
      <link>https://cristiansuarez.dev/ruby/variables/</link>
      <pubDate>Sat, 25 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/variables/</guid>
      <description>Ruby permite cuatro tipos de variables:
Variable local, las variables locales son variables que están definidas en un método. Estas variables no están disponible fuera del método. Las variables locales empiezan con letra minúscula o guión bajo (_) variable_name def method foo = Array.new end # foo no esta definida aqui, no existe Variables de instancia, están disponible en todos los métodos de cualquier de cualquier instancia u objeto. Esto quiere decir que las variables de instancia cambian de un objeto a otro.</description>
    </item>
    
    <item>
      <title>Usar PUG en Firebase</title>
      <link>https://cristiansuarez.dev/firebase/usar-pug-en-firebase/</link>
      <pubDate>Sat, 18 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/firebase/usar-pug-en-firebase/</guid>
      <description>Si ya tenemos nuestra aplicación funcionando con firebase hosting y firebase functions podemos añadir el sistema de plantillas PUG, por ejemplo, para mostrar las pantallas dinámicamente de manera fácil.
Si no tienes tu aplicación ya en funcionamiento con estas tecnologías, en este post muestro como se hace y se automatiza el despliegue.
Primero que nada tendremos que añadir la dependencia de PUG
npm install pug --save Ahora en nuestro index.js podremos indicarle que estamos usando este sistema de plantillas y posteriormente usarlas.</description>
    </item>
    
    <item>
      <title>Despliegue automático en Firebase hosting desde Github</title>
      <link>https://cristiansuarez.dev/firebase/despliegue-automatico-en-firebase-hosting-desde-github/</link>
      <pubDate>Sat, 11 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/firebase/despliegue-automatico-en-firebase-hosting-desde-github/</guid>
      <description>Para desplegar automáticamente nuestra aplicación en el sistema de hosting de Firebase usaremos una herramienta llamada travis.
Crear un fichero en la raiz de nuestro proyecto .travis.yml donde configurar todo lo referente al despliegue. En este primer ejemplo indicamos el lenguaje con el que trabajamos y su versión. Además, le indicamos que tiene que instalar las herramientas de firebase y que si todo sale bien lo despliegue con el token que le indicaremos a continuación.</description>
    </item>
    
    <item>
      <title>Node.js apps en Firebase</title>
      <link>https://cristiansuarez.dev/firebase/node-js-apps-en-firebase/</link>
      <pubDate>Sat, 04 Aug 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/firebase/node-js-apps-en-firebase/</guid>
      <description>Si queremos podemos montar nuestra aplicación Node.js en firebase hosting usando firebase functions de manera gratuita y sin muchos problemas. A continuación muestro como inicial el proyecto.
Instalación y configuración Primer paso instalar firebase-tools en caso de no tenerlo instalado. Basta con ejecutar:
npm install -g firebase-tools
A continuación dentro de nuestro directorio donde usaremos para la aplicación iniciamos un hosting con firebase:
firebase init hosting
Durante la configuración nos hará varias preguntas, donde se alojará la parte pública de la aplicación y si esta será SPA o no, decidiremos en nuestro caso concreto y continuamos.</description>
    </item>
    
    <item>
      <title>Curiosidades de ruby</title>
      <link>https://cristiansuarez.dev/ruby/curiosidades-de-ruby/</link>
      <pubDate>Mon, 30 Jul 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/ruby/curiosidades-de-ruby/</guid>
      <description>Para acceder a los arrays podemos hacerlo de varias formas, una de ellas es mediante los corchetes. Estos son muy flexibles, podemos hacer muchas cosas con ellos. Podemos acceder con
[0..2] elementos desde 0 hasta 2 [0], [1], [2] [0, 2] 2 elementos desde el 0 [0], [1] [-1] el último elemento [0..2] = &#39;A&#39; elementos desde el 0 hasta el 2 sustituye por &amp;lsquo;A&amp;rsquo; deja un solo elemento, une los tres seleccionados en uno solo a = Array.</description>
    </item>
    
    <item>
      <title>Inyección de dependencia</title>
      <link>https://cristiansuarez.dev/patrones-de-dise%C3%B1o/inyeccion-de-dependencia/</link>
      <pubDate>Sat, 28 Jul 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/patrones-de-dise%C3%B1o/inyeccion-de-dependencia/</guid>
      <description>La inyección de dependencia consiste, como su nombre indica, en añadir, insertar dependencia a un objeto. Esto no es recomendable porque creas una dependencia grande entre objetos. Pero en ocasiones es la mejor solución que tenemos para asegurarnos de que el objeto B que usamos dentro del objeto A es el que queremos y como lo queremos, en lugar de uno que importemos.
Una interfaz puede ser algo como IDisposable, IEnumerable o IPrintable.</description>
    </item>
    
    <item>
      <title>Olores del código: test</title>
      <link>https://cristiansuarez.dev/libros/olores-del-codigo-test/</link>
      <pubDate>Sat, 14 Jul 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/olores-del-codigo-test/</guid>
      <description>Existen muchas cosas que no huelen bien en el código y a continuación vas a poder ver las referentes a los test. Esta es una publicación parte de una serie de publicaciones que haré referentes a olores del código.
Test Test insuficientes, ¿cuantos test debe tener mi suite? Siento tener que decírtelo pero no hay una métrica para ello. Tienes que tener tantos test como para probar todo lo que puede fallar.</description>
    </item>
    
    <item>
      <title>Objeto Página (pageObject)</title>
      <link>https://cristiansuarez.dev/patrones-de-dise%C3%B1o/objeto-pagina-page-object/</link>
      <pubDate>Wed, 11 Jul 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/patrones-de-dise%C3%B1o/objeto-pagina-page-object/</guid>
      <description>Cuando te encuentras haciendo test para una aplicación que no tiene módulos testables y tienes que hacerlo contra la interfaz directamente, es muy probable que te encuentres ante esta situación:
// scoreBoard.spec.js // [...] it(&amp;#39;should save score after answer a question&amp;#39;, function () { startGame(); selectOption(0); submitAnswer(); addPlayerName(players[1]); saveScore(); expectScoreToContainsMinusOne(); }); function startGame() { let startButton = document.getElementById(&amp;#39;start-button&amp;#39;); startButton.click(); } function selectOption(optionId) { let answer = document.getElementById(optionId); answer.click(); expect(answer.checked).toBeTruthy(); } // [.</description>
    </item>
    
    <item>
      <title>Extraer objeto en JavaScript</title>
      <link>https://cristiansuarez.dev/javascript/extraer-objeto-en-javascript/</link>
      <pubDate>Sat, 30 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/extraer-objeto-en-javascript/</guid>
      <description>Vamos a ver como extraer un objeto en JavaScript en su versión de ECMAScript 5. Partimos de un fichero donde tenemos todas las funcionalidades y vemos que una de ellas es claramente un objeto que podemos extraer.
// main.js function application(){ // {...} let actualQuestionIndex = 0; function isThereMoreQuestions() { return actualQuestionIndex &amp;lt; questions.length -1; } function getQuestion() { return questions[actualQuestionIndex]; } function goToNextQuestion() { if (isThereMoreQuestions()) { actualQuestionIndex++; } } function resetQuestions() { actualQuestionIndex = 0; } // {.</description>
    </item>
    
    <item>
      <title>Olores del código: funciones y nombres</title>
      <link>https://cristiansuarez.dev/libros/olores-del-codigo-funciones-y-nombres/</link>
      <pubDate>Sat, 23 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/olores-del-codigo-funciones-y-nombres/</guid>
      <description>Existen muchas cosas que no huelen bien en el código y a continuación vas a poder ver las referentes a funciones y nombres. Esta es una publicación parte de una serie de publicaciones que haré referentes a olores del código.
Funciones 1.Muchos argumentos, las funciones son mejores cuantos menos argumentos tengan. Lo ideal es que no tengan ninguno y como máximo tres, a partir de tres deberías cuestionarte si los argumentos no son realmente un objeto con esas características, por ejemplo.</description>
    </item>
    
    <item>
      <title>Olores del código: comentarios y entorno</title>
      <link>https://cristiansuarez.dev/libros/olores-del-codigo-comentarios-y-entorno/</link>
      <pubDate>Sat, 16 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/olores-del-codigo-comentarios-y-entorno/</guid>
      <description>Existen muchas cosas que no huelen bien en el código y a continuación vas a poder ver las referentes a comentarios y al entorno. Esta es una publicación parte de una serie de publicaciones que haré referentes a olores del código.
Comentarios Se que lo hemos hablado en varias ocasiones pero una vez más, los comentarios no son una mejora del código. Al contrario, suelen entorpecer más de lo que ayudan por las siguientes razones:</description>
    </item>
    
    <item>
      <title>JUnit Internos</title>
      <link>https://cristiansuarez.dev/libros/junit-internos/</link>
      <pubDate>Sat, 09 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/junit-internos/</guid>
      <description>JUnit es de los frameworks open source más famosos de testing en Java. Es simple en su concepto, preciso y elegante de implementar. Además al tener tanta fama y tantos seguidores podemos encontrar documentación de sobra.
Ejemplo básico Supongamos que tenemos una calculadora con la siguiente implementación. No es importante la implementación en si, pero si quieres reproducir un test te lo dejo, por aquí ;)
public class Calculator { public int evaluate(String expression) { int sum = 0; for (String summand: expression.</description>
    </item>
    
    <item>
      <title>Código reutilizable</title>
      <link>https://cristiansuarez.dev/javascript/codigo-reutilizable/</link>
      <pubDate>Tue, 05 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/codigo-reutilizable/</guid>
      <description>El objetivo de un codigo es que sea mantenible, no reutilizable. Rara vez reutilizamos el codigo, este enfoque es muy de los años ochenta.
Cuando trabajamos es mejor si lo hacemos con objetos propios de nuestro dominio. En vez de usar objetos del lenguaje, como arrays o strings.</description>
    </item>
    
    <item>
      <title>Value object</title>
      <link>https://cristiansuarez.dev/javascript/value-object/</link>
      <pubDate>Mon, 04 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/value-object/</guid>
      <description>Cuando llamo al then devuelve una nueva promesa
Patron value object, dos objetos que son el mismo tipo pero que varian en el contenido [&amp;hellip;]
Si tenemos que modificar variables de estado del objeto esto no es un value object, cuando esto ocurre devolvemos un objeto nuevo. Esto son objetos inmutables como ejemplos tenemos los strigns
En un value object un objeto es igual a otro si ambos tienen el mismo contenido.</description>
    </item>
    
    <item>
      <title>Refinamiento Sucesivo</title>
      <link>https://cristiansuarez.dev/libros/refinamiento-sucesivo/</link>
      <pubDate>Sat, 02 Jun 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/refinamiento-sucesivo/</guid>
      <description>Si te mostrara ahora un trozo de código y te dijese: &amp;ldquo;Mira que limpio está&amp;rdquo; podrías pensar que esto ha salido a la primera de mi cabeza porque soy muy bueno pero no es así. Cuando escribes un código la mayoría de veces te pasará que empiezas a hacer cosas &amp;ldquo;porque funcionan&amp;rdquo; sin pensar mucho en las buenas prácticas sobretodo cuando estás empezando con ellas. Pero no por eso debes dejarlo pasar.</description>
    </item>
    
    <item>
      <title>Promesas</title>
      <link>https://cristiansuarez.dev/javascript/promesas/</link>
      <pubDate>Wed, 30 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/promesas/</guid>
      <description>De donde vienen y porque surge la necesidad.
The callback hell, callbacks anidados unos dentro de otros sin parar es algo comun en javaScript
Es un objeto que se crea con el new que recibe como parametro un callback pero solo uno y este como parametros dos callbacks que son los casos de que la promesa termine bien y en caso de que ocurra un error.
Tienen dos metodos principales then() y catch() los cuales se ejecutan cuando la promesa termina de manera correcta o erronea respectivamente.</description>
    </item>
    
    <item>
      <title>Concurrencia</title>
      <link>https://cristiansuarez.dev/libros/concurrencia/</link>
      <pubDate>Sat, 26 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/concurrencia/</guid>
      <description>Concurrencia&amp;hellip; Aaaah mi amiga la concurrencia, como te quiero y te odio a la vez. Tú junto con la recursividad has sido, de momento, los dos conceptos que más me ha costado entender en la informática. Es de esas cosas que o entiendes a la primera o tardas tiempo hasta que un día, hace &amp;ldquo;click&amp;rdquo; en tú cabeza y todo cobra sentido, vamos a por ti ¿eres realmente tan necesaria?</description>
    </item>
    
    <item>
      <title>Asincronía</title>
      <link>https://cristiansuarez.dev/javascript/asincronia/</link>
      <pubDate>Thu, 24 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/asincronia/</guid>
      <description>En algunas ocasiones tenemos que hacer un test y que este espere un tiempo hasta que una funcion termine, ya que esta es asincrona. Para ello tenemos la siguiente posible implementacion.
function it (theSubject, funct){ function doneCallback() { console.log(&amp;#39;done&amp;#39;); } try { if (funct.length &amp;gt;=1) { funct(doneCallback); } else { funct(); } console.log(theSubject); } catch (error) { throw theSubject + &amp;#39;:&amp;#39; + error; } } } it (&amp;#39;foo&amp;#39;, function(doneCallback){ var x = 1; cosole.</description>
    </item>
    
    <item>
      <title>Extraer un modulo, testearlo y sustituirlo por el anterior</title>
      <link>https://cristiansuarez.dev/javascript/extraer-un-modulo-testearlo-y-sustituirlo-por-el-anterior/</link>
      <pubDate>Mon, 21 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/extraer-un-modulo-testearlo-y-sustituirlo-por-el-anterior/</guid>
      <description>Duplicar el codigo en un nuevo objeto, exportar este si no lo estaba para que sea accesible desde fuera y comenzar el test. Una vez ya podemos testearlo hacer los test necesarios. Con ello podremos comenzar a cambiar el modulo y a hacer el refactor.
Esto es como se hacía en ES5
let saberganar = saberganar || {}; (function(namespace) { namespace.questionNavigator = function (question) { // all implementation code here } })(saberganar); comprobamos si nuestro namespace saberganar existe, si no partimos de uno vacio, y le añadimos a este nuestro modulo nuevo questionNavigator.</description>
    </item>
    
    <item>
      <title>Test con un explorador de verdad</title>
      <link>https://cristiansuarez.dev/javascript/test-con-un-explorador-de-verdad/</link>
      <pubDate>Sun, 20 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/javascript/test-con-un-explorador-de-verdad/</guid>
      <description>Puedes ver como el explorador se abre y va haciendo clicks en los enlaces, etc. Test end2end, estos test son buenos cuando la aplicación a probar no es testable, probamos directamente la interfaz como si fueramos un usuario final. Pero por otra parte si en el futuro la interfaz cambia ya sea porque tiene otro ID el botón o ya no existe, los test dejaran de funcionar. Estos test se deben de usar solo como andamio, debido a su fragilidad debemos usarlo cuando no sea posible hacer test de otra forma y durante la fase de refactor hasta que tengamos un aplicacion testable.</description>
    </item>
    
    <item>
      <title>Sistemas</title>
      <link>https://cristiansuarez.dev/libros/sistemas/</link>
      <pubDate>Sat, 05 May 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/sistemas/</guid>
      <description>En este capítulo el autor empieza con un símil que me gusta mucho y voy a tratar de traducir lo más fielmente que sé.
¿Cómo construirías una ciudad? ¿Podrías administrar todos los detalles por ti mismo? Probablemente no. Incluso administrar una ciudad es mucho para una sola persona. Sin embargo, las ciudades funcionan (la mayor parte del tiempo) Funcionan porque tienen equipos de personas que administran partes de la ciudad, el sistema de agua, etc [&amp;hellip;] Las ciudades funcionan porque tienen los niveles apropiados de abstracción y modularidad haciendo posible para las personas y &amp;ldquo;componentes&amp;rdquo; se las arreglen para trabajar efectivamente, sin entenderla a gran escala.</description>
    </item>
    
    <item>
      <title>Resumen 2018, primer trimestre</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-2018-primer-trimestre/</link>
      <pubDate>Mon, 30 Apr 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/resumen-2018-primer-trimestre/</guid>
      <description>Empecé este año con unos objetivos claros, pero sin saber como lograr alguno de ellos. Quería hacer ejercicio al menos la mitad de los días de la semana, ya que me paso muchas horas en frente del ordenador y no es muy sano que digamos&amp;hellip; Quería tomarme más en serio las lecturas que empiezo y terminar al menos dos libros este año (uno tendría que ser técnico), quería lanzar una aplicación por mi cuenta o en equipo, algo que pueda decir &amp;ldquo;fui parte de ello&amp;rdquo;, quería tener un hábito de escritura que me haga aprender a escribir mejor, quería (y casi era una obligación para lograr todos estos) aprender a centrarme en los objetivos que me marque cada día y, el que tenía más claro, acabar el grado en ingeniería informática.</description>
    </item>
    
    <item>
      <title>Clases</title>
      <link>https://cristiansuarez.dev/libros/clases/</link>
      <pubDate>Sat, 28 Apr 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/clases/</guid>
      <description>Hasta ahora hemos visto como escribir de la mejor manera posible lineas y bloques de código, pero aun no hemos visto como hacerlo con las clases.
Ordenar los métodos A la hora de organizar las clases es importante que si tenemos un método que hace uso de otro que tenemos en nuestra clase, es mejor si lo ponemos a continuación, de manera que si estamos leyendo el código no tengamos que dar saltos en él y sea lo más parecido a un artículo.</description>
    </item>
    
    <item>
      <title>Test Unitarios</title>
      <link>https://cristiansuarez.dev/libros/test-unitarios/</link>
      <pubDate>Sat, 21 Apr 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/test-unitarios/</guid>
      <description>La programación a evolucionado mucho en tan solo 20 años, antes por 1997 cuando estaba empezando no había forma de probar las funciones que creábamos. No era raro crear la función añadirle una parte en la que podamos introducir por teclado caracteres o alguna orden y ver como responde este, pero a día de hoy existen los test unitarios. Test que ejecutarán nuestra función y comprobarán si el resultado obtenido es el que nosotros esperábamos.</description>
    </item>
    
    <item>
      <title>Límites</title>
      <link>https://cristiansuarez.dev/libros/limites/</link>
      <pubDate>Sat, 14 Apr 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/limites/</guid>
      <description>Cuando consumimos una API de terceros existe un conflicto de ideas entre quien la crea y quien la consume. Los creadores quieren llegar a la mayor cantidad de público posible y, los consumidores de esta, quieren que sea lo más consisa posible y esté lo mejor enfocada con su problema para evitar funcionalidades superfluas. Por ejemplo si usamos un Map es normal ver lo siguiente repetidas veces en nuestro código.</description>
    </item>
    
    <item>
      <title>Manejo de errores</title>
      <link>https://cristiansuarez.dev/libros/manejo-de-errores/</link>
      <pubDate>Sat, 07 Apr 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/manejo-de-errores/</guid>
      <description>Puede sonar raro hablar de errores en un libro que trata sobre código limpio, pero los errores son algo que ocurre porque somos humanos y como tal erramos. Un usuario puede perfectamente introducir un dato no válido y esto tenemos que controlarlo de alguna manera.
Usa excepciones en lugar de códigos de error Antes era normal ver en funciones esta función devolverá un número mayor a 0 en caso de que termine correctamente, en caso contrario -1 si no se encontró el fichero, -2 si no se pudo acceder, etc.</description>
    </item>
    
    <item>
      <title>Objetos y estructuras de datos</title>
      <link>https://cristiansuarez.dev/libros/objetos-y-estructuras-de-datos/</link>
      <pubDate>Sat, 31 Mar 2018 23:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/objetos-y-estructuras-de-datos/</guid>
      <description>¿Porque crear variables privadas si acto seguido creamos los getters y setters? Con esto hacemos que el modificador private pierda el sentido.
Los getter y setter solo deben estar cuando sea necesario su existencia porque estamos compartiendo esos datos crudos. Cuando creamos una clase lo hacemos con la intención de mostrar unos datos con un formato. Por ejemplo, si estamos con una clase que sea para control del combustible de un vehículo ¿Cual de las dos clases siguientes esta mejor?</description>
    </item>
    
    <item>
      <title>Formato</title>
      <link>https://cristiansuarez.dev/libros/formato/</link>
      <pubDate>Sun, 25 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/formato/</guid>
      <description>¿Dejar una linea en blanco entre métodos o no? ¿El corchete de inicio de la función en la misma linea o en la siguiente? ¿Los campos de la clase todos en la parte superior o al final? Parecen pequeños detalles insignificantes pero a la hora de leer y comprender lo que hemos hecho es mejor seguir siempre un mismo estilo y mas aun si estamos trabajando en equipo. A veces depende del lenguaje que usemos pero en la gran mayoría de casos es un tema del cada persona.</description>
    </item>
    
    <item>
      <title>Comentarios</title>
      <link>https://cristiansuarez.dev/libros/comentarios/</link>
      <pubDate>Thu, 22 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/comentarios/</guid>
      <description>Comentarios, un buen comentario puede ser muy útil, puede ser la mejor ayuda que encontraste ese día pero, por otra parte pueden ser tan dañinos y malvados que ni el mismo autor de ellos sabrá porque están ahí. La mala noticia es que la mayoría de las veces los comentarios entran en este segundo grupo.
Malos comentarios No arreglan mal código Se supone que cuando dejamos un comentario lo hacemos para suplir alguna carencia que tenemos en el código así que primer consejo, no maquilles mal código con comentarios.</description>
    </item>
    
    <item>
      <title>Hack for good 2018, Canarias</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/hack-for-good-2018-canarias/</link>
      <pubDate>Sun, 18 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/hack-for-good-2018-canarias/</guid>
      <description>El pasado 8 de Marzo asistí a mi primer Hackaton junto a mi compañero de batalla Javier Santana. La primera sorpresa fue nada más llegar, íbamos con una idea preconcebida de encontrar una gran cantidad de frikis de la informática allí, realmente si lo pienso ahora en frío no se porqué, pero fue todo lo contrario encontramos personas de muchas disciplinas dirección de empresas, magisterio, diseño, incluso un profesional que venía huyendo del día a día de su trabajo quería desconectar y pensar en nuevos retos.</description>
    </item>
    
    <item>
      <title>Funciones</title>
      <link>https://cristiansuarez.dev/libros/funciones/</link>
      <pubDate>Thu, 15 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/funciones/</guid>
      <description>Como ya vimos en el capítulo anterior nombrar coherentemente es importante, pero no es lo único que tenemos que hacer. Las funciones si están bien nombradas pero ocupan 3.000 líneas no son precisamente algo manejable, y buscar donde se produce un error en ellas será un dolor de cabeza. El libro recomienda que cada función ocupe tanto como abarque tu pantalla, siempre y cuando esta no sea extremadamente grande, unas 20 (llegando al límite, pero con la mitad sobra para poder cumplir con su objetivo la función)</description>
    </item>
    
    <item>
      <title>Nombres significativos</title>
      <link>https://cristiansuarez.dev/libros/nombres-significativos/</link>
      <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/nombres-significativos/</guid>
      <description>En este capítulo se trata un tema el cual me importa especialmente, nombrar variables, métodos, clases o cualquier cosa que requiera ser nombrada. Es algo que en los inicios de mi aprendizaje con la programación nadie me dijo y después de dos años me di cuenta y he ido corrigiendo poco a poco.
Evita la desinformación &amp;amp; Usa nombres que revelen infromación Dar un buen nombre puede llevar tiempo, pero ayuda a ahorrar más en el futuro.</description>
    </item>
    
    <item>
      <title>Código limpio</title>
      <link>https://cristiansuarez.dev/libros/codigo-limpio/</link>
      <pubDate>Sun, 04 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/codigo-limpio/</guid>
      <description>Todo este capítulo se dedica a hacernos ver la importancia que tiene el código, que este sea lo más limpio posible y, los diferentes puntos de vista sobre que es código limpio. Además muestra como afecta en gran medida en los proyectos actuales y a los equipos que lo desarrollan.
¿Que es el código limpio? Para algunos de los autores que nombra, el código limpio es un código el cual es placentero de leer, otros nombran que tiene que ser enfocado, sin rodeos, elegante entre otros calificativos con los que estoy bastante de acuerdo.</description>
    </item>
    
    <item>
      <title>Prefacio</title>
      <link>https://cristiansuarez.dev/libros/prefacio/</link>
      <pubDate>Thu, 01 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/libros/prefacio/</guid>
      <description>Se resume en una frase: &amp;ldquo;Las pequeñas cosas si importan&amp;rdquo;
La filosofía de las 5 S:
Sort, ordenar, saber dónde están las cosas. Darles nombres significativos para que se más fácil. Systematize, sistematizar. Como dice el dicho: Un lugar para cada cosa y cada cosa en su lugar. Cada trozo de código debe estar donde se espera que esté y, si no lo está, refactor ya!! Shine, limpieza. Mantener el espacio de trabajo limpio no dejes trozos de código comentados porque &amp;ldquo;Me harán falta en el futuro&amp;rdquo; eso no ocurre.</description>
    </item>
    
    <item>
      <title>Udacity Developer Challenge Scholarship</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/udacity-developer-challenge-scholarship/</link>
      <pubDate>Sun, 25 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/udacity-developer-challenge-scholarship/</guid>
      <description>El pasado 3 de Noviembre me llegó un mensaje al correo que no me esperaba, Google me había seleccionado para Developer Challenge Scholarship, en el apartado de android. Hace dos años intenté hacer este mismo curso con mis compañeros de Google Developer Group Gran Canaria pero por esa época, sentía que no iba a ser capaz no tenía conocimientos. Excusas tontas, miedos sin sentido, pero ahora lo he enfocado de manera distinta y con muchas ganas.</description>
    </item>
    
    <item>
      <title>Primera página y controlador</title>
      <link>https://cristiansuarez.dev/symfony/primera-pagina-y-controlador/</link>
      <pubDate>Mon, 19 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/symfony/primera-pagina-y-controlador/</guid>
      <description>Para crear nuestra primera página basta con crear un nuevo documento PHP
// src/Controller/LuckyController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; class LuckyController { public function number() { $number = mt_rand(0, 100); return new Response( &amp;#39;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Lucky number: &amp;#39;.$number.&amp;#39;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#39; ); } } Y luego añadir en nuestro archivo config/routes.yaml la siguiente línea:
app_lucky_number: path: /lucky/number controller: App\Controller\LuckyController::number Si entramos en localhost:8000/lucky/number veremos el resultado.
Anotaciones Para evitar tener que poner cada ruta en este archivo manualmente, usaremos las anotaciones.</description>
    </item>
    
    <item>
      <title>Configurar el IDE</title>
      <link>https://cristiansuarez.dev/symfony/configurar-el-ide/</link>
      <pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/symfony/configurar-el-ide/</guid>
      <description>En este caso usaré para el desarrollo el PhpStorm, instalaremos el plug-in de Symfony desde
File &amp;gt; Settings &amp;gt; Plugins &amp;gt; Browse repositories&amp;hellip;
Donde lo buscaremos e instalaremos.
Una vez instalados lo configuraremos para nuestro proyecto
File &amp;gt; Settings &amp;gt; Languages &amp;amp; Frameworks &amp;gt; PHP &amp;gt; Symfony
Marcamos Enable Plugin for this Project cerramos el proyecto y lo volvemos a abrir.
Tras ello podemos configurar el estilo del código de acuerdo con Symfony, si queremos</description>
    </item>
    
    <item>
      <title>Desplegar en Heroku</title>
      <link>https://cristiansuarez.dev/symfony/desplegar-en-heroku/</link>
      <pubDate>Thu, 15 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/symfony/desplegar-en-heroku/</guid>
      <description>Tras subir el proyecto a Github, podremos desplegarlo en Heroku de manera bastante sencilla.
Entramos a nuestra cuenta de Heroku y creamos una nueva aplicación. Le damos un nombre y en la parte de desplegar deployment lo conectamos con nuestra cuenta de Github. Buscamos nuestro proyecto y lo seleccionamos. A continuación, para evitarnos tener que desplegar cada versión a mano y dado que trabajaremos desde la rama develop en nuestro repositorio, marcamos la opción de Enable Automatic Deploys haciendo que con cada push a master, se despliegue automáticamente.</description>
    </item>
    
    <item>
      <title>Iniciar el proyecto Symfony</title>
      <link>https://cristiansuarez.dev/symfony/iniciar-el-proyecto-symfony/</link>
      <pubDate>Tue, 13 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/symfony/iniciar-el-proyecto-symfony/</guid>
      <description>Estando en el directorio en el que queremos crear el proyecto ejecutamos
composer create-project symfony/skeleton my_project Siendo my_project el nombre del proyecto.
Una vez descargado todo, se crea el árbol de directorios y nos indica que debemos entrar en el directorio del proyecto y ejecutar
php -S 127.0.0.1:8000 public/index.php Con ello nuestro terminal quedara &amp;ldquo;inutilizado&amp;rdquo; ejecutando el proyecto, para cerrarla bastara con pulsar la combinación de teclas Ctrl + c</description>
    </item>
    
    <item>
      <title>Instalar PHP</title>
      <link>https://cristiansuarez.dev/symfony/instalar-php/</link>
      <pubDate>Sun, 11 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/symfony/instalar-php/</guid>
      <description>Instalar PHP y algún extra
sudo apt-get install php sudo apt-get install php-xdebug sudo apt-get install php-intl Comprobar la versión de PHP instalada
php -v Instalar los estándares del estilo de código y comentarios que sigue Symfony, estos son los PSR-0 PSR-1 PSR-2 PSR-4 de PHP. Para esto instalaremos php-codesniffer
sudo apt-get install php-codesniffer Instalar estándares de código Con esto ya tendremos donde instalar estándares de desarrollo, en mi caso:</description>
    </item>
    
    <item>
      <title>Me presento</title>
      <link>https://cristiansuarez.dev/reflexi%C3%B3n/me-presento/</link>
      <pubDate>Sun, 11 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://cristiansuarez.dev/reflexi%C3%B3n/me-presento/</guid>
      <description>Mi nombre es Cristian Suárez Vera soy un chico de 22 años, que si todo sale bien este 2018 será Graduado en Ingeniería Informática, residente en las Islas Canarias. Me gusta el mundo de la programación y el emprendimiento.
¿Esto que es? Mi blog personal, o mejor dicho es el lugar donde escribiré mis divagaciones sobre cualquier tema que se me ocurra, por varias razones las cuales te contaré justo ahora.</description>
    </item>
    
  </channel>
</rss>
