<?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: Ulises Viña</title>
    <description>The latest articles on DEV Community by Ulises Viña (@ulisesvina).</description>
    <link>https://dev.to/ulisesvina</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%2F673471%2F2d08c92e-c11d-412e-90d3-3a0c7f56cad9.jpg</url>
      <title>DEV Community: Ulises Viña</title>
      <link>https://dev.to/ulisesvina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ulisesvina"/>
    <language>en</language>
    <item>
      <title>God bless ThinkPads</title>
      <dc:creator>Ulises Viña</dc:creator>
      <pubDate>Tue, 11 Apr 2023 05:38:14 +0000</pubDate>
      <link>https://dev.to/ulisesvina/god-bless-thinkpads-f8g</link>
      <guid>https://dev.to/ulisesvina/god-bless-thinkpads-f8g</guid>
      <description>&lt;p&gt;I recently found myself in a bit of a predicament. My beloved ThinkPad L440 was suffering from a serious issue - I accidentally injected 12V on the 5V rail of the left-hand side USB 3.0 port, causing the LCD backlight to immediately go out. After testing the LCD panel on another computer, it was clear that the issue was with the board itself. I was left wondering how I could trace the problem and replace the faulty component, and my frustration only grew as I began to suspect that a protection diode or an IC had been damaged.&lt;/p&gt;

&lt;p&gt;It was clear that my trusty ThinkPad L440 was in need of some serious repairs, and I began to consider my options. While I could have spent the time and money to fix the broken component, I realized that it might be time to consider upgrading to a newer model. That's when I discovered the ThinkPad T460s, and I thus became a proud owner of the T460s.&lt;/p&gt;

&lt;p&gt;The T460s offers all of the features that I loved about my L440, but with some serious upgrades, there's a little caveat though, less upgradability: while my older L440 allowed a CPU replacement, my new T460s has it soldered-in, same goes for RAM (I've got a 4GB soldered + 4GB SODIMM setup). The newer model boasts a sleeker design, longer battery life, and improved performance. Plus, as a Linux enthusiast, I knew that the T460s would be a perfect fit for my needs. Its hardware compatibility out-of-the-box with Linux makes ThinkPads just the great choice for all the penguin lovers and FOSS enthusiasts.&lt;/p&gt;

&lt;p&gt;Of course, one of the biggest advantages of purchasing a second-hand ThinkPad is the price. I was able to get a great deal on a T460s in excellent condition, and I know that it will last me for years to come. And as someone who cares deeply about the environment, I appreciated the fact that I was making an eco-friendly choice by opting for a second-hand model rather than buying a brand new laptop.&lt;/p&gt;

&lt;p&gt;You can get an used ThinkPad for VERY cheap on eBay or similar sites, but it all depends on the path you want to follow.&lt;/p&gt;

