<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Evesan</title>
    <description>The latest articles on DEV Community by Evesan (@evesan).</description>
    <link>https://dev.to/evesan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1097255%2F77ddf2a4-a100-4cb3-9118-15026d5b8acd.png</url>
      <title>DEV Community: Evesan</title>
      <link>https://dev.to/evesan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evesan"/>
    <language>en</language>
    <item>
      <title>Los monorepos no salvarán al mundo</title>
      <dc:creator>Evesan</dc:creator>
      <pubDate>Thu, 17 Jul 2025 07:28:40 +0000</pubDate>
      <link>https://dev.to/evesan/los-monorepos-no-salvaran-al-mundo-4fl7</link>
      <guid>https://dev.to/evesan/los-monorepos-no-salvaran-al-mundo-4fl7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Pero si te salvarán de repetir código y tener hacer el mismo cambio en varios proyectos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de entrar en temas de tecnologías, lenguajes, frameworks, etc, debemos recordar que, al final del día, siempre existen &lt;strong&gt;reglas de negocio&lt;/strong&gt; que debemos atacar, sin excepción alguna y esa &lt;strong&gt;debería ser de las primeras cosas a tomar en cuenta&lt;/strong&gt;, la lógica inherente al negocio, el problema que nuestro desarrollo solventará.&lt;/p&gt;

&lt;p&gt;La forma de consumir la solución puede variar, ya sea un cliente de escritorio, un cli en la terminal, un servicio http, grpc, etc, etc, pero eso no debería modelar nuestra solución, incluso me atrevo a  decir que deberíamos ser capaces de tener &lt;strong&gt;n combinaciones&lt;/strong&gt; de todas las opciones anteriores.&lt;/p&gt;

&lt;p&gt;En mi opinión, lo mejor para esto es separar de inicio ambas cosas, por un lado la solución a las reglas de negocio (tal cuál), y por otra la forma de consumirlo. Esto nos puede traer beneficios como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tener un código más desacoplado&lt;/li&gt;
&lt;li&gt;Facilitar el desarrollo de tests&lt;/li&gt;
&lt;li&gt;Facilitar el consumo de nuestra solución&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se pueden usar varias técnicas o herramientas, dado que principalmente me muevo en el mundo de Rust y Javascript, centraré mis ejemplos en cualquiera de esos 2 ecosistemas aunque como lo mencioné al inicio, la idea principal es la de desacoplar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Javascript
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0v0ockzqx74x3dmqfbf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0v0ockzqx74x3dmqfbf.png" alt="Turborepo" width="456" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NPM nos permite por medio de los &lt;a href="https://docs.npmjs.com/cli/v8/using-npm/workspaces" rel="noopener noreferrer"&gt;workspaces&lt;/a&gt; tener varios proyectos conviviendio en un mismo espacio, sin embargo en lo personal prefiero &lt;a href="https://turborepo.com/" rel="noopener noreferrer"&gt;Turborepo&lt;/a&gt; porque aparte de estar hecha con rust, permite poder reusar caché en los builds, lo cual se traduce como un ahorro de tiempo y energía, cosas que son importantes en el día a día y para el medio ambiente si lo piensan como la sugiere la &lt;a href="https://greensoftware.foundation/" rel="noopener noreferrer"&gt;green software foundation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por regla Turborepo define dos directorios principales:&lt;/p&gt;

&lt;p&gt;📁 &lt;strong&gt;packages&lt;/strong&gt;&lt;br&gt;
Es el lugar dónde se definen las bibliotecas. La intención es compartir código entre las bibliotecas o aplicaciones.&lt;/p&gt;

&lt;p&gt;📁 &lt;strong&gt;apps&lt;/strong&gt;&lt;br&gt;
Acá deben vivir las soluciones completas que se aprovecha de las bibliotecas del directorio packages.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rust
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh3469eosptsa2plfzjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkh3469eosptsa2plfzjf.png" alt="Cargoworkspaces" width="454" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el caso del ecosistema de rust, Cargo cuenta de igual forma con &lt;a href="https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html" rel="noopener noreferrer"&gt;workspaces&lt;/a&gt; que si bien se definen de forma diferente a los de npm, la idea es la misma, poder tener varios proyectos y librerias en un mismo espacio permitiendo que de puedan hacer importaciones de uno a otro.&lt;/p&gt;

