<?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: ErrorGamer2000</title>
    <description>The latest articles on DEV Community by ErrorGamer2000 (@errorgamer2000).</description>
    <link>https://dev.to/errorgamer2000</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%2F817323%2F23fd0117-e9b3-412e-bf59-b22f9f026059.png</url>
      <title>DEV Community: ErrorGamer2000</title>
      <link>https://dev.to/errorgamer2000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/errorgamer2000"/>
    <language>en</language>
    <item>
      <title>Binary File Formats Explained</title>
      <dc:creator>ErrorGamer2000</dc:creator>
      <pubDate>Thu, 11 Aug 2022 17:38:00 +0000</pubDate>
      <link>https://dev.to/errorgamer2000/binary-file-formats-explained-4g6j</link>
      <guid>https://dev.to/errorgamer2000/binary-file-formats-explained-4g6j</guid>
      <description>&lt;p&gt;When I first began researching binary file formats, I was met with a complete absence of human-friendly explanations anywhere online. All of the resources that I came across were full of unfamiliar technical terms that made me feel like I was reading a textbook written for someone with twice my IQ. Hence, this article. This is a summary of my research, explained in English so that you can understand it without the trouble that I had. Now, without further delays, let's get into the learning!&lt;/p&gt;

&lt;h2&gt;
  
  
  All of Those Confusing Technical Terms
&lt;/h2&gt;