&lt;p&gt;If you're into FOSS, you might wanna get a ThinkPad you can LibreBoot, like the X220 or T60 both of which range between $100-150 USD. If you want the newest features however you might want to consider something in the X1 Carbon lineup, or a X280 that ranges between $250-300 USD, in my case I'm somewhere in between those, so you might want to follow my steps and get either a T440p/L440 (both have same specs, but beware, the L440 CAN'T be installed with a FOSS firmware option like CoreBoot on the T440p) or a T460/T460s, both raging between $150-250 USD.&lt;/p&gt;

&lt;p&gt;To finish this post, I want to finish with a cherry on top, and that is: it turned out the only issue with my older L440 was a shorted SMD fuse and a BIOS corruption, after reprogramming the BIOS and removing that fuse, my L440 continued working just fine! So really, God bless ThinkPads.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>linux</category>
    </item>
    <item>
      <title>Dynamic Website 101</title>
      <dc:creator>Ulises Viña</dc:creator>
      <pubDate>Tue, 11 Apr 2023 05:15:33 +0000</pubDate>
      <link>https://dev.to/ulisesvina/dynamic-website-101-4dbo</link>
      <guid>https://dev.to/ulisesvina/dynamic-website-101-4dbo</guid>
      <description>&lt;p&gt;It's well known that static websites have become a thing of the past, so in order to make an attractive website you'll need to make it as dynamic as possible, that means, the less hard-coded content, the better. Today, I'll talk about all the integrations I've made to my website to make it attractive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;For starters, you'll need to know the JavaScript and React basics, but we'll not cover that in this post, rather, we're going to immediately talk about design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing content
&lt;/h2&gt;

&lt;p&gt;When making a website, you need to choose what content will go on it, today we're going to focus on portfolios, in which, you don't want every component to be dynamic, as an example, the Awards component on my website&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--20FHe-v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tg96pvqh3tl7b93twaps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--20FHe-v---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tg96pvqh3tl7b93twaps.png" alt="Awards section on the author's website" width="504" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This section barely changes, and it doesn't make any sense to create an API to maintain that section, given that changes occur say, once every 3 months, and the changes are minimum, you can just modify the section and re-deploy the website. Same goes for my "About" section.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, what can we make dynamic?
&lt;/h3&gt;

&lt;p&gt;I chose what content is dynamic in my website following this criteria:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the content change regularly?&lt;/li&gt;
&lt;li&gt;Can I implement it using an API?&lt;/li&gt;
&lt;li&gt;Is the information relevant to the website I'm creating?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When evaluating the third condition, if you're creating a portfolio (or website for yourself) you can consider that everything that is of your liking could be relevant to the website, as a website made for yourself is exactly meant to make people know a little bit more about you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the dynamic content
&lt;/h2&gt;

&lt;p&gt;For this example, I'll use my portfolio's dynamic colour palette; if you want to follow this pathway, you're more than welcome to do so.&lt;/p&gt;

&lt;p&gt;In my website, the whole design changes when a song is played on Spotify, this is thanks to the dynamic colour palette feature, similar to the Monet engine on Android 12 or higher.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LbBF6Nkx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/daecpk5vo4sc6jx4vqt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LbBF6Nkx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/daecpk5vo4sc6jx4vqt0.png" alt="Author's portfolio homepage, featuring the dynamic colour palette." width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, the album's cover is obtained using the Spotify's API, then, passed onto an Image object in JavaScript, and then, that Image object is used with the ColorThief library in order to create a colour palette consisting of six colours, a primary, a secondary, a tertiary and their corresponding text colours (either #FFF, white or #000, black), the last of which is obtained using a math algorithm rather than a library.&lt;/p&gt;

&lt;p&gt;First, the Spotify API is fetched using an API endpoint on my website's end (using Next.js backend)and it's corresponding controller.&lt;/p&gt;

&lt;p&gt;The code for the controller goes as follows&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const getAccessToken = async () =&amp;gt; {
  const res = await fetch("https://accounts.spotify.com/api/token", {
    method: "POST",
    headers: {
      Authorization: `Basic ${process.env["SPOTIFY_AUTH_BASIC"]}`,
      "Content-Type": "application/x-www-form-urlencoded",
    },
    body: new URLSearchParams({
      grant_type: "refresh_token",
      refresh_token: process.env["SPOTIFY_REFRESH_TOKEN"],
    }),
  });

  return res.json();
};

export const getNowPlaying = async () =&amp;gt; {
  const { access_token } = await getAccessToken(),
    nowPlaying = await fetch(
      "https://api.spotify.com/v1/me/player/currently-playing",
      {
        headers: {
          Authorization: `Bearer ${access_token}`,
        },
      }
    );

  return nowPlaying;
};

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

&lt;/div&gt;



&lt;p&gt;As you can see, it obtains credentials from the environment variables and makes a request to the Spotify API using the access token obtained through the getAccessToken() function. The getNowPlaying() function retrieves information about the currently playing song on the user's Spotify account, which is then used to obtain the album cover image.&lt;/p&gt;

&lt;p&gt;Once the album cover image is obtained, it is passed onto the ColorThief library which generates a color palette. This color palette is then used to style the website, with the primary color being used for the background and the secondary and tertiary colors being used for accents. This is done using a React Context Provider, and this is the code for it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createContext, useState, useEffect, useContext } from "react";
import ColorThief from "../node_modules/colorthief/dist/color-thief.mjs";