&lt;p&gt;Acá el trabajo es un poco más manual, sin embargo no es nada complicado. En el archivo &lt;code&gt;Cargo.toml&lt;/code&gt; principal, se definen los paths que podrán ser importados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cargo.toml&lt;/span&gt;
&lt;span class="nn"&gt;[workspace]&lt;/span&gt;
&lt;span class="py"&gt;members&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"libs/ags"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
  &lt;span class="s"&gt;"libs/organigrama"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"apps/cli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"apps/server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;resolver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y cada proyecto, ya sea una librería o no, podrá importar por medio de la ruta relativa el componente necesario.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# apps/cli/Cargo.toml&lt;/span&gt;
&lt;span class="nn"&gt;[package]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cli"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2021"&lt;/span&gt;

&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="c"&gt;# Local&lt;/span&gt;
&lt;span class="py"&gt;organigrama&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"../../libs/organigrama"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Y todo para qué?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Para qué tanto amor?
&lt;/h3&gt;

&lt;p&gt;Desde la perspectiva del negocio, una entidad es la misma sin importar el contexto, por poner un ejemplo, una compra tiene formas muy similares para un cliente y para un vendedor, &lt;strong&gt;¿por qué deberíamos estar repitiendo tipos o estructuras que definen lo mismo solo por que están en contextos diferentes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De no estar centralizada esa definición, puede que se convierta en un trabajo extra del cuál debemos estar al tanto y rompe completamente con el principio DRY &lt;strong&gt;(Don't Repeat Yourself)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Evidentemente esto aplica siempre y cuando el lenguaje sea el mismo para los contextos.&lt;/p&gt;

&lt;p&gt;En fin, hasta acá el post de por qué creo que deberían usarse más los monorepositorios.&lt;/p&gt;

&lt;p&gt;En el siguiente post &lt;strong&gt;La quiere limpia ó hexágonal (la aquitectura jóven)&lt;/strong&gt;, ahondaremos en cómo deberíamos organizar nuestro código dentro de cada sección, sean librerías o aplicaciones.&lt;/p&gt;

</description>
      <category>monorepositorios</category>
      <category>development</category>
      <category>spanish</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Deja de ser un becario</title>
      <dc:creator>Evesan</dc:creator>
      <pubDate>Thu, 17 Jul 2025 06:09:27 +0000</pubDate>
      <link>https://dev.to/evesan/deja-de-ser-un-becario-4g7n</link>
      <guid>https://dev.to/evesan/deja-de-ser-un-becario-4g7n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;6 Años de experiencia con herramientas como [inserte-su-framework-rimbombanyte-de-moda] en empresas como [inserte-empresas-de-pasantía-dónde-claramente-no-se-hizo-carrera], en mis trabajos siempre he inentado transmitir la pasión que siento por la profesión y un alto grado de perfeccionismo para conseguir siempre el mejor resultado .&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Desearía,
&lt;/h2&gt;

&lt;p&gt;por dios desearía que de verdad fuera cierta la descripción anterior y evitar tener que preguntarme por el entido del siguiente componente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn6frkr2apctfae8ndlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn6frkr2apctfae8ndlh.png" alt="SandraCortes" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si se están peguntando si la descripción y el código propuesto para producción fueron escritos por la misma persona con diferencia de tiempo menor a un año, desafortunadamente están en lo correcto.&lt;/p&gt;

&lt;p&gt;Considero que si alguien presume de su tiempo en la industria y de estar en x o y lugar al menos podría defederse con los sisuientes temas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Qué es el event-loop?&lt;/li&gt;
&lt;li&gt;¿Cómo usar BEM correctamente?&lt;/li&gt;
&lt;li&gt;¿Cómo funcionan las variables y los mixings de Sass?&lt;/li&gt;
&lt;li&gt;¿Cuál es la difernecia entre pasar como parámetro a una función "&lt;strong&gt;callback&lt;/strong&gt;" ó "&lt;strong&gt;callback()&lt;/strong&gt;"?&lt;/li&gt;
&lt;li&gt;¿Cuándo usar un store global o pasar parametros por el state del router en react?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pero no todo es como lo pintan
&lt;/h3&gt;

&lt;p&gt;Recientemente he tenido la chistosa &lt;em&gt;(pero chistosa no de divertida, chistosa de rara)&lt;/em&gt; experiencia de trabajar con, por decirlo de alguna forma, una persona quien me hizo mucho dudar de la calidad en general de los devs y cuanto daño le hace a la industria no tomarse las cosas en serio, aparte de la IA + personas sin criterio, pero eso lo dejamos para otro post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personalmente creo que todos ignoramos partes diferentes del conocimiento visto como un todo&lt;/strong&gt;, pero también creo que si tenemos un trabajo que nos da de comer, como mínimo y por respeto deberíamos esforzarnos en entender cuanto podamos, sobre todo si se trata de cosas tan básicas.&lt;/p&gt;

&lt;p&gt;Sin embargo, &lt;strong&gt;como a mí no solo me gusta venir a quejarme&lt;/strong&gt;, estaré escribiendo más post de cómo creo que debería ser el desarrollo, no solo en backend ni frontend, si no en general y hasta dónde mi ignorancia actual me lo permita. &lt;/p&gt;

&lt;p&gt;No lo hago como un acto de arrogancia para que vean lo bueno que soy, siempre me ha gustado tener retro de lo que hago (porque también necesito validación de gente más experimentada) y espero que de verdad se genere bastante conversación para que con argumentos y diferentes puntos de vista se puedan pulir las prácticas.&lt;/p&gt;

&lt;p&gt;Sin más, espero escuchar sus respuestas pronto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;Dejare los links en el orden que planeo sean leídos, como una especie de índice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/evesan/los-monorepos-no-salvaran-al-mundo-4fl7"&gt;Los monorepos no salvarán al mundo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;La quiere limpia ó hexágonal (la aquitectura jóven)&lt;/li&gt;
&lt;li&gt;Vertical slicing&lt;/li&gt;
&lt;li&gt;¿Y los tests unitarios amá?&lt;/li&gt;
&lt;li&gt;¿Y los tests de integración apá?&lt;/li&gt;
&lt;li&gt;¿Y los tests e2e GrandMa?&lt;/li&gt;
&lt;li&gt;A punta de bash scripting (automatización)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>becaria</category>
      <category>becario</category>
      <category>typescript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Ipods, Bash &amp; Kid3</title>
      <dc:creator>Evesan</dc:creator>
      <pubDate>Wed, 08 May 2024 02:16:24 +0000</pubDate>
      <link>https://dev.to/evesan/ipods-bash-kid3-nkm</link>
      <guid>https://dev.to/evesan/ipods-bash-kid3-nkm</guid>
      <description>&lt;p&gt;Bueno, bueno, bueno, hablemos ahora de cosas serías: &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;¿Cuándo fué la última vez que te preocupaste por la metadata y el ordenamiento de tu biblioteca musical?&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Si tu respuesta es, &lt;em&gt;"yo puro streaming"&lt;/em&gt; &lt;strong&gt;este post no es para tí&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;De otra forma, bienvenido colega preocupado por la conservación del material digital, te voy a compartir un script en bash que se apoya de varias herramientas (como el cli de Kid3) para ordenar mi biblioteca personal que tengo construyendo desde la preparatoria (alv eso pasó como hace 26 años, kloko)&lt;/p&gt;

&lt;h3&gt;
  
  
  Para empezar ...
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ... por qué debería empezar?
&lt;/h4&gt;

&lt;p&gt;No sé ustedes pero yo le tengo un amor tremendo a los ipods, me recuerdan mis días de preparatoria y los uso como &lt;em&gt;"maquinas del tiempo"&lt;/em&gt;: &lt;br&gt;
llego, tomo uno, me acuesto en el sillón y escucho lo que marcó alguna etapa de mi vida. &lt;/p&gt;

&lt;p&gt;Siempre he reconocido la increíble capacidad del sonido y la memoria para llevarnos a otros espacios y lugares, peeeeero a la vez tengo un toc que me obliga a tener las canciones, que en su mayoría son mp3, con artista, álbum, año, nombre de canción, cover y en el mejor de los casos, letra de la canción.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6j1wiyaw5pd5n0v54vh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6j1wiyaw5pd5n0v54vh.jpg" alt="Ipod" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Evidentemente esto se puede convertir en una tarea un poco pesada considerando que suelo escuchar cosas que van desde la "Banda el Recodo" hasta "The Hu", sin embargo, gracias al open source y un poco de bash dicha tarea puede ser más ligera.&lt;/p&gt;

&lt;p&gt;Nota: &lt;em&gt;Sé que existen algunas formas de hacer este mismo trabajo con herramientas basadas en inteligencia artificial, pero la verdad es que un objetivo alterno era mejorar en mi bash scripting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/everitosan/BashScripts/tree/main/mlib" rel="noopener noreferrer"&gt;Mlib&lt;/a&gt; es el nombre del script que hice y probablemente esté en construcción durante un tiempo mientras voy encontrando areas de oportunidad al ir avanzando en mi proyecto de orden, para poder usarlo necesita algunas otras herramientas como son: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kid3-cli&lt;/li&gt;
&lt;li&gt;fzf&lt;/li&gt;
&lt;li&gt;ffprobe&lt;/li&gt;
&lt;li&gt;ffmpeg
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mlib &lt;span class="nt"&gt;-h&lt;/span&gt;
░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░ █▀▄▀█ █░░ █ █▄▄          ░
░ █░▀░█ █▄▄ █ █▄█ &lt;span class="o"&gt;(&lt;/span&gt;v0.0.1&lt;span class="o"&gt;)&lt;/span&gt; ░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░

  Flags:
    &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;specifies directory to use]
      &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;shows info of a directory]
      &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;extract image covers]
      &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;convert, can convert to mp3 or wav]
      &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;fill metadata of all files of all tags &lt;span class="k"&gt;in &lt;/span&gt;a directory]
      &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;generate info.csv file]
      &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;shows &lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

  &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;required&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Entre las cosas que puede hacer por el momento son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mostrar la información de los tags ID3 de todas las canciones en un directorio&lt;/li&gt;
