<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>0xHaise - Blog</title><description>Blog</description><link>https://0xhaise.github.io/</link><language>es</language><item><title>autenticacion-con-estadoysinestado</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/autenticacion-conestado-sinestado/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/autenticacion-conestado-sinestado/</guid><description>Breve explicación sobre la autenticación con estado y sin estado, sus diferencias y casos de uso.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Autenticación Stateless vs Stateful&lt;/h1&gt;
&lt;p&gt;Durante mucho tiempo, la autenticación fue &lt;strong&gt;stateful&lt;/strong&gt;: el usuario ingresaba sus credenciales, el servidor creaba un ID de sesión y lo almacenaba del lado del servidor. Todos los datos del usuario se guardaban en el servidor, y cualquier servicio que necesitara esos datos debía consultar primero el almacén. Esto era aceptable porque al centralizar la información, era menos probable que los datos se corrompieran. Sin embargo, generó problemas en arquitecturas complejas, ya que consultar el almacén en cada operación resultaba costoso. De ahí surgió la idea de la autenticación &lt;strong&gt;Stateless&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Autenticación Basada en Cookies/Sesión (Stateful)&lt;/h2&gt;
&lt;p&gt;La autenticación basada en cookies ha sido el método predeterminado y probado para manejar la autenticación de usuarios por mucho tiempo. Es &lt;strong&gt;stateful&lt;/strong&gt;, lo que significa que se debe mantener un registro de autenticación o sesión tanto en el servidor como en el cliente. El servidor necesita rastrear las sesiones activas en una base de datos, mientras que en el frontend se crea una cookie que contiene el identificador de sesión.&lt;/p&gt;
&lt;h3&gt;Flujo de autenticación con Cookies&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;./concookies.png&quot;&gt;concookies&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    actor Usuario
    participant Cliente
    participant Servidor
    participant BaseDeDatos

    Usuario-&amp;gt;&amp;gt;Cliente: Ingresa credenciales
    Cliente-&amp;gt;&amp;gt;Servidor: Envía credenciales (POST /login)
    Servidor-&amp;gt;&amp;gt;BaseDeDatos: Verifica credenciales
    BaseDeDatos--&amp;gt;&amp;gt;Servidor: Credenciales válidas
    Servidor-&amp;gt;&amp;gt;BaseDeDatos: Crea y almacena sesión
    Servidor--&amp;gt;&amp;gt;Cliente: Responde con Cookie (session_id)
    Cliente-&amp;gt;&amp;gt;Cliente: Almacena cookie en el navegador

    Note over Usuario,BaseDeDatos: Solicitudes subsiguientes

    Cliente-&amp;gt;&amp;gt;Servidor: Solicitud + Cookie (session_id)
    Servidor-&amp;gt;&amp;gt;BaseDeDatos: Verifica session_id
    BaseDeDatos--&amp;gt;&amp;gt;Servidor: Sesión válida
    Servidor--&amp;gt;&amp;gt;Cliente: Responde con datos

    Note over Usuario,BaseDeDatos: Cierre de sesión

    Cliente-&amp;gt;&amp;gt;Servidor: Logout
    Servidor-&amp;gt;&amp;gt;BaseDeDatos: Elimina sesión
    Servidor--&amp;gt;&amp;gt;Cliente: Elimina cookie
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pasos:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario ingresa sus credenciales de inicio de sesión.&lt;/li&gt;
&lt;li&gt;El servidor verifica que las credenciales sean correctas y crea una sesión que luego almacena en una base de datos.&lt;/li&gt;
&lt;li&gt;Se coloca una cookie con el ID de sesión en el navegador del usuario.&lt;/li&gt;
&lt;li&gt;En solicitudes posteriores, el ID de sesión se verifica contra la base de datos y, si es válido, se procesa la solicitud.&lt;/li&gt;
&lt;li&gt;Una vez que el usuario cierra sesión, la sesión se destruye tanto en el cliente como en el servidor.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Autenticación Basada en Tokens (Stateless)&lt;/h2&gt;
&lt;p&gt;La autenticación basada en tokens es &lt;strong&gt;stateless&lt;/strong&gt;. El servidor no lleva registro de qué usuarios están conectados ni qué JWTs han sido emitidos. En cambio, cada solicitud al servidor va acompañada de un token que el servidor usa para verificar la autenticidad. El token generalmente se envía como un encabezado &lt;code&gt;Authorization&lt;/code&gt; adicional en la forma &lt;code&gt;Bearer {JWT}&lt;/code&gt;, aunque también puede enviarse en el cuerpo de una solicitud POST o como parámetro de consulta.&lt;/p&gt;
&lt;h3&gt;Flujo de autenticación con JWT (Token)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;./conjwt.png&quot;&gt;conjwt&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    actor Usuario
    participant Cliente
    participant Servidor

    Usuario-&amp;gt;&amp;gt;Cliente: Ingresa credenciales
    Cliente-&amp;gt;&amp;gt;Servidor: Envía credenciales (POST /login)
    Servidor-&amp;gt;&amp;gt;Servidor: Verifica credenciales y firma el JWT
    Servidor--&amp;gt;&amp;gt;Cliente: Retorna JWT firmado
    Cliente-&amp;gt;&amp;gt;Cliente: Almacena JWT (localStorage / cookie)

    Note over Usuario,Servidor: Solicitudes subsiguientes

    Cliente-&amp;gt;&amp;gt;Servidor: Solicitud + Header: Authorization: Bearer {JWT}
    Servidor-&amp;gt;&amp;gt;Servidor: Decodifica y verifica el JWT
    Servidor--&amp;gt;&amp;gt;Cliente: Responde con datos

    Note over Usuario,Servidor: Cierre de sesión

    Cliente-&amp;gt;&amp;gt;Cliente: Elimina JWT del almacenamiento local
    Note right of Servidor: No se necesita contactar al servidor
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pasos:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario ingresa sus credenciales de inicio de sesión.&lt;/li&gt;
&lt;li&gt;El servidor verifica que las credenciales sean correctas y devuelve un token firmado.&lt;/li&gt;
&lt;li&gt;El token se almacena del lado del cliente, comúnmente en &lt;code&gt;localStorage&lt;/code&gt;, aunque también puede almacenarse en &lt;code&gt;sessionStorage&lt;/code&gt; o en una cookie.&lt;/li&gt;
&lt;li&gt;Las solicitudes posteriores al servidor incluyen este token como un encabezado &lt;code&gt;Authorization&lt;/code&gt; adicional.&lt;/li&gt;
&lt;li&gt;El servidor decodifica el JWT y, si el token es válido, procesa la solicitud.&lt;/li&gt;
&lt;li&gt;Una vez que el usuario cierra sesión, el token se destruye del lado del cliente; no se necesita interacción con el servidor.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Ventajas del enfoque Stateless&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Menor uso de memoria:&lt;/strong&gt; Imagina si Google almacenara información de sesión de cada uno de sus usuarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facilita el uso de granjas de servidores:&lt;/strong&gt; Si necesitas datos de sesión con más de un servidor, debes sincronizarlos, normalmente mediante una base de datos. Con tokens esto no es necesario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduce problemas de expiración de sesión:&lt;/strong&gt; Las sesiones que expiran pueden causar errores difíciles de encontrar y reproducir. Las aplicaciones sin sesión no sufren de esto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enlazabilidad de URLs:&lt;/strong&gt; Algunos sitios almacenan el ID de lo que el usuario está viendo en la sesión, lo que impide compartir URLs directamente. Con tokens esto no ocurre.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Desventajas del enfoque Stateless&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clave secreta comprometida:&lt;/strong&gt; Lo mejor y lo peor del JWT es que depende de una sola clave. Si un desarrollador o administrador descuidado o malintencionado la filtra, ¡todo el sistema queda comprometido!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No se puede gestionar al cliente desde el servidor:&lt;/strong&gt; No es posible forzar el cierre de sesión de un usuario de forma remota (por ejemplo, si le roban el móvil).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No se pueden enviar mensajes a los clientes:&lt;/strong&gt; Al no haber registro de clientes conectados en la base de datos, no es posible hacer push de mensajes a todos ellos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Los algoritmos criptográficos pueden quedar obsoletos:&lt;/strong&gt; El JWT depende completamente del algoritmo de firma, y en el pasado varios algoritmos han sido deprecados.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sobrecarga de datos:&lt;/strong&gt; El tamaño del token JWT es mayor que el de un token de sesión normal. Cuantos más datos se añadan, más grande se vuelve linealmente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mayor complejidad de comprensión:&lt;/strong&gt; El JWT usa algoritmos criptográficos de firma para verificar los datos. Si el desarrollador no los entiende bien, puede introducir vulnerabilidades de seguridad.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>arquitectura-navegadores-web</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/arquitectura-navegadores-web/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/arquitectura-navegadores-web/</guid><pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;¿Cómo Funcionan los Navegadores Web?&lt;/h1&gt;
&lt;p&gt;Comprender cómo funciona un navegador web es esencial para cualquier desarrollador. Esta herramienta no solo interpreta el código que escribimos, sino que lo transforma en interfaces interactivas que los usuarios pueden ver y utilizar.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;¿Qué es un navegador web?&lt;/h2&gt;
&lt;p&gt;Un &lt;strong&gt;navegador web&lt;/strong&gt; es una aplicación que permite acceder a sitios web. Cuando se introduce una dirección como &lt;code&gt;https://www.google.com&lt;/code&gt;, el navegador se comunica con el servidor correspondiente, solicita los recursos necesarios (HTML, CSS, JavaScript, imágenes, etc.) y presenta la página al usuario de forma visual.&lt;/p&gt;
&lt;p&gt;Algunos de los navegadores más utilizados son Google Chrome, Safari, Mozilla Firefox y Microsoft Edge. Actualmente, &lt;strong&gt;Google Chrome&lt;/strong&gt; domina el mercado con aproximadamente un 65 % de uso global, seguido por &lt;strong&gt;Safari&lt;/strong&gt; con un 18 %.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;¿Qué ocurre internamente en el navegador?&lt;/h2&gt;
&lt;p&gt;Aunque la interfaz del navegador parece simple, internamente ejecuta múltiples procesos complejos. Estos procesos pueden dividirse en los siguientes componentes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Interfaz de usuario&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Motor del navegador (Browser Engine)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Persistencia de datos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Motor de renderizado (Rendering Engine)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Red (Networking)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intérprete de JavaScript&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backend de interfaz de usuario (UI Backend)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;src/assets/images/web-browsers/components-web-browser.png&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Interfaz de usuario&lt;/h2&gt;
&lt;p&gt;Es todo aquello visible en el navegador que no forma parte directa del contenido del sitio web. Incluye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Barra de direcciones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Botones de navegación (atrás, adelante)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menús de configuración&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gestión de pestañas&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Motor del navegador&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;motor del navegador&lt;/strong&gt; actúa como coordinador entre la interfaz de usuario, el motor de renderizado y los distintos subsistemas. Interpreta las acciones del usuario (como hacer clic en &quot;Atrás&quot;) y determina qué procesos ejecutar. También gestiona configuraciones internas y herramientas para desarrolladores.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Persistencia de datos&lt;/h2&gt;
&lt;p&gt;El navegador puede almacenar datos localmente en el dispositivo del usuario a través de diversos mecanismos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cookies&lt;/strong&gt;: datos pequeños (hasta 4 KB), enviados con cada solicitud HTTP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Local Storage / Session Storage&lt;/strong&gt;: almacenamiento clave-valor con capacidad de hasta 5 MB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IndexedDB&lt;/strong&gt;: base de datos NoSQL, asincrónica, adecuada para estructuras complejas y operaciones CRUD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CacheStorage&lt;/strong&gt;: almacenamiento de respuestas HTTP, utilizado comúnmente por aplicaciones offline (como las PWAs).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Motor de renderizado&lt;/h2&gt;
&lt;p&gt;Este componente es responsable de mostrar el contenido en pantalla. Toma los archivos HTML, CSS y JavaScript y los convierte en una página visual e interactiva.&lt;/p&gt;
&lt;p&gt;Algunos motores de renderizado conocidos son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blink&lt;/strong&gt; (utilizado por Chrome, Edge y Opera)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WebKit&lt;/strong&gt; (utilizado por Safari)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gecko&lt;/strong&gt; (utilizado por Firefox)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Etapas del proceso de renderizado&lt;/h3&gt;
&lt;h4&gt;1. Análisis (Parsing)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;El archivo HTML se convierte en el &lt;strong&gt;DOM&lt;/strong&gt; (Document Object Model).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El CSS se transforma en el &lt;strong&gt;CSSOM&lt;/strong&gt; (CSS Object Model).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El JavaScript es interpretado por el motor correspondiente (por ejemplo, &lt;strong&gt;V8&lt;/strong&gt; en Chrome).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Nota: si el HTML contiene errores, el navegador puede corregirlos automáticamente mediante un parser tolerante.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4&gt;2. Árbol de renderizado&lt;/h4&gt;
&lt;p&gt;Se construye el &lt;strong&gt;árbol de renderizado&lt;/strong&gt; combinando el DOM y el CSSOM. Este árbol contiene únicamente los elementos visibles y determina cómo deben mostrarse.&lt;/p&gt;
&lt;p&gt;Se consideran estilos como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display: none&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display: block&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display: inline&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display: inline-block&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;display: list-item&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;3. Diseño (Layout)&lt;/h4&gt;
&lt;p&gt;En esta fase se calculan el tamaño y la posición de cada elemento del árbol de renderizado.&lt;/p&gt;
&lt;p&gt;Puede tratarse de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diseño global&lt;/strong&gt;: se recalcula toda la estructura, por ejemplo, al redimensionar la ventana.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Diseño incremental&lt;/strong&gt;: solo se recalculan las partes afectadas (sistema de &quot;dirty bits&quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;4. Pintado (Paint)&lt;/h4&gt;
&lt;p&gt;Una vez que se ha determinado qué y dónde se va a mostrar, el navegador procede a &lt;strong&gt;pintar&lt;/strong&gt; cada elemento en pantalla en el orden correspondiente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Color de fondo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Imagen de fondo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bordes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elementos hijos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contornos&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este proceso puede ser total o parcial, dependiendo de los cambios ocurridos.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;src/assets/images/web-browsers/rendering-web-browser.png&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Intérprete de JavaScript&lt;/h2&gt;
&lt;p&gt;Cada navegador incluye su propio motor para interpretar y ejecutar JavaScript. Algunos ejemplos son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;V8&lt;/strong&gt; (Chrome)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nitro&lt;/strong&gt; (Safari)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SpiderMonkey&lt;/strong&gt; (Firefox)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos motores permiten modificar dinámicamente el DOM y reaccionar a eventos del usuario.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Backend de interfaz de usuario (UI Backend)&lt;/h2&gt;
&lt;p&gt;Este subsistema se encarga del renderizado de componentes estándar de la interfaz, tales como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Campos de entrada&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Botones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Menús desplegables&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cuadros de texto&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Está estrechamente vinculado al sistema operativo para representar correctamente los controles nativos.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El navegador web es una plataforma altamente sofisticada. Su funcionamiento implica la coordinación de múltiples motores, procesos asincrónicos y estructuras internas. Comprender este flujo no solo ayuda a escribir código más eficiente, sino que también permite depurar errores, optimizar rendimiento y tomar decisiones más informadas en el desarrollo de aplicaciones web.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img src=&quot;src/assets/images/web-browsers/arquitectura-web-browser.png&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;src/assets/images/web-browsers/panorama-funcionamiento.png&quot; alt=&quot;Image&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/markdown-extended/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spoiler&lt;/h3&gt;
&lt;p&gt;You can add spoilers to your text. The text also supports &lt;strong&gt;Markdown&lt;/strong&gt; syntax.&lt;/p&gt;
&lt;p&gt;The content :spoiler[is hidden &lt;strong&gt;ayyy&lt;/strong&gt;]!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The content :spoiler[is hidden **ayyy**]!

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Expressive Code Example</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/expressive-code/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&amp;gt;

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/guide/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The tags of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/markdown/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://0xhaise.github.io/0xHaiseBlog/posts/video/</link><guid isPermaLink="true">https://0xhaise.github.io/0xHaiseBlog/posts/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>