export const MusicContext = createContext();

export const useMusic = () =&amp;gt; useContext(MusicContext);

export const MusicProvider = ({ children }) =&amp;gt; {
  const [music, setMusic] = useState({ isPlaying: false });

  const musicLogic = () =&amp;gt; {
    fetch("/api/now-playing")
      .then((res) =&amp;gt; res.json())
      .then((data) =&amp;gt; {
        if (!data.isPlaying) return;

        console.log(data);

        const img = new Image(),
          colorthief = new ColorThief();

        img.crossOrigin = "Anonymous";
        img.src = data.albumImage;
        img.addEventListener("load", () =&amp;gt; {
          try {
            const palette = colorthief.getPalette(img);

            const primaryBg = `rgb(${palette[0][0]}, ${palette[0][1]}, ${palette[0][2]})`,
              secondaryBg = `rgb(${palette[1][0]}, ${palette[1][1]}, ${palette[1][2]})`,
              tertiaryBg = `rgb(${palette[2][0]}, ${palette[2][1]}, ${palette[2][2]})`,
              primaryText =
                palette[0][0] * 0.299 +
                  palette[0][1] * 0.587 +
                  palette[0][2] * 0.114 &amp;gt;
                180
                  ? "#000"
                  : "#fff",
              secondaryText =
                palette[1][0] * 0.299 +
                  palette[1][1] * 0.587 +
                  palette[1][2] * 0.114 &amp;gt;
                180
                  ? "#000"
                  : "#fff",
              tertiaryText =
                palette[2][0] * 0.299 +
                  palette[2][1] * 0.587 +
                  palette[2][2] * 0.114 &amp;gt;
                180
                  ? "#000"
                  : "#fff";

            document.documentElement.style.setProperty(
              "--primaryBgColor",
              primaryBg
            );
            document.documentElement.style.setProperty(
              "--secondaryBgColor",
              secondaryBg
            );
            document.documentElement.style.setProperty(
              "--primaryTextColor",
              primaryText
            );
            document.documentElement.style.setProperty(
              "--secondaryTextColor",
              secondaryText
            );
            document.documentElement.style.setProperty(
              "--tertiaryTextColor",
              tertiaryText
            );
            document.documentElement.style.setProperty(
              "--tertiaryBgColor",
              tertiaryBg
            );

            setMusic({
              ...data,
              primaryBg: `${palette[0][0]}, ${palette[0][1]}, ${palette[0][2]}`,
            });
          } catch (e) {
            console.log(e);
          }
        });
      });
  };

  useEffect(() =&amp;gt; {
    musicLogic();
    const interval = setInterval(() =&amp;gt; {
      musicLogic();
    }, 30000);
    return () =&amp;gt; clearInterval(interval);
  }, []);

  return (
    &amp;lt;MusicContext.Provider value={{ music }}&amp;gt;{children}&amp;lt;/MusicContext.Provider&amp;gt;
  );
};

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating a dynamic website can be a lot of work, but it's worth it. By making use of APIs and libraries, you can create a website that not only looks good but also provides a great user experience. When deciding what content to make dynamic, remember to evaluate how frequently it changes and whether it's relevant to your website. With the right tools and some creativity, you can create a dynamic website that stands out from the rest.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating an Operating System: The Journey</title>
      <dc:creator>Ulises Viña</dc:creator>
      <pubDate>Sat, 03 Sep 2022 22:28:01 +0000</pubDate>
      <link>https://dev.to/ulisesvina/creating-an-operating-system-the-journey-3j7n</link>
      <guid>https://dev.to/ulisesvina/creating-an-operating-system-the-journey-3j7n</guid>
      <description>&lt;p&gt;Ever since I started wondering how stuff on my computer worked, I had the dream of writing my very own operating system from scratch. And this is what I've learned in the last 8 months:&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;For starters, you need to know how a computer works on a low-level to understand what you're doing, so let's start with the very basic:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Transistor
&lt;/h3&gt;