&lt;p&gt;As I said, there were a number of technical terms that I encountered in my research that I had never heard of before. these made little sense to me at the time, and took even more painful research. Here is a list of those terms, explained in friendly ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary&lt;/strong&gt; - binary is a &lt;a href="https://www.cuemath.com/numbers/number-systems/" rel="noopener noreferrer"&gt;number system&lt;/a&gt; that has a base of &lt;code&gt;2&lt;/code&gt;. That means that the only digits it uses are &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bit&lt;/strong&gt; - a bit is the smallest unit of data in a computer, consisting of nothing more that a single binary digit (a &lt;code&gt;0&lt;/code&gt; or &lt;code&gt;1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Byte&lt;/strong&gt; - a byte is the next unit of data in a computer. A byte consists of &lt;code&gt;8&lt;/code&gt; individual bits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed Integer&lt;/strong&gt; - a signed integer is an integer (whole number) that is associated with a sign that declares whether the number is positive or negative. Basically, it is an integer with a &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt; attached to it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsigned integer&lt;/strong&gt; - an unsigned integer is an integer that is &lt;em&gt;not&lt;/em&gt; associated with a sign(&lt;code&gt;+&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt;), and is always considered to be a positive value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What exactly &lt;em&gt;is&lt;/em&gt; a file, anyway?
&lt;/h2&gt;

&lt;p&gt;A file is a collection of bits that is stored within a computer's memory. Files are generally separated into bytes, and measured by the number of bytes that they contain (Kilo*bytes*, Mega*bytes*, Giga*bytes*, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Types
&lt;/h2&gt;

&lt;p&gt;Before we can truly begin working with binary file encoding, we need to understand the types of data that can be stored within a file. there are two main types of data in a file: integers and strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integers
&lt;/h3&gt;

&lt;p&gt;Integers are separated into two sub-types, signed and unsigned, as I explained at the beginning of the article.&lt;/p&gt;

&lt;p&gt;Unsigned Integers, thanks to the lack of a sign, can store a number with roughly twice the maximum value than that of a signed integer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: unsigned integer is abbreviated as &lt;code&gt;Uint&lt;/code&gt; in almost every programming situation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Signed Integers(&lt;code&gt;Int&lt;/code&gt;s) are pretty much exactly the same, aside from their reduced maximum value.&lt;/p&gt;

&lt;p&gt;Both &lt;code&gt;Uint&lt;/code&gt;s and &lt;code&gt;Int&lt;/code&gt;s are found in different sizes in binary files, and are generally named based on how many bits they use to store their value. For example, &lt;code&gt;Uint8&lt;/code&gt; and &lt;code&gt;Int8&lt;/code&gt; both use &lt;code&gt;8&lt;/code&gt; bits in the file, &lt;code&gt;Uint16&lt;/code&gt; and &lt;code&gt;Int16&lt;/code&gt; use &lt;code&gt;16&lt;/code&gt; bits, and so on. These numbers have different value limits based on the number of bits that they use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Minimum Value&lt;/th&gt;
&lt;th&gt;Maximum Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Int8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-128&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;65,535&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Int16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-32,768&lt;/td&gt;
&lt;td&gt;32,767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4,294,967,295&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Int32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-2,147,483,648&lt;/td&gt;
&lt;td&gt;2,147,483,647&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;18,446,744,073,709,551,615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Int64&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-9,223,372,036,854,775,808&lt;/td&gt;
&lt;td&gt;9,223,372,036,854,775,807&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are not the only sizes that can be used, however, and you may sometimes encounter some oddball sizes. Here are a couple that I ran into:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Minimum Value&lt;/th&gt;
&lt;th&gt;Maximum Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Uint24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8,388,608&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;

&lt;p&gt;Strings, as you may already know, are ordered sets of text characters. When a string is stored in a binary file, it is converted into a set of bytes, with each byte storing one &lt;a href="https://en.wikipedia.org/wiki/UTF-8" rel="noopener noreferrer"&gt;&lt;code&gt;utf-8&lt;/code&gt;&lt;/a&gt; character in each byte as a &lt;code&gt;Uint8&lt;/code&gt; character ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endianness
&lt;/h2&gt;

&lt;p&gt;Endianness is one of the more difficult concepts to grasp, so I'm going to take an example-based approach here. Let's say I have a variable that is a &lt;code&gt;Uint16&lt;/code&gt; with the value of &lt;code&gt;255&lt;/code&gt;. In order to store this variable in a binary file, if must first be converted into a set of bytes. Because our variable is a &lt;code&gt;Uint16&lt;/code&gt;, taking up 16 bits of space, it requires two bytes in the file to store. But ... Which of those two bytes comes first in the file? This is where endianness comes into play.&lt;/p&gt;

&lt;h3&gt;
  
  
  High and Low Bytes
&lt;/h3&gt;

&lt;p&gt;Let's convert our &lt;code&gt;Uint16&lt;/code&gt; variable into binary, making sure to keep 16 digits: &lt;code&gt;0000000011111111&lt;/code&gt;. Notice how the number is split evenly between &lt;code&gt;0&lt;/code&gt;s and &lt;code&gt;1&lt;/code&gt;s. Each of those groups is a single byte. The byte on the left (the &lt;code&gt;0&lt;/code&gt;s) is the &lt;em&gt;high&lt;/em&gt; byte, meaning it comes first in the normal order of the value. The byte on the right (the &lt;code&gt;1&lt;/code&gt;s) is called the &lt;em&gt;low&lt;/em&gt; byte. As you go across the bytes from left to right, the bytes go from higher to lower "order". So, in this number, the left byte is of a &lt;em&gt;higher order&lt;/em&gt; than the right byte.&lt;/p&gt;

&lt;p&gt;Now, there are two types of "endianness" that a number can be encoded in: little endian and big endian format. A number that is encoded in &lt;strong&gt;little end&lt;/strong&gt;ian format will have the bytes ordered from highest to lowest, meaning that the lowest("&lt;strong&gt;little&lt;/strong&gt;st") byte comes at the &lt;strong&gt;end&lt;/strong&gt;. Numbers encoded in &lt;strong&gt;big end&lt;/strong&gt;ian format are ordered in the reverse of little endian numbers, meaning that the highest("&lt;strong&gt;big&lt;/strong&gt;est") byte comes at the &lt;strong&gt;end&lt;/strong&gt; instead.&lt;/p&gt;

&lt;p&gt;Returning to our &lt;code&gt;Uint16&lt;/code&gt; variable, here is what the number will look like when in the file:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endianness&lt;/th&gt;
&lt;th&gt;Byte 0&lt;/th&gt;
&lt;th&gt;Byte 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;little&lt;/td&gt;
&lt;td&gt;00000000&lt;/td&gt;
&lt;td&gt;11111111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;big&lt;/td&gt;
&lt;td&gt;11111111&lt;/td&gt;
&lt;td&gt;00000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Generic File Format
&lt;/h2&gt;

&lt;p&gt;From here on, we can only discuss the general patter of binary file formats, so keep in mind any file format you see does not need to adhere to what is discussed here.&lt;/p&gt;

&lt;p&gt;In most binary files, the data is generally split into two main types of sections: the file header and binary data blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Headers
&lt;/h3&gt;

&lt;p&gt;A header in a binary file is generally a collection of bytes that have fixed positions at the beginning of the file. A file header typically contains data about the version of the file format that the file was encoded with along with some other data about the contents of the file. Headers do not, however, have to be the same length in every file of the same type. Sometimes, the header needs to contain data that has a variable length, such as a string that is provided by the program. Strings are not always the same length, so in order to accomodate for this, headers will typically define the total length of the header and a constant position for the string to start. Any program that parses the file will then start reading the string at the constant index and continue untill it has read the full length of the header.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Blocks
&lt;/h3&gt;

&lt;p&gt;The rest of a file, after the header, is generally devoted to data blocks. Each data block can be either a fixed or variable size, and will commonly have it's own header that tells the program that is parsing the file how to use the data inside the block, as well as the lenght of the block if it is a variable size.&lt;/p&gt;

&lt;p&gt;Hope that I have successfully explained how binary file formatting works. If you have any questions or see an issue with a part of this article, feel free to drop a comment below and I will fix it as soon as I can. Happy Hacking!&lt;/p&gt;

&lt;h2&gt;
  
  
  Feeling Generous?
&lt;/h2&gt;

&lt;p&gt;I am a 17 year old, self-taught, web developer trying to make a living while stuck with oppressive parents, and trying to find a way to pay for college while not being allowed to have a job. I would appreciate any donations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/errorgamer2000" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.buymeacoffee.com%2Fbutton-api%2F%3Ftext%3DBuy%2520me%2520a%2520coffee%26emoji%3D%26slug%3Derrorgamer2000%26button_colour%3DFFDD00%26font_colour%3D000000%26font_family%3DCookie%26outline_colour%3D000000%26coffee_colour%3Dffffff"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Not Going to Donate?
&lt;/h2&gt;

&lt;p&gt;Even if you don't donate, simply liking this post or sharing it with anyone that might find it useful is a huge help.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>binary</category>
      <category>file</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Adding Recent Blog Posts to Your GitHub Readme</title>
      <dc:creator>ErrorGamer2000</dc:creator>
      <pubDate>Mon, 04 Apr 2022 00:13:53 +0000</pubDate>
      <link>https://dev.to/errorgamer2000/adding-recent-blog-posts-to-your-github-readme-4n11</link>
      <guid>https://dev.to/errorgamer2000/adding-recent-blog-posts-to-your-github-readme-4n11</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is my first post here. I am still learning, so If you see any issues with this post please let me know so that I can fix them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GitHub is one of the most popular git repository websites, hosting a countless number of open source projects. Over the years, GitHub has grown into a diverse community, full of great code created by both solo web development hobbyists like myself and professional teams working for big companies like Facebook.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hi there. 👋
&lt;/h1&gt;

&lt;p&gt;I'm ErrorGamer2000 (I may reveal my real name in the future, but for now I'll remain hidden behind this pseudonym). I am a solo web developer working my way through my junior year in high school, and I spent the majority of my "virtual school" year during the COVID-19 pandemic pretty much ignoring my classes, using the time to instead teach myself web development. For my first blog post, I want to share my first REAL JavaScript (well, really, it's TypeScript) project with you.&lt;/p&gt;

&lt;h1&gt;
  
  
  Okay, we get it, back to the post already!
&lt;/h1&gt;

&lt;p&gt;If you have used GitHub before, which I'm sure you have, you have most undoubtedly come across a profile readme before. While GitHub allows some level of profile personalization out-of-the-box, the profile readme feature allows you to add any content you want to your profile. Take &lt;a href="https://github.com/ErrorGamer2000"&gt;my profile&lt;/a&gt; for example. As you can see, I have many different elements that are not a part of the normal GitHub profile.&lt;/p&gt;

&lt;p&gt;Since these readme files provide your potential followers, customers, or even potential employers with a quick overview of both your activity and your ability, you want to put as much relevant content as you can on your readme. Just don't make it too long, or nobody will take the time to read it 😉.&lt;/p&gt;

&lt;p&gt;Now, since you want your customers or employers to see the full extent of your skills, there are many tidbits of information that would be perfect to put on your profile, including any blog posts that you have made. If you are a blogger as well as a developer, then this is the perfect article for you (Even if you aren't feel free to keep reading, I don't mind).&lt;/p&gt;

&lt;p&gt;As I planned to start blogging, I stumbled across this idea as I myself was looking to start a blogging presence of my own. As I looked around, I was able to only find &lt;a href="https://github.com/marketplace/actions/blog-post-workflow"&gt;one easy-to-use GitHub action&lt;/a&gt; that would allow me to add a list of my posts to my readme. Sadly, I was disappointed to discover that this action had little formatting, only setting up the posts as a bulleted list of links, which was less than appealing to the eye.&lt;/p&gt;

&lt;h1&gt;
  
  
  Alright, I'm lost. What is this post really about?
&lt;/h1&gt;

&lt;p&gt;Okay, okay. I get it. A little much background, right? So, to the point. Unable to find a suitable solution, I began making one myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Action itself
&lt;/h2&gt;

&lt;p&gt;I figure I've kept you long enough by now. This action is extremely simple to use, all you need to do is give it a simple URL, and it does the rest.&lt;/p&gt;

&lt;p&gt;If you want to go ahead and see what it looks like, go ahead and &lt;a href="https://github.com/marketplace/actions/github-readme-blog-post-action"&gt;look at it on the GitHub Actions Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;As I said, this action is very easy to use, and there is minimal setup. Let's go ahead and start with a basic workflow file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate Blog List&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*/1&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;blog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fetch and Generate Blog Posts&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow, as you may be able to see, runs every time you push new code to the repository (so, if you update the readme it will automatically replace the old blog posts in case you changed the configuration of the action) as well as on a set schedule of every hour.&lt;/p&gt;

&lt;p&gt;Now, in order for this action to be able to work, the action needs to have the ability to read your readme, so let's go ahead and add a checkout step to start with. Add a new step that consists simply of a &lt;code&gt;uses&lt;/code&gt; property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will ensure that the repository is fully loaded for the action to run in. Now that we are about ready to actually add the step to load our posts, there is one last thing that we need: our &lt;a href="https://rss.com/blog/how-do-rss-feeds-work/"&gt;RSS feed&lt;/a&gt;. Now the URL to your RSS feed will depend on the site that you are blogging on. For dev.to, it is &lt;code&gt;https://dev.to/feed/{username}&lt;/code&gt;, where you replace &lt;code&gt;{username}&lt;/code&gt; with your username. For example, my RSS feed URL here would be &lt;code&gt;https://dev.to/feed/errorgamer2000&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the Action
&lt;/h2&gt;

&lt;p&gt;Now we are finally ready to set up the action. Let's add another step to our workflow, but we will give this one a name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Readme Blog Post Action&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ErrorGamer2000/github-readme-blog-post-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;feed_urls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{rss_feed}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, just replace the &lt;code&gt;{rss_feed}&lt;/code&gt; with the URL to your RSS feed. You may have noticed that the option we are using is called &lt;code&gt;feed_urls&lt;/code&gt; rather than &lt;code&gt;feed_url&lt;/code&gt;. Plural, not singular. That's right: you can give multiple URLs for different feeds, each of them separated by a comma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final configuration
&lt;/h2&gt;

&lt;p&gt;Almost done, hang in there!&lt;/p&gt;

&lt;p&gt;Now that we have added this action to our workflow, the action will automatically create all of the images it needs and save them to the folder &lt;code&gt;blog-post-list-output&lt;/code&gt;. Go ahead. Save the file, commit it, and (if you are running a locally cloned repo) push your changes. Head over to the GitHub website for your repository and open the actions tab. You should see your brand new &lt;code&gt;Generate Blog List&lt;/code&gt; action showing up there, with a little orange circle next to it. Wait until the action has finished (the circle will become a green checkmark) and open up the readme.md file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uhhh, nothing happened. There isn't even the &lt;code&gt;blog-post-list-output&lt;/code&gt; folder...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, of course nothing happened. The action &lt;strong&gt;did&lt;/strong&gt; make the changes to the repo, but we have not set up anything to actually save those changes. To do that, we need one final step: a &lt;code&gt;git commit&lt;/code&gt; step. If you are handy with the &lt;code&gt;git&lt;/code&gt; CLI, go ahead and do this yourself. I, however, prefer to use &lt;code&gt;stefanzweifel/git-auto-commit-action&lt;/code&gt;. So, let's add another step to the workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Readme Blog Post Action&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ErrorGamer2000/github-readme-blog-post-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;feed_urls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{rss_feed}"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commit changed files&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stefanzweifel/git-auto-commit-action@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;commit_message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Save Generated Blog Posts&lt;/span&gt;
          &lt;span class="na"&gt;skip_checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will save the changed files. Go ahead and try this out again, committing the changed workflow file and head over to the Actions tab again. Once your workflow has finished running, head back over to the readme.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ugh, not again. Still no posts on the readme. But we are making progress: the new folder is there and everything.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, yes, there is nothing in the readme yet. But our workflow is complete and running smoothly, we simply have not told it where to put the list of posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Telling the Action Where to Put the Posts
&lt;/h2&gt;

&lt;p&gt;Now that our workflow is *work*ing 😏, all that is left is to actually make it put stuff into the readme. to do that, just slap a couple of comments in it somewhere, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- blog-post-list:start --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- blog-post-list:end --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit the changes again, wait for the workflow to finish, and then check the readme.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OMG IT WORKED!!!!!!!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes, congrats, you did it! you now have a working, automatically updated, list of posts on your readme! Have fun!🤗&lt;/p&gt;

&lt;h1&gt;
  
  
  Customizing the Action
&lt;/h1&gt;

&lt;p&gt;There are a number of different options that you can use with the action:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This table will most likely become out of date as I update the action. Head over to the &lt;a href="https://github.com/ErrorGamer2000/github-readme-blog-post-action"&gt;GitHub Repository&lt;/a&gt; to see an up-to-date table.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Option Name&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Default Value&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;feed_urls&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;""&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;A (comma-seperated) list of RSS feed URLs to load posts from. This is the only required input.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;max_posts_per_url&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The maximum number of posts to show for each feed. If the number of posts is less than this, then all of the posts will be shown.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;position_indicator&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;blog-post-list&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The text of the comments that the action uses to inject the images into the README file. Everything between the two comments in the form &lt;code&gt;&amp;lt;!-- position_indicator:start --&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;!-- position_indicator:end --&amp;gt;&lt;/code&gt; is replaced. Changing this can allow you to use multiple configurations for different feeds by using different markers for each.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_feed_data&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the generated markdown describing the feed, which includes the title of the feed, the description of the feed, the &lt;code&gt;Read More&lt;/code&gt; link, the last updated date, and the post count. Each of these can also be individually toggled with the following options. This will override any of the specific options, so it is better to disable/enable them specifically if you want to remove some elements.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_feed_title&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the header containing the title of the feed. This will be formatted as an &lt;code&gt;h2&lt;/code&gt; header. An option to customize this header will be in a future update.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_feed_description&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the title of the feed that is provided by the RSS feed.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_read_more&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the &lt;code&gt;Read More&lt;/code&gt; link under the feed description.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_last_updated_date&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the date and time of the last update of the list.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_post_count&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the number of posts shown and the total number of posts provided by the RSS feed.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;show_post_date&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Whether or not to show the date of each post on the card.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;locale&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"en"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The locale of the project. This is used &lt;strong&gt;purely&lt;/strong&gt; for formatting the dates of the cards and last update.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;time_zone&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"UTC"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;A valid time zone to use for the last updated date.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code&gt;output_dir&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;"blog-post-list-output"&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;The directory to store the post card images in. Must be in the root directory (i.e. no path separators &lt;code&gt;/&lt;/code&gt; or &lt;code&gt;\&lt;/code&gt;) and cannot include the characters &lt;code&gt;/\?%*:|"&amp;lt;&amp;gt;&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  How It Works
&lt;/h1&gt;

&lt;p&gt;This action does a little more than just parsing a simple RSS feed. It does start with this, however, and it uses this data as a backup for missing information. What it &lt;strong&gt;does&lt;/strong&gt; do is use the link that it receives from the feed to fetch the HTML for the webpage of the blog, and then uses &lt;a href="https://ogp.me/"&gt;The Open Graph protocol&lt;/a&gt; to find the preview image for the post as well as the title and description. Any of this missing information is taken from the RSS feed, if it is there. If an image is not found for the post, then it is removed from the card.&lt;/p&gt;

&lt;p&gt;Happy coding! Please let me know how you feel about this post, and anything else you think I should add in the future!&lt;/p&gt;

</description>
      <category>github</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