&lt;li&gt;Extraer el cover de cada canción&lt;/li&gt;
&lt;li&gt;Convertir a "formatos" (contenedores) mp3 y wav&lt;/li&gt;
&lt;li&gt;Generar un archivo CSV con Nombre del artista, álbum, año de la canción y el path del cover (que tmbn puede ser una url de internet)&lt;/li&gt;
&lt;li&gt;Complementar la información de las canciones de un directorio en base al csv generado o replicando la información de algún tag que contenga data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mi operación se basa en tener los archivos en directorios (con el nombre del álbum) e ir validando si puedo trabajar con la información que ya contienen los archivos o debo complementar algo en específico como el Cover, o generar el csv para asegurarme que no existirán variaciones en nombre del álbum o año, solo por mencionar algunos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/m/e/T/0/All Time Low ❯❯❯ tree ./      
./
└── mp3
    ├── Nothing Personal
    │   ├── 01 Weightless 1.mp3
    │   ├── 01 Weightless.mp3
    │   ├── 02 Break Your Little Heart.mp3
    │   ├── 03 Damned If I Do Ya &lt;span class="o"&gt;(&lt;/span&gt;Damned If I Don&lt;span class="s1"&gt;'t).mp3
    │   ├── 04 Lost in Stereo.mp3
    │   ├── 05 Stella.mp3
    │   ├── 06 Sick Little Games.mp3
    │   ├── 07 Hello, Brooklyn.mp3
    │   ├── 08 Walls.mp3
    │   ├── 09 Too Much.mp3
    │   ├── 10 Keep the Change, You Filthy Animal.mp3
    │   ├── 11 A Party Song (The Walk of Shame).mp3
    │   ├── 12 Therapy.mp3
    │   ├── 13 Lost In Stereo (Cobra Starship Suave Suarez Remix) [Bonus Track].mp3
    │   ├── 14 Poison (Bonus Track).mp3
    │   └── Cover.png
    ├── Put Up Or Shut Up
    │   ├── 03 The Girl'&lt;/span&gt;s A Straight-Up Hustler.mp3
    │   ├── 04 Jasey Rae.mp3
    │   ├── 06 Running From Lions.mp3
    │   ├── 07 Lullabies.mp3
    │   └── Cover.png
    ├── So Wrong, It&lt;span class="s1"&gt;'s Right (Deluxe Edition)
    │   ├── 03 Six Feet Under The Stars.mp3
    │   ├── 05 The Beach.mp3
    │   ├── 08 Remembering Sunday.mp3
    │   ├── 12 Poppin'&lt;/span&gt; Champagne.mp3
    │   ├── 14 Dear Maria, Count Me In &lt;span class="o"&gt;(&lt;/span&gt;Acoustic&lt;span class="o"&gt;)&lt;/span&gt;.mp3
    │   ├── 15 Six Feet Under The Stars &lt;span class="o"&gt;(&lt;/span&gt;Acoustic&lt;span class="o"&gt;)&lt;/span&gt;.mp3
    │   └── Cover.png
    └── Warped Tour 2012 Compilation
        ├── 2-01 Coffee Shop Soundtrack.mp3
        └── Cover.png

6 directories, 30 files

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podría decirse que esta es la primera iteración del proyecto, que claro podría ser más automático en cuanto a la búsqueda de letras o Covers, pero por el momento me ha ahorrado horas de estar llenando y repitiendo información en cientos de canciones.&lt;/p&gt;

&lt;p&gt;Sin más, los dejo por ahora ya que tengo una biblioteca que ordenar y complementar. &lt;/p&gt;

&lt;p&gt;Nos escribimos y leemos en la próxima.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Referencias
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/everitosan/BashScripts/tree/main/mlib" rel="noopener noreferrer"&gt;Mlib&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kid3.kde.org/#information" rel="noopener noreferrer"&gt;Kid3&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/ID3" rel="noopener noreferrer"&gt;ID3&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=mfb7tuUTiZ8" rel="noopener noreferrer"&gt;Contenedores de audio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>kid3</category>
      <category>música</category>
      <category>bash</category>
    </item>
    <item>
      <title>a2dp-sink profile Protocol not available</title>
      <dc:creator>Evesan</dc:creator>
      <pubDate>Tue, 08 Aug 2023 05:18:53 +0000</pubDate>
      <link>https://dev.to/evesan/a2dp-sink-profile-protocol-not-available-4iem</link>
      <guid>https://dev.to/evesan/a2dp-sink-profile-protocol-not-available-4iem</guid>
      <description>&lt;p&gt;&lt;em&gt;Bitácora del 5 y 7 de Agosto del 2023.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esta historia comienza con una actualización de mi &lt;strong&gt;SO&lt;/strong&gt; principal (&lt;em&gt;y más amado también&lt;/em&gt;: &lt;strong&gt;Debian12&lt;/strong&gt;) cuando, un día común  después de una actualización, dejaron de funcionar todos mis dispositivos bluetooth de audio.&lt;/p&gt;

&lt;p&gt;Los errores evidentes resultaban ser:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Los audífonos &lt;code&gt;número 1&lt;/code&gt; se conectan, al paso de unos segundos se desconectan.&lt;/p&gt;

&lt;p&gt;Los audífonos &lt;code&gt;número 2&lt;/code&gt; se conectan, aparentemente nunca terminan la conexión.&lt;/p&gt;

&lt;p&gt;En ambos casos la conexión se termina y no puede escucharse nada en los audífonos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mi primer impulso resaltó la tarjeta original de la &lt;em&gt;Zephirus g14 2022&lt;/em&gt;, sin embargo tal hecho resultaba improbable ya que unos meses antes había realizado el cambio a una &lt;a href="https://www.intel.com/content/www/us/en/support/articles/000005511/wireless.html" rel="noopener noreferrer"&gt;Intel AX210&lt;/a&gt; por incompatibilidad en los drivers.&lt;/p&gt;

&lt;p&gt;Algo me decía que debía empezar por revisar bitácoras y buscar un error que se reportara a la hora de intentar hacer una conexión a los dispositivos, así que procedí a cambiar mi usuario en la terminal a &lt;code&gt;root&lt;/code&gt; y visualizar el journal de forma constante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Log del journatctl&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;journalctl &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ser honestos, empecé intentando hacer la conexión por medio de la interfaz gráfica, sin embargo tras una serie de intentos frustrantes por la necesidad de inmediatez, una laguna mental se despejó permitiéndome recordar que existía una utilidad llamada &lt;code&gt;bluetoothctl&lt;/code&gt;. Como siempre &lt;code&gt;tldr&lt;/code&gt; fue un gran aliado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1qx4b73exyexj549ksk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1qx4b73exyexj549ksk.png" alt=" " width="734" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después de escanear, emparejar, conectar, desconectar y eliminar varias veces uno de mis dispositivos bluetooth logré dar con el texto que procuraba: &lt;em&gt;a2dp-sink profile Protocol not available&lt;/em&gt;, ese hecho me dió una palanca para empezar a buscar soluciones por medio del viejo pero sabio internet indexado, aún no puedo confiar a la IA una tarea tan específica.&lt;/p&gt;

&lt;p&gt;Para mi suerte parcial, existe una entrada el &lt;a href="https://wiki.debian.org/BluetoothUser/a2dp#a2dp-sink_profile_connect_failed_.5B....5D:_Protocol_not_available" rel="noopener noreferrer"&gt;wiki de Debian&lt;/a&gt; sobre este problema en específico, eso quería decir que no podía ser tan complicado ... iluso yo, nuevamente. Según el texto oficial, el problema debería resolverse simplemente desinstalando el paquete &lt;code&gt;pulseaudio-module-bluetooth&lt;/code&gt; ya que Debian12 usa PipeWire como servidor de audio por defecto.&lt;/p&gt;

&lt;p&gt;Nuevamente a escanear, emparejar, conectar, desconectar, eliminar varias veces uno de mis dispositivos bluetooth, no logré avanzar en mi labor, estaba en un callejón oscuro agitando mi bastón cuando, por consecuencia de una de &lt;a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1151" rel="noopener noreferrer"&gt;mis búsquedas&lt;/a&gt; dí con otro punto clave: la falta de &lt;code&gt;libspa-0.2-bluetooth&lt;/code&gt; en mi vida.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalamos libspa&lt;/span&gt;
&lt;span class="c"&gt;# ✨ Esta fue la magia en mi solución&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libspa-0.2-bluetooth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez realizado este paso, y siguiendo la referencia encontrada, solo quedaba reiniciar el tanto el servidor de audio como el manejador de sesión para comprobar nuevamente. Debo recalcar que estos pasos los ejecuté con el usuario que tiene el escritorio (no como root).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Reinicio del servidor de audio pipewire&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; restart pipewire-pulse.service pipewire.service
&lt;span class="c"&gt;# Reinicio del session manager&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; restart wireplumber.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como era de esperarse: escanear, emparejar, conectar ... ¡se logró tener la conexión!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft24hnyodloludi1eqz9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft24hnyodloludi1eqz9c.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Durante toda esta travesía personal aprendí un par de cosas nuevas y recolecté una lista de recursos que pueden ser muy interesantes para el futuro, mismos que listo a continuación.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://wiki.debian.org/BluetoothUser/a2dp#a2dp-sink_profile_connect_failed_.5B....5D:_Protocol_not_available" rel="noopener noreferrer"&gt;Debian Issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1151" rel="noopener noreferrer"&gt;Pipewire Issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trendoceans.com/install-pipewire-on-debian-11/" rel="noopener noreferrer"&gt;Pipewire en Debian 11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=HxEXMHcwtlI" rel="noopener noreferrer"&gt;Linux Explained Audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=A6tomqOZvM4&amp;amp;t=2s" rel="noopener noreferrer"&gt;Pipewire overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bluetooth</category>
      <category>pipewire</category>
      <category>pulseaudio</category>
      <category>spanish</category>
    </item>
    <item>
      <title>El mundo es un caos (breve recordatorio)</title>
      <dc:creator>Evesan</dc:creator>
      <pubDate>Fri, 09 Jun 2023 13:48:48 +0000</pubDate>
      <link>https://dev.to/evesan/el-mundo-es-un-caos-breve-recordatorio-2mo7</link>
      <guid>https://dev.to/evesan/el-mundo-es-un-caos-breve-recordatorio-2mo7</guid>
      <description>&lt;p&gt;El mundo es un caos y aunque de pequeños no lo veamos así, con el tiempo uno se da cuenta de muchas cosas, por ejemplo que los papás tampoco saben muy bien lo que hacen, o que nuestros maestros también tienen sentimientos y si lloraron en clase probablemente la estaban pasando mal, pero sobre todo, que el código no va a correr a la primera.&lt;/p&gt;

&lt;p&gt;😕 😕 😕&lt;/p&gt;

&lt;p&gt;Durante las dos semanas anteriores estuve &lt;del&gt;trabajando&lt;/del&gt; ... sobre trabajando con un script para hacer un backup de los archivos en las cuentas de OneDrive, la razón probablemente se las cuente en un futuro más lejano. &lt;/p&gt;

&lt;p&gt;El punto es que después de 1 semana para mi ya estaba listo: solo había que extraer los archivos de la cuenta que iniciaría sesión por medio de &lt;em&gt;OAUTH&lt;/em&gt; al &lt;em&gt;Microsoft Graph API&lt;/em&gt;, sin embargo, las cosas no siempre son como uno las planea. Resultó que también tendría que obtener los archivos que se le compartieron al dueño de la cuenta (cosa que cuestioné durante la primer semana y se me había negado la necesidad de dicho requeriemiento).&lt;/p&gt;

&lt;p&gt;Ahora, no quiero ser el buzón público de quejas por malas planeaciones, así que, antes que nada, les dejo el proyecto por si lo ocupan en algún punto o quieren tener una referencia: &lt;a href="https://gitlab.com/opensource13/odbu" rel="noopener noreferrer"&gt;https://gitlab.com/opensource13/odbu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Continuando con la historia, el segundo problema al que me enfrenté fué que hice el desarrollo y las pruebas con una cuenta que tenía relativamente pocos documentos y, apesar de de que se pensé en concurrencia desde el inicio, dejé de lado el hecho de que las ligas de descarga que provee el api para un archivo, contienen un jwt que obviamente tiene una fecha de expiración.&lt;/p&gt;

&lt;p&gt;Evidentemente, eso no afecta cuando la descarga se hace en unos minutos, sin embargo, la descarga real sería de varias horas o incluso días.&lt;/p&gt;

&lt;p&gt;Creo que en situaciones así es cuando el programador le agradece a su yo del pasado por haber construido siguiendo patrones de diseño, ya que al tener una idea más clara de la responsabilidad que hace cada módulo o parte del código, estos cambios no tienen un impacto tan fuerte en tiempos y esfuerzo.&lt;/p&gt;

&lt;p&gt;En los aprendizajes personales que me dejó la quincena pasada podría resumir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definir desde un inicio cuál es el objetivo de cada módulo en tu proyecto.&lt;/li&gt;
&lt;li&gt;Considerar la expiración en los tokens para el api.&lt;/li&gt;
&lt;li&gt;Escuchar un poco más a mi intuición y voz interna en base a mi experiencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En fin, hasta aquí el relato de hoy. Si llegaste hasta acá espero que te sirva de algo mi experiencia y si te es útil el cliente, sientete libre de usarlo a tu convenviencia.&lt;/p&gt;

&lt;p&gt;Obviamente y si está en mis posibilidades, también estoy abierto a ayudarte a resolver dudas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Salu2.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>microsoft</category>
      <category>graph</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