&lt;p&gt;A transistor is an electronic component that acts as a switch, it uses semiconductors (most commonly silicon) to turn or on off electrical circuits. We can use these to create the so-called &lt;em&gt;logic gates&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A common transistor has three ends: the collector, the base and the emitter. Each does what it's name describes, but I'm going to explain it anyways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collector:&lt;/strong&gt; It's the pin that collects the voltage from the electrical source of the circuit, this is should be always on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base:&lt;/strong&gt; This pin collects an input that could be either on or off, it doesn't have to be necessarily the same voltage as the collector, but it must come from the same circuit, otherwise, these wouldn't be connected and the electrons wouldn't have a path to travel in the circuit. (tl;dr: base and collector must have a common ground).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emitter:&lt;/strong&gt; This pin outputs voltage if the base input is HIGH (on).&lt;/p&gt;

&lt;p&gt;Now that you know the basics on transistors, we get to explore what are these magical (and complex) logic gates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic Gates
&lt;/h3&gt;

&lt;p&gt;Logic gates are pretty much the electronic circuitry of the propositions you learnt in your philosophy class, but I'm going to explain the basics of them.&lt;/p&gt;

&lt;p&gt;As we learnt before, computers work with the principle of conditions, thanks to the nature of the transistors present in the CPU, and thus, we need to know more about these conditions.&lt;/p&gt;

&lt;p&gt;Through a complex series of arrangements, you can make a transistor "think" logically, using these logic gates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; This is the equivalent to the negation in philosophy, it inverts the input, so for instance, if you input HIGH to this logic gate, the output will be LOW (off).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or:&lt;/strong&gt; This logic gate takes two (or more, as all of the gates we're going to explore from now on) inputs, and it's output will be HIGH &lt;strong&gt;only if&lt;/strong&gt; one or more inputs are HIGH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And:&lt;/strong&gt; This logic gate's output will be HIGH only if all of it's inputs are HIGH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Xor:&lt;/strong&gt; This logic gate's output will be HIGH only if it's input are different from each other. And now that we're exploring this concept, you should know that logic gates can only take two inputs at once, so what you do when there are more than two inputs is concatenate them, so, a xor with three inputs would be &lt;code&gt;((p ⊻ q) ⊻ r)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nor:&lt;/strong&gt; This logic gate is the conjunction of the &lt;code&gt;not&lt;/code&gt; and &lt;code&gt;or&lt;/code&gt; gates, meaning, the output will be like if you passed a NOT gate through a OR condition (every possible input returns LOW except for the one where all it's values are LOW).&lt;/p&gt;

&lt;p&gt;Now with this knowledge, we can pass on to the CPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  CPU
&lt;/h3&gt;

&lt;p&gt;The Central Processing Unit (a.k.a. CPU, or simply, processor) is the circuit that processes all the signals in your computer, it is generally divided into more units, like the ALU (Arithmetic Processing Unit), and Cores (you can think of these as tiny processors in which the jobs are divided into).&lt;/p&gt;

&lt;p&gt;Each of these smaller units uses logic gates and transistors in them, and yes, you can make math using "Yes" and "No".&lt;/p&gt;

&lt;p&gt;The CPU has also a set of instructions, which we'll use to program what it's doing at the time of our code's execution, as you'll discover later, these are General-Purpose and very intuitive.&lt;/p&gt;

&lt;p&gt;The CPU also has these sections of memory (in which you store data) built-in called registers, in the x86 architecture (the one most PC's run on) has general purpose registers, but also some that are for specific use cases, such as storage, video, etc.&lt;/p&gt;

&lt;p&gt;With this, let's pass to the memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory
&lt;/h3&gt;

&lt;p&gt;The memory (not to be confused with storage) is the component in your computer used to load the programs you run on your computer. The information the program needs to store is temporarily loaded onto your computer's memory. This component is also known as RAM (random-access memory), and it's volatile, meaning it's contents are erased when it's powered off.&lt;/p&gt;

&lt;p&gt;Memory divides into addresses, which are tiny sections of it that can contain data. These are commonly represented in hexadecimal, speaking of which, is represented by numbers that start with "0x", just like "0b" for binary.&lt;/p&gt;

&lt;p&gt;Now, let's pass over to some action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assembly language
&lt;/h2&gt;

&lt;p&gt;Assembly is a general-purpose low-level programming language designed to communicate directly with a computer's hardware (mainly CPU and memory). It's fairly simple compared manually writing binary. Assembly uses CPU instructions, and has to be compiled ("assembled") to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello World!
&lt;/h2&gt;

&lt;p&gt;As this post is getting bigger and bigger without getting to code, I'm going to end it with the code for a "Hello world" message in screen written in assembly, but don't worry, I'll explain how it works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;org 0x7C00
bits 16

xor ax, ax
mov ds, ax

start:
    mov si, msg
    mov ah, 0x0E
.loop   lodsb
    or al, al
    jz halt
    int 0x10
    jmp .loop

halt:   hlt
msg:    db "Hello world!", 0 

times 510 - ($ - $$) db 0
dw 0xAA55
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line defines the origin in memory of the program, &lt;code&gt;0x7c00&lt;/code&gt; is the first address value in which the program is going to be stored. There is a reason of to why this number, that I'll explain in another post.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bits 16&lt;/code&gt; defines that the program will run on 16 bits (even though our CPU could be 32 or 64 bits. This is a x86 architecture convention).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;xor ax, ax&lt;/code&gt; means the next line will run if the condition is true. It compares the &lt;code&gt;ax&lt;/code&gt; register against itself (again, there's a reason for this that I'll explain later).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mov ds, ax&lt;/code&gt; moves the contents of &lt;code&gt;ax&lt;/code&gt; over to &lt;code&gt;ds&lt;/code&gt;, both are CPU registers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;start:&lt;/code&gt;, &lt;code&gt;.loop&lt;/code&gt;, &lt;code&gt;halt:&lt;/code&gt; and &lt;code&gt;msg:&lt;/code&gt; (seen later) defines sections of code (you can think of these as functions), though, the &lt;code&gt;msg:&lt;/code&gt; section is more like a variable, as it immediately returns "Hello world" and a null termination character.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mov si, msg&lt;/code&gt; moves the contents of the &lt;code&gt;msg&lt;/code&gt; variable over to the &lt;code&gt;si&lt;/code&gt; register. This will be later used to display the value of msg.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.loop&lt;/code&gt; section is a recursive function that calls itself over and over until the character to evaluate is the null termination character (&lt;code&gt;\0&lt;/code&gt;). It calls the &lt;code&gt;0x10&lt;/code&gt; interrupt (used to display text stored in the &lt;code&gt;al&lt;/code&gt; register if the value on the register &lt;code&gt;ah&lt;/code&gt; is 0x0E (teletype)), and then, passes to the next character to evaluate it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;times 510 - ($ - $$) db 0&lt;/code&gt; calculates the size of the code minus 510 (so that we have two bytes left) and then fills the space between the two last bytes of the sector and our code with zeroes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dw 0xAA55&lt;/code&gt; fills the two last bytes with the &lt;code&gt;55 AA&lt;/code&gt; hex values, note that I inverted the order of these two, this was on purpose, as the x86 architecture is little-endian.&lt;/p&gt;

&lt;p&gt;We need to have these &lt;code&gt;55 AA&lt;/code&gt; bytes at the end so that the BIOS knows we're trying to boot off of the drive that contains our code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating an operating system is a process for which you need low-level computing knowledge, which you should have acquired if you read the full post. Mainly, you'll need to know Assembly, and what are the components in your computer, how they work and what they do.&lt;/p&gt;

&lt;p&gt;By the end, you'll have a working bootable "Hello world".&lt;/p&gt;

&lt;p&gt;That's all for today, and thanks a lot for your attention!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>osdev</category>
      <category>assembly</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hello World</title>
      <dc:creator>Ulises Viña</dc:creator>
      <pubDate>Sun, 25 Jul 2021 04:21:49 +0000</pubDate>
      <link>https://dev.to/ulisesvina/hello-world-55an</link>
      <guid>https://dev.to/ulisesvina/hello-world-55an</guid>
      <description>&lt;p&gt;This article is just to test out the blog page on my portfolio.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
