<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Kristofer Koishigawa - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Kristofer Koishigawa - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 14 Jun 2026 10:14:40 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/scissorsneedfoodtoo/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Sign and Validate JSON Web Tokens – JWT Tutorial ]]>
                </title>
                <description>
                    <![CDATA[ A JSON Web Token, or JWT, is an open standard for securely creating and sending data between two parties, usually a client and a server. If you've ever signed in to a site like freeCodeCamp with your Google or GitHub account, there's a good chance th... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-sign-and-validate-json-web-tokens/</link>
                <guid isPermaLink="false">66ac880a2dd2c39dc134e0bf</guid>
                
                    <category>
                        <![CDATA[ authentication ]]>
                    </category>
                
                    <category>
                        <![CDATA[ authorization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JWT ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Fri, 09 Dec 2022 10:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/01/shubham-dhage-gC_aoAjQl2Q-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A JSON Web Token, or JWT, is an open standard for securely creating and sending data between two parties, usually a client and a server.</p>
<p>If you've ever signed in to a site like freeCodeCamp with your Google or GitHub account, there's a good chance that you're already using a JWT.</p>
<p>In this article, we'll go over how JWTs are used, then dig into what JWTs are, and how they can securely transmit data through the signature and validation process.</p>
<h2 id="heading-how-jwts-are-used">How JWTs Are Used</h2>
<p>JWTs are usually used to manage user sessions on a website. While they're an important part of the token based authentication process, JWTs themselves are used for authorization, not authentication.</p>
<p>Here's a good overview of how token based authentication works:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/01/token-based-authentication.jpg" alt="A diagram showing the flow for token based authentication with JWT." width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://hackernoon.com/using-session-cookies-vs-jwt-for-authentication-sd2v3vci">Source</a></em></p>
<p>When you sign in to a site with a username and password, or with a third party method like Google, you're proving who you are with those sensitive details or access. This process is called <strong>authentication</strong>.</p>
<p>Once you're signed in, the site's server sends back a JWT that allows you access to things like your settings page, shopping cart, and so on. This process is called <strong>authorization</strong>.</p>
<p>You send your JWT to the server with each request. When the server receives it, it generates a signature using some data from your JWT, verifies it, and if your JWT is valid, it sends back a response.</p>
<h2 id="heading-what-are-jwts">What are JWTs?</h2>
<p>At their core, JWTs are just bits of encoded JSON data with a cryptographic signature at the end.</p>
<p>Here's an example of a JWT:</p>
<pre><code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IlF1aW5jeSBMYXJzb24iLCJpYXQiOjE1MTYyMzkwMjJ9.WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE
</code></pre><p>Each JWT is made up of three segments, each separated by a dot (<code>.</code>). These three segments are the header, payload, and signature.</p>
<p>If you copy and paste that JWT into the <a target="_blank" href="https://jwt.io/">JWT.io Debugger</a>, you can see the decoded versions of those three segments.</p>
<h3 id="heading-header-segment">Header Segment</h3>
<p>The header segment of a JWT contains information about the algorithm and token type.</p>
<p>Here's the header segment of the example JWT token above:</p>
<pre><code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
</code></pre><p>The header segment is base 64 URL encoded, and decodes to the following JSON object:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"alg"</span>: <span class="hljs-string">"HS256"</span>,
  <span class="hljs-attr">"typ"</span>: <span class="hljs-string">"JWT"</span>
}
</code></pre>
<p><code>"alg"</code> is the type of algorithm used in the last segment, the cryptographic signature. In this case, the HMAC SHA256 algorithm is used, though RSA is also common.</p>
<p><code>"typ"</code> is the type of token the segmented string is, which in this case is JWT.</p>
<h3 id="heading-payload-segment">Payload Segment</h3>
<p>The payload segment of a JWT contains registered claims or identifying information, usually for a user.</p>
<p>Here's the payload segment of the example JWT token above:</p>
<pre><code>eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IlF1aW5jeSBMYXJzb24iLCJpYXQiOjE1MTYyMzkwMjJ9
</code></pre><p>The payload segment is also base 64 URL encoded, and decodes to the following JSON object:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"sub"</span>: <span class="hljs-string">"1234567890"</span>,
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Quincy Larson"</span>,
  <span class="hljs-attr">"iat"</span>: <span class="hljs-number">1516239022</span>
}
</code></pre>
<p>Since JWTs are usually used as part of the authentication method for sites, the payload segment usually contains identifying information for a user. These claims fall into three categories: registered, public, and private.</p>
<p>Registered claims are a set of predefined claims defined <a target="_blank" href="https://www.rfc-editor.org/rfc/rfc7519#section-4.1">here</a> that are optional, but recommended when using JWTs.</p>
<p>Public claims are optional claims, usually from the <a target="_blank" href="https://www.iana.org/assignments/jwt/jwt.xhtml">IANA JSON Web Token Registry</a>.</p>
<p>Private claims are optional, and are any claims that don't fall under the registered or public claims categories.</p>
<p><code>"sub"</code> is the subject of the JWT, and is usually a unique identifying string for a user in an application, usually an email address, username, or id. Subjects are registered claims.</p>
<p><code>"name"</code> is the full name of the user who was issued the JWT, and is a public claim.</p>
<p><code>"iat"</code> is the "issued at" date for the token, and is a registered claim.</p>
<h3 id="heading-signature-segment">Signature Segment</h3>
<p>The signature segment of a JWT contains the cryptographic signature of the token.</p>
<p>Here's the signature segment of the example JWT token above:</p>
<pre><code>WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE
</code></pre><p>The signature segment is made up of the base 64 URL encoded header and payload segments, a secret (usually the contents of a key in a signing algorithm), and hashed using the algorithm defined in the header segment:</p>
<pre><code>HMACSHA256(
  base64UrlEncode(header) + <span class="hljs-string">"."</span> +
  base64UrlEncode(payload),
  your<span class="hljs-number">-256</span>-bit-secret
)
</code></pre><p>The signature helps ensure that the data in the header and payload segments haven't been tampered with, and the JWT can be trusted.</p>
<p>However, it's important to note that the cryptographic signature at the end of the JWT is just for validation. It doesn't encrypt any data in the header or payload segments of the token. So you should never send sensitive information like a user's password in a JWT – everything in the header and payload can and should be public.</p>
<h4 id="heading-how-to-validate-jwt-signatures">How to Validate JWT Signatures</h4>
<p>The exact method for validating a signature depends on the algorithm defined in the header segment and used to generate the signature itself.</p>
<p>For the HS256 signing algorithm, a private key is shared between two entities, say your application's server and an authentication server. This private key is used both to generate signatures for outgoing JWTs, and to validate signatures from incoming JWTs.</p>
<p>When your authentication server receives an incoming JWT, it uses the incoming JWT's header and payload segments and the shared private key to generate a signature.</p>
<p>If the signature matches, then your application knows that the incoming JWT can be trusted.</p>
<p>Another popular signing algorithm is RS256, which uses public and private key pairs to validate signatures. This is similar to the system used for SSH and SSL.</p>
<p>If you'd like to read more about how RS256 works, check out this article:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/understanding-encryption-algorithms/#rsa">https://www.freecodecamp.org/news/understanding-encryption-algorithms/#rsa</a></div>
<h2 id="heading-other-helpful-tutorials">Other Helpful Tutorials</h2>
<p>If you'd like to learn more about JWTs and how to use them in applications, check out these tutorials:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/what-are-json-web-tokens-jwt-auth-tutorial/">https://www.freecodecamp.org/news/what-are-json-web-tokens-jwt-auth-tutorial/</a></div>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/learn-to-implement-user-authentication-in-node-apps-using-passport-js/">https://www.freecodecamp.org/news/learn-to-implement-user-authentication-in-node-apps-using-passport-js/</a></div>
<h2 id="heading-thanks-for-reading">Thanks for Reading</h2>
<p>If you found this article on JWTs helpful, consider sharing it so more people can benefit from it.</p>
<p>Also, feel free to reach out on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a> and let me know what you think.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ sudo apt-get update vs upgrade – What is the Difference? ]]>
                </title>
                <description>
                    <![CDATA[ sudo apt-get update and sudo apt-get upgrade are two commands you can use to keep all of your packages up to date in Debian or a Debian-based Linux distribution. They're common commands for Linux admins and people doing DevOps, but are handy to know ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/sudo-apt-get-update-vs-upgrade-what-is-the-difference/</link>
                <guid isPermaLink="false">66ac883433a54a9b1a447936</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ command line ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Mon, 02 May 2022 19:30:12 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/04/gabriel-heinzer-4Mw7nkQDByk-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> are two commands you can use to keep all of your packages up to date in Debian or a Debian-based Linux distribution.</p>
<p>They're common commands for Linux admins and people doing DevOps, but are handy to know even if you don't use the command line often.</p>
<p>In this article, I'll go into what both of these commands do, how to use them, and some frequently asked questions.</p>
<h2 id="heading-what-are-the-differences-between-sudo-apt-get-update-and-sudo-apt-get-upgrade">What Are the Differences Between <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code>?</h2>
<p>The main difference is that <code>sudo apt-get update</code> fetches the latest version of the package list from your distro's software repository, and any third-party repositories you may have configured. In other words, it'll figure out what the latest version of each package and dependency is, but will not actually download or install any of those updates.</p>
<p>The <code>sudo apt-get upgrade</code> command downloads and installs the updates for each outdated package and dependency on your system. But just running <code>sudo apt-get upgrade</code> will not automatically upgrade the outdated packages – you'll still have a chance to review the changes and confirm that you want to perform the upgrades.</p>
<h2 id="heading-how-to-use-the-sudo-apt-get-update-command">How to Use the <code>sudo apt-get update</code> Command</h2>
<p>In your Debian-based Linux distro (Debian, Ubuntu, Linux Mint, Kali Linux, Raspberry Pi OS, and so on), open a terminal window.</p>
<p>Depending on your distro, the terminal might go by different names depending on how you open it. For example, in Ubuntu and Linux Mint, the default terminal is Gnome Terminal, but may be listed under Terminal in the application menu.</p>
<p>In the terminal, enter <code>sudo apt-get update</code> in the command line, enter in your admin password, and press the Enter key.</p>
<p>If there are updates, you'll see an output similar to this:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get update
Hit:1 https://ftp.harukasan.org/raspbian/raspbian bullseye InRelease
Get:2 https://download.docker.com/linux/raspbian bullseye InRelease [26.7 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye InRelease [23.7 kB]       
Get:4 http://packages.azlux.fr/debian buster InRelease [3,989 B]               
Get:5 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [282 kB]
Get:6 http://packages.azlux.fr/debian buster/main armhf Packages [3,418 B]
Fetched 340 kB <span class="hljs-keyword">in</span> 4s (94.8 kB/s)     
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
3 packages can be upgraded. Run <span class="hljs-string">'apt list --upgradable'</span> to see them.
</code></pre>
<p>If you want to see which packages can be upgraded, run <code>apt list --upgradable</code>:</p>
<pre><code class="lang-bash">kris@pihole:~ $ apt list --upgradable
Listing... Done
libcamera0/stable 0~git20220426+18e68a9b-1 armhf [upgradable from: 0~git20220303+e68e0f1e-1]
raspi-config/stable 20220425 all [upgradable from: 20220419]
rpi-eeprom/stable 13.13-1 armhf [upgradable from: 13.12-1]
</code></pre>
<p>But if there are no newer versions of packages or dependencies in your distro's software repository, you'll see an output like this:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get update
Get:1 https://download.docker.com/linux/raspbian bullseye InRelease [26.7 kB]
Hit:2 https://ftp.harukasan.org/raspbian/raspbian bullseye InRelease           
Hit:3 http://packages.azlux.fr/debian buster InRelease                         
Hit:4 http://archive.raspberrypi.org/debian bullseye InRelease
Fetched 26.7 kB <span class="hljs-keyword">in</span> 3s (8,789 B/s)
Reading package lists... Done
</code></pre>
<p>Notice that there is no mention of packages that can be upgraded, and no note about running <code>apt list --upgradable</code>.</p>
<p>But this does not necessarily mean there's no outdated software on your system, just that you already got the latest version of the package list. You may have run <code>sudo apt-get update</code> multiple times.</p>
<p>You can always run <code>apt list --upgradable</code> again to see if anything can be upgraded.</p>
<p>Or you can use the more modern <code>sudo apt update</code> command instead. This command will always show you the number of packages that can be upgraded, or a note saying everything is up to date.</p>
<p>For more information about the differences between <code>apt</code> and <code>apt-get</code>, <a class="post-section-overview" href="#what-s-the-difference-between-apt-get-and-apt">check out this section below</a>.</p>
<h2 id="heading-how-to-use-the-sudo-apt-get-upgrade-command">How to Use the <code>sudo apt-get upgrade</code> Command</h2>
<p>After running the <code>sudo apt-get update</code> command, in the same terminal window, type in <code>sudo apt-get upgrade</code>, enter your password if necessary, and hit enter.</p>
<p>Then, you'll see an output similar to this:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to <span class="hljs-built_in">continue</span>? [Y/n]
</code></pre>
<p>Towards the bottom of the output, you'll see the packages that will be upgraded:</p>
<pre><code class="lang-bash">The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
</code></pre>
<p>The amount of data that needs to be fetched, and the amount of storage space the upgraded packages will use once installed:</p>
<pre><code class="lang-bash">Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
</code></pre>
<p>And finally, you'll see a prompt asking if you want to continue with the upgrade:</p>
<pre><code class="lang-bash">Do you want to <span class="hljs-built_in">continue</span>? [Y/n]
</code></pre>
<p>You can enter <code>y</code>, <code>Y</code>, or <code>yes</code> to continue with the upgrade, or <code>n</code>, <code>N</code>, or <code>no</code> to exit out of the <code>upgrade</code> command.</p>
<p>If you choose to exit out, you'll see an output like this:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to <span class="hljs-built_in">continue</span>? [Y/n] n
Abort.
</code></pre>
<p>If you choose to continue with the upgrade, you'll see a long output like this:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Do you want to <span class="hljs-built_in">continue</span>? [Y/n] y
Get:1 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera0 armhf 0~git20220426+18e68a9b-1 [548 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye/main armhf raspi-config all 20220425 [30.3 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye/main armhf rpi-eeprom armhf 13.13-1 [2,037 kB]
Fetched 2,616 kB <span class="hljs-keyword">in</span> 3s (1,019 kB/s)   
Reading changelogs... Done
(Reading database ... 43496 files and directories currently installed.)
Preparing to unpack .../libcamera0_0~git20220426+18e68a9b-1_armhf.deb ...
Unpacking libcamera0:armhf (0~git20220426+18e68a9b-1) over (0~git20220303+e68e0f1e-1) ...
Preparing to unpack .../raspi-config_20220425_all.deb ...
Unpacking raspi-config (20220425) over (20220419) ...
Preparing to unpack .../rpi-eeprom_13.13-1_armhf.deb ...
Unpacking rpi-eeprom (13.13-1) over (13.12-1) ...
Setting up rpi-eeprom (13.13-1) ...
Setting up libcamera0:armhf (0~git20220426+18e68a9b-1) ...
Setting up raspi-config (20220425) ...
Processing triggers <span class="hljs-keyword">for</span> man-db (2.9.4-2) ...
Processing triggers <span class="hljs-keyword">for</span> libc-bin (2.31-13+rpt2+rpi1+deb11u2) ...
</code></pre>
<p>And once that's complete, all of the outdated packages and dependencies will be updated.</p>
<p>One important thing to remember about the <code>sudo apt-get upgrade</code> command is that it only upgrades what it can without removing anything. </p>
<p>For example, if an upgrade requires a new dependency, the <code>upgrade</code> command will download and install it, but it will not remove the old dependency. Removing old dependencies requires a different command. You'll see this a lot when you upgrade to a new kernel version.</p>
<p>If you see a message similar to this after upgrading:</p>
<pre><code class="lang-bash">The following packages were automatically installed and are no longer required:
  g++-8 gir1.2-mutter-4 libapache2-mod-php7.2 libcrystalhd3
Use <span class="hljs-string">'sudo apt autoremove'</span> to remove them.
</code></pre>
<p>You can follow the suggestion and use <code>sudo apt autoremove</code> to remove those unnecessary packages.</p>
<h2 id="heading-how-to-use-special-options-with-the-sudo-apt-get-upgrade-command">How to Use Special Options With the <code>sudo apt-get upgrade</code> Command</h2>
<p>There are a number of special options or parameters that you can use with the <code>sudo apt-get upgrade</code> command, but two stand out: <code>--dry-run</code> and <code>--yes</code>.</p>
<h3 id="heading-how-to-use-the-dry-run-option">How to Use the <code>--dry-run</code> Option:</h3>
<p>The <code>--dry-run</code> (alternatively, <code>-s</code> or <code>--simulate</code>) option simulates what would happen during the upgrade process, but doesn't actually change anything on your system:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get upgrade --dry-run
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Inst libcamera0 [0~git20220303+e68e0f1e-1] (0~git20220426+18e68a9b-1 Raspberry Pi Foundation:stable [armhf])
Inst raspi-config [20220331] (20220425 Raspberry Pi Foundation:stable [all])
Inst rpi-eeprom [13.12-1] (13.13-1 Raspberry Pi Foundation:stable [armhf])
Conf libcamera0 (0~git20220426+18e68a9b-1 Raspberry Pi Foundation:stable [armhf])
Conf raspi-config (20220425 Raspberry Pi Foundation:stable [all])
Conf rpi-eeprom (13.13-1 Raspberry Pi Foundation:stable [armhf])
</code></pre>
<p>Though again, while Debian and Debian-based distros are very stable, this option is useful if you want to make sure there are no conflicts during an upgrade.</p>
<h3 id="heading-how-to-use-the-yes-option">How to Use the <code>--yes</code> Option:</h3>
<p>The <code>--yes</code> (alternatively, <code>-y</code> or <code>--assume-yes</code>) option automatically answers yes to any prompts if it's safe to do so:</p>
<pre><code class="lang-bash">kris@pihole:~ $ sudo apt-get upgrade --yes
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  libcamera0 raspi-config rpi-eeprom
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,616 kB of archives.
After this operation, 1,596 kB of additional disk space will be used.
Get:1 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera0 armhf 0~git20220426+18e68a9b-1 [548 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye/main armhf raspi-config all 20220425 [30.3 kB]
Get:3 http://archive.raspberrypi.org/debian bullseye/main armhf rpi-eeprom armhf 13.13-1 [2,037 kB]
...
Processing triggers <span class="hljs-keyword">for</span> libc-bin (2.31-13+rpt2+rpi1+deb11u2) ...
</code></pre>
<p>Note that the <code>Do you want to continue? [Y/n]</code> is skipped above, and all packages are upgraded.</p>
<h2 id="heading-faqs">FAQs</h2>
<h3 id="heading-what-are-sudo-and-apt-get">What Are <code>sudo</code> and <code>apt-get</code>?</h3>
<p>An important thing to note about <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> is that both commands are made up of three parts: <code>sudo</code>, <code>apt-get</code>, and <code>update</code> or <code>upgrade</code>.</p>
<p><code>sudo</code> stands for "superuser do", and allows you to run programs with root or admin privileges.</p>
<p>For example, rebooting a system requires superuser/root-level privileges, so running <code>reboot</code> in the terminal might return errors similar to this:</p>
<pre><code>Failed to set wall message, <span class="hljs-attr">ignoring</span>: Interactive authentication required.
Failed to reboot system via logind: Interactive authentication required.
Failed to open initctl fifo: Permission denied
Failed to talk to init daemon.
</code></pre><p>But if you run <code>sudo reboot</code>, then enter your admin password, you will run the <code>reboot</code> command as a superuser, and your system will restart immediately.</p>
<p><code>apt-get</code> is a command line tool in Debian and Debian-based Linux distros that you use to install and manage packages.</p>
<h3 id="heading-whats-the-difference-between-apt-get-and-apt">What's the Difference Between <code>apt-get</code> and <code>apt</code>?</h3>
<p><code>apt</code> is a more modern tool for installing and managing applications on Debian and Debian-based distros.</p>
<p>For the most part, <code>apt</code> and <code>apt-get</code> can be used interchangeably – <code>sudo apt update</code> and <code>sudo apt-get update</code> both update the package list on your system. </p>
<p>The main differences you'll notice is that <code>apt</code> is easier to type, its output is generally more useful, and it includes some user-friendly features like a progress bar when installing packages.</p>
<p>While most of the examples in this article use <code>apt-get</code>, I strongly encourage you to use <code>apt</code> instead.</p>
<h3 id="heading-are-sudo-apt-get-update-and-sudo-apt-get-upgrade-safe-to-use">Are <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> Safe to Use?</h3>
<p>Yes, Debian and Debian-based distros are generally very stable, and the <code>update</code> and <code>upgrade</code> commands are safe to use. This is because major updates for packages / dependencies, and the distros themselves, are only released once or twice a year.</p>
<p>The downside is that, unlike with bleeding edge distros like Arch Linux, if you want to use the most recent version of a package, you might need to put in some extra work. You may need to configure a third-party repository via a PPA, use an alternative packaging system like Snap of Flatpak, or compile the package yourself.</p>
<p>But the stability that comes with slightly older software is worth it, at least in my opinion.</p>
<h3 id="heading-can-you-chain-the-sudo-apt-get-update-and-sudo-apt-get-upgrade-commands">Can You Chain the <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> Commands?</h3>
<p>You might be thinking, isn't it tedious to run <code>sudo apt-get update</code>, wait for that to complete, then run <code>sudo apt-get upgrade</code>?</p>
<p>While both <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> run pretty quickly, sometimes it's easier to execute a string of commands and check back on them a few minutes later.</p>
<p>With the <code>&amp;&amp;</code> operator, you can chain multiple commands together like this:</p>
<pre><code class="lang-bash">sudo apt-get update &amp;&amp; sudo apt-get upgrade
</code></pre>
<p>The important thing to remember with the <code>&amp;&amp;</code> operator is that the command after the operator only runs if the command before it is successful.</p>
<p>Using the example above, <code>sudo apt-get upgrade</code> only runs if <code>sudo apt-get update</code> succeeds. If there's some sort of error, like a network problem while updating the package list, then <code>sudo apt-get update</code> is skipped.</p>
<h3 id="heading-what-are-sudo-apt-get-dist-upgrade-and-sudo-apt-full-upgrade-and-are-they-safe-to-use">What Are <code>sudo apt-get dist-upgrade</code> and <code>sudo apt full-upgrade</code>, and Are They Safe to Use?</h3>
<p>According to <a target="_blank" href="https://askubuntu.com/questions/770135/apt-full-upgrade-versus-apt-get-dist-upgrade">this Stack Overflow thread</a>, these commands do the same thing under the hood – they upgrade outdated packages, and also intelligently remove some packages whenever necessary.</p>
<p>Essentially they're like the combination of the <code>sudo apt-get upgrade</code> and <code>sudo apt autoremove</code> commands.</p>
<p>Running these commands <em>should</em> be safe in most cases.</p>
<p>But a lot of people, myself included, recommend using <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> instead. You have more of a chance to review upcoming changes, and since <code>upgrade</code> never removes packages, it's less destructive.</p>
<h2 id="heading-thanksforreadingsh"><code>./thanks_for_reading.sh</code></h2>
<p>If you found this breakdown on <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> useful, please share it with your friends so more people can benefit from it.</p>
<p>Also, feel free to reach out on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a> and let me know what you think.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is a Rational Number? Definition and Rational Number Example ]]>
                </title>
                <description>
                    <![CDATA[ A rational number is any number that can be written as a fraction, where both the numerator (the top number) and the denominator (the bottom number) are integers, and the denominator is not equal to zero. In other words, a rational number can be expr... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-a-rational-number-definition-and-rational-number-example/</link>
                <guid isPermaLink="false">66ac883a0479cf0e155d2617</guid>
                
                    <category>
                        <![CDATA[ Math ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Mathematics ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Tue, 29 Mar 2022 17:44:47 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/03/markus-krisetya-Vkp9wg-VAsQ-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A rational number is any number that can be written as a fraction, where both the numerator (the top number) and the denominator (the bottom number) are integers, and the denominator is not equal to zero.</p>
<p>In other words, a rational number can be expressed as p/q, where p and q are both integers and q ≠ 0.</p>
<p>In this article, we'll go over what whole numbers and integers are, cover different types of rational numbers, and learn how to determine if a number is rational or not.</p>
<h2 id="heading-what-are-whole-numbers-and-integers">What Are Whole Numbers and Integers?</h2>
<p>Before getting into integers, it would be helpful to review what whole numbers are.</p>
<h3 id="heading-whole-numbers">Whole Numbers</h3>
<p>A whole number is any number from 0 up to infinity: 0, 1, 2, 3, 4, 5, ...</p>
<p>Note that whole numbers are just that – whole. They do not include decimals or fractions, and since they start from 0 and go up, all whole numbers are positive.</p>
<p>So 11, 0, 2014, and 938,840,123 are all whole numbers.</p>
<p>-2, 3.8, and 13/100 are not whole numbers.</p>
<h3 id="heading-integers">Integers</h3>
<p>Integers are exactly like whole numbers, but can also include negative numbers: ..., -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, ...</p>
<p>12, -33, and 0 are all integers.</p>
<p>But 1/2, 3.14, and -3.333 are not integers.</p>
<h2 id="heading-rational-numbers">Rational Numbers</h2>
<p>Again, a rational number is any number that can be expressed as a fraction, where both the numerator and denominator are integers, and the denominator is not 0:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/rational-number-in-fraction-form-1627574406.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://www.cuemath.com/numbers/rational-numbers/">Rational Numbers</a></em></p>
<p>Some examples of rational numbers include:</p>
<ul>
<li>3/4 (three quarters)</li>
<li>1/2 (one half)</li>
<li>5/8 (five eighths)</li>
</ul>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Rational_number#Etymology">According to Wikipedia</a>, the term <em>ratio</em> "is derived from <em>rational</em>".</p>
<p>So if a number can be expressed cleanly as a fraction, or a ratio between two integers, then it's a rational number. And if a number can't be expressed this way, then it's an irrational number.</p>
<h3 id="heading-types-of-rational-numbers">Types of Rational Numbers</h3>
<p>Though you learned what rational numbers are earlier in the article, it's helpful to break them up into broad categories, and look at different examples.</p>
<p>There are four types of rational numbers:</p>
<ul>
<li>integers</li>
<li>fractions made up of integers</li>
<li>terminating decimal numbers</li>
<li>non-terminating decimal numbers with infinitely repeating patterns</li>
</ul>
<h4 id="heading-integers-1">Integers</h4>
<p>Any integer can be converted cleanly into a fraction, and is a rational number.</p>
<p>For example, 3 can be expressed as 3/1. And since both the numerator (3) and denominator (1) are integers, and the denominator is not 0, then 3 is a rational number.</p>
<p>This works for negative integers like -2 (or -2/1) and -2006 (or -2006/1).</p>
<p>The number 0 is also a rational number, because it can be converted into a fraction. For example, 0/1, 0/-4, and 0/18,572 are all valid fractions, and meet the definition of a rational number.</p>
<h4 id="heading-fractions-made-up-of-integers">Fractions Made up of Integers</h4>
<p>Any fraction made up of integers is a rational number, as long as the denominator is not 0.</p>
<p>For example, 1/3, -5/3, and 27/-463 are all rational numbers.</p>
<h4 id="heading-terminating-decimal-numbers">Terminating Decimal Numbers</h4>
<p>Any decimal number that terminates, or ends at some point, is a rational number.</p>
<p>For example, take the decimal number 0.5. This can be converted to 1/2, which means its a rational number.</p>
<p>Even longer terminating decimal numbers can be cleanly converted into fractions. For instance, 0.0001 can be expressed as 1/10,000, meaning that it's a rational number.</p>
<p>As long as a decimal number eventually terminates, without rounding or approximation, it's a rational number.</p>
<h4 id="heading-non-terminating-decimal-numbers-with-infinitely-repeating-patterns">Non-terminating Decimal Numbers With Infinitely Repeating Patterns</h4>
<p>Decimal numbers that go on forever with repeating patterns are rational numbers. But this is a bit tricky, because the pattern must repeat infinitely.</p>
<p>For example, take the number 0.33333... Even though this is often simplified as 0.33, the pattern of 3's after the decimal point repeat infinitely. This means that the number can be converted into the fraction 1/3, and is a rational number.</p>
<p>But what about a more complicated number, like 0.142857142857...? Again, the 142857 pattern after the decimal repeats infinitely, and the number can be converted to 1/7, which is rational.</p>
<p>However, there are decimal numbers that go on infinitely that do not contain repeating patterns. These types of numbers are not rational numbers, and are known as <em>irrational</em> numbers.</p>
<h2 id="heading-irrational-numbers">Irrational Numbers</h2>
<p>Any number that does not meet the definition of a rational number is an irrational number.</p>
<p>Numbers like pi (π = 3.1415926536...) and many square roots (√2 = 1.41421356237...) have digits that go past the decimal point infinitely. But they don't contain infinitely repeating patterns, so they're considered irrational.</p>
<p>For example, while pi is often shortened to 3.14159, that's just an approximation. At the time of writing, <a target="_blank" href="https://theconversation.com/why-bother-calculating-pi-to-62-8-trillion-digits-its-both-useless-and-fascinating-166271">the world record for the number of digits of pi that have been calculated is 62.8 trillion</a>. And as computing power increases, so will that record.</p>
<p>But as far as anyone can tell, within those endless digits there are no repeating patterns, so pi is considered an irrational number.</p>
<h2 id="heading-thanks-for-reading"><strong>Thanks for Reading</strong></h2>
<p>If you found this article on rational numbers helpful, consider sharing it so more people can benefit from it.</p>
<p>Also, feel free to reach out on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a> and let me know what you think.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Roman Numerals – the Roman Numeral for 4, 6, 9, and Others ]]>
                </title>
                <description>
                    <![CDATA[ Roman numerals are a numerical system that originated in ancient Rome. They are used to represent numbers in the decimal system, but they are not used for mathematical operations. In this system, symbols are used to represent different numbers, with ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/roman-numerals-the-roman-numeral-for-4-6-9-and-others/</link>
                <guid isPermaLink="false">66ac882b15af8baa725ed386</guid>
                
                    <category>
                        <![CDATA[ Math ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Mathematics ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Mon, 28 Mar 2022 17:41:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/03/thomas-bormans-JsTmUnHdVYQ-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Roman numerals are a numerical system that originated in ancient Rome. They are used to represent numbers in the decimal system, but they are not used for mathematical operations.</p>
<p>In this system, symbols are used to represent different numbers, with I representing 1, V representing 5, X representing 10, L representing 50, C representing 100, D representing 500, and M representing 1,000.</p>
<p>Here is a table of the symbols used in the Roman numeral system:</p>
<table>
  <thead>
    <tr>
      <th>1</th>
      <th>5</th>
      <th>10</th>
      <th>50</th>
      <th>100</th>
      <th>500</th>
      <th>1,000</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>I</td>
      <td>V</td>
      <td>X</td>
      <td>L</td>
      <td>C</td>
      <td>D</td>
      <td>M</td>
    </tr>
  </tbody>
</table>

<p>The value of a numeral is determined by its position in relation to other symbols. When a symbol of equal or lesser value is placed after another symbol, their values are added. But when certain symbols of lesser value are placed before another symbol, their values are subtracted.</p>
<p>For example, the numeral VI, or 6, would be read as "five plus one" (5 + 1), and XI, or 11, is "ten plus one" (10 + 1).</p>
<p>But the methods for representing 4 and 9 are special. The Roman numeral IV, or 4, would be read as "one less than 5" (5 - 1). Also, the numeral IX, or 9, would be read as "one less than 10" (10 - 1).</p>
<p>Here is a table of numbers and their Roman numeral equivalent, followed by more in-depth explanations about how to perform the conversions. Just scroll through the table or use Ctrl/Cmd + f to find the value you're looking for:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Number</td><td>Roman numeral</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>I</td></tr>
<tr>
<td>2</td><td>II</td></tr>
<tr>
<td>3</td><td>III</td></tr>
<tr>
<td>4</td><td>IV</td></tr>
<tr>
<td>5</td><td>V</td></tr>
<tr>
<td>6</td><td>VI</td></tr>
<tr>
<td>7</td><td>VII</td></tr>
<tr>
<td>8</td><td>VIII</td></tr>
<tr>
<td>9</td><td>IX</td></tr>
<tr>
<td>10</td><td>X</td></tr>
<tr>
<td>11</td><td>XI</td></tr>
<tr>
<td>12</td><td>XII</td></tr>
<tr>
<td>13</td><td>XIII</td></tr>
<tr>
<td>14</td><td>XIV</td></tr>
<tr>
<td>15</td><td>XV</td></tr>
<tr>
<td>16</td><td>XVI</td></tr>
<tr>
<td>17</td><td>XVII</td></tr>
<tr>
<td>18</td><td>XVIII</td></tr>
<tr>
<td>19</td><td>XIX</td></tr>
<tr>
<td>20</td><td>XX</td></tr>
<tr>
<td>21</td><td>XXI</td></tr>
<tr>
<td>22</td><td>XXII</td></tr>
<tr>
<td>23</td><td>XXIII</td></tr>
<tr>
<td>24</td><td>XXIV</td></tr>
<tr>
<td>25</td><td>XXV</td></tr>
<tr>
<td>30</td><td>XXX</td></tr>
<tr>
<td>40</td><td>XL</td></tr>
<tr>
<td>50</td><td>L</td></tr>
<tr>
<td>60</td><td>LX</td></tr>
<tr>
<td>70</td><td>LXX</td></tr>
<tr>
<td>80</td><td>LXXX</td></tr>
<tr>
<td>90</td><td>XC</td></tr>
<tr>
<td>100</td><td>C</td></tr>
<tr>
<td>101</td><td>CI</td></tr>
<tr>
<td>102</td><td>CII</td></tr>
<tr>
<td>103</td><td>CIII</td></tr>
<tr>
<td>104</td><td>CIV</td></tr>
<tr>
<td>105</td><td>CV</td></tr>
<tr>
<td>200</td><td>CC</td></tr>
<tr>
<td>300</td><td>CCC</td></tr>
<tr>
<td>400</td><td>CD</td></tr>
<tr>
<td>500</td><td>D</td></tr>
<tr>
<td>600</td><td>DC</td></tr>
<tr>
<td>700</td><td>DCC</td></tr>
<tr>
<td>800</td><td>DCCC</td></tr>
<tr>
<td>900</td><td>CM</td></tr>
<tr>
<td>1,000</td><td>M</td></tr>
<tr>
<td>1,001</td><td>MI</td></tr>
<tr>
<td>1,002</td><td>MII</td></tr>
<tr>
<td>1,003</td><td>MIII</td></tr>
<tr>
<td>1,004</td><td>MIV</td></tr>
<tr>
<td>1,005</td><td>MV</td></tr>
<tr>
<td>1,900</td><td>MCM</td></tr>
<tr>
<td>2,000</td><td>MM</td></tr>
<tr>
<td>3,000</td><td>MMM</td></tr>
<tr>
<td>3,999</td><td>MMMCMXCIX</td></tr>
</tbody>
</table>
</div><h2 id="heading-how-to-convert-a-number-into-roman-numerals">How to Convert a Number into Roman Numerals</h2>
<p>Because Roman numerals are often ordered from largest to smallest, break the number you're converting up into groups of thousands, hundreds, tens, and ones, and perform the conversion on each group.</p>
<p>For example, if you want to convert the number 2,014 (the year freeCodeCamp was founded) into Roman numerals, break the number up as follows:</p>
<pre><code><span class="hljs-number">2</span>,<span class="hljs-number">014</span> = <span class="hljs-number">2</span>,<span class="hljs-number">000</span> + <span class="hljs-number">10</span> + <span class="hljs-number">4</span>
</code></pre><p>Then perform the conversion on each group and combine them to get the Roman numeral equivalent:</p>
<pre><code>* <span class="hljs-number">2</span>,<span class="hljs-number">000</span> = MM
* <span class="hljs-number">10</span> = X
* <span class="hljs-number">4</span> = IV

<span class="hljs-number">2</span>,<span class="hljs-number">014</span> = <span class="hljs-number">2</span>,<span class="hljs-number">000</span> + <span class="hljs-number">10</span> + <span class="hljs-number">4</span> = MMXIV
</code></pre><h2 id="heading-how-to-represent-large-numbers-in-roman-numerals">How to Represent Large Numbers in Roman Numerals</h2>
<p>You might have noticed that the chart above only goes from 1 to 3,999.</p>
<p>This is due to the special methods for representing 4 and 9 mentioned above. If you check the table above, you'll see that whenever a 4 or 9 appears (including 40, 90, 400, 900) that the Roman numerals are ordered in a particular way so the lesser symbol is subtracted from the one of greater value immediate afterwards.</p>
<p>Since Roman numerals were never fully standardized, you might see the number 4,000 represented as MMMM.</p>
<p>This works, but many see this as invalid since 4 (and 9) have special representations in lower numbers.</p>
<p>Instead, one of the most common ways to represent larger Roman numerals is with a <a target="_blank" href="https://en.wikipedia.org/wiki/Roman_numerals#Vinculum">vinculum</a>, or a straight horizontal line above one or more symbols.</p>
<p>If you see a Roman numeral symbol with a horizontal line over it, that just means to multiply that symbol by 1,000.</p>
<p>Here are the Roman numeral symbols with the vinculum applied:</p>
<table>
  <thead>
    <tr>
      <th>1,000</th>
      <th>5,000</th>
      <th>10,000</th>
      <th>50,000</th>
      <th>100,000</th>
      <th>500,000</th>
      <th>1,000,000</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>M or <span>I</span></td>
      <td>V</td>
      <td>X</td>
      <td>L</td>
      <td>C</td>
      <td>D</td>
      <td>M</td>
    </tr>
  </tbody>
</table>

<p>With this extended set of Roman numeral symbols, 4,000 would be represented as the following:</p>
<p><span>IV</span></p>

<p>And here's a table of larger numbers and their Roman numeral representations to get you started:</p>
<table>
  <thead>
    <tr>
      <th>Number</th>
      <th>Roman numeral</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>4,000</td>
      <td><span>IV</span></td>
    </tr>
    <tr>
      <td>4,001</td>
      <td><span>IV</span>I</td>
    </tr>
    <tr>
      <td>4,002</td>
      <td><span>IV</span>II</td>
    </tr>
    <tr>
      <td>4,003</td>
      <td><span>IV</span>III</td>
    </tr>
    <tr>
      <td>5,000</td>
      <td><span>V</span></td>
    </tr>
    <tr>
      <td>6,000</td>
      <td><span>VI</span></td>
    </tr>
    <tr>
      <td>7,000</td>
      <td><span>VII</span></td>
    </tr>
    <tr>
      <td>8,000</td>
      <td><span>VIII</span></td>
    </tr>
    <tr>
      <td>9,000</td>
      <td><span>IX</span></td>
    </tr>
    <tr>
      <td>10,000</td>
      <td><span>X</span></td>
    </tr>
    <tr>
      <td>40,000</td>
      <td><span>XL</span></td>
    </tr>
    <tr>
      <td>90,000</td>
      <td><span>XC</span></td>
    </tr>
    <tr>
      <td>400,000</td>
      <td><span>CD</span></td>
    </tr>
    <tr>
      <td>900,000</td>
      <td><span>CM</span></td>
    </tr>
    <tr>
      <td>1,000,000</td>
      <td><span>M</span></td>
    </tr>
  </tbody>
</table>

<h2 id="heading-how-to-add-a-vinculum-or-horizontal-line-over-roman-numerals-with-html-and-css">How to Add a Vinculum or Horizontal Line Over Roman Numerals With HTML and CSS</h2>
<p>For you devs out there, the easiest way to add a vinculum to Roman numerals online is to wrap the symbols in an element and use a bit of CSS.</p>
<p>For example, to add a horizontal line over the symbols IV in IVIII, you can wrap them in a <code>span</code> element and set its <code>text-decoration</code> property to <code>overline</code>:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"text-decoration: overline;"</span>&gt;</span>IV<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>III<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
</code></pre>
<p>Which will render the following:</p>
<p><span>IV</span>III</p>

<h2 id="heading-thanks-for-reading"><strong>Thanks for Reading</strong></h2>
<p>If you found this breakdown of Roman numerals helpful, please share it with your friends so more people can benefit from it.</p>
<p>Also, feel free to reach out on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a> and let me know what you think.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ TCP vs. UDP — What's the Difference and Which Protocol is Faster? ]]>
                </title>
                <description>
                    <![CDATA[ If you're getting into computer networking, or if you've dug through the network settings of some applications, you've likely seen these terms: TCP and UDP. TCP, which stands for Transmission Control Protocol, and UDP, or User Datagram Protocol, are ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/tcp-vs-udp/</link>
                <guid isPermaLink="false">66ac88379e10a480c13037db</guid>
                
                    <category>
                        <![CDATA[ computer network ]]>
                    </category>
                
                    <category>
                        <![CDATA[ computer networking ]]>
                    </category>
                
                    <category>
                        <![CDATA[ internet ]]>
                    </category>
                
                    <category>
                        <![CDATA[ network ]]>
                    </category>
                
                    <category>
                        <![CDATA[ networking ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Mon, 28 Jun 2021 12:06:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/07/ian-battaglia-9drS5E_Rguc-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you're getting into computer networking, or if you've dug through the network settings of some applications, you've likely seen these terms: TCP and UDP.</p>
<p>TCP, which stands for Transmission Control Protocol, and UDP, or User Datagram Protocol, are part of the internet protocol suite. TCP and UDP are different methods to send information across the internet.</p>
<p>But even knowing what they stand for, it's hard to know which protocol you should use, or why you would use one over the other.</p>
<p>In this article, we'll go over computer networking basics, the differences between TCP and UDP, when each is used, and more.</p>
<h2 id="heading-computer-networking-basics">Computer Networking Basics</h2>
<p>Before diving into how TCP and UDP work, it's helpful to know the basics about how the internet works.</p>
<p>Generally speaking, the internet is a network of connecting devices. Each device, whether it's your smartphone or a server, communicate through the internet protocol suite.</p>
<p>The internet protocol suite is a collection of different protocols, or methods, for devices to communicate with each other. Both TCP and UDP are major protocols within the internet protocol suite:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/internet-protocol-suite-diagram.gif" alt="Basic diagram of the internet protocol suite." width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://www.sciencedirect.com/topics/computer-science/internet-protocol-suite">Source</a></em></p>
<p>Each device that's connected to the internet has a unique IP address. And whenever two devices communicate over the internet, they're likely using either TCP or UDP to do so.</p>
<p>Here's a brief comparison between the two:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/tcp-vs-udp-diagram.png" alt="Diagram comparing TCP and UDP" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://www.wowza.com/blog/udp-vs-tcp">Source</a></em></p>
<p>For an even higher-level overview of how the internet works, check out this five minute video:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/7_LPdttKXPc" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-what-is-tcp">What is TCP?</h2>
<p>TCP, or Transmission Control Protocol, is the most common networking protocol online. TCP is extremely reliable, and is used for everything from surfing the web (HTTP), sending emails (SMTP), and transferring files (FTP).</p>
<p>TCP is used in situations where it's necessary that all data being sent by one device is received by another completely intact.</p>
<p>For example, when you visit a website, TCP is used to guarantee that everything from the text, images, and code needed to render the page arrives. Without TCP, images or text could be missing, or arrive in the incorrect order, breaking the page.</p>
<p>TCP is a connection-oriented protocol, meaning that it establishes a connection between two devices before transferring data, and maintains that connection throughout the transfer process.</p>
<p>To establish a connection between two devices, TCP uses a method called a three-way handshake:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/tcp-three-way-handshake-simple.png" alt="Image" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://www.techopedia.com/definition/10339/three-way-handshake">Source</a></em></p>
<p>For example, to read this article on your device, your device first sent a message to the freeCodeCamp News server called an SYN (Synchronize Sequence Number).</p>
<p>Then the freeCodeCamp News server sends back an acknowledgement message called a SYN-ACK.</p>
<p>When your device receives the SYN-ACK from the server, it sends an ACK acknowledgment message back, which establishes the connection.</p>
<p>Once a TCP connection is established between two devices, the protocol guarantees that all data is transmitted.</p>
<p>Going back to the example of your device and freeCodeCamp News, once the three-way handshake is complete, the News server can start sending all the data your device's web browser needs to render this article.</p>
<p>All devices break up data into small packets before sending them over the internet. Those packets then need to be reassembled on the other end.</p>
<p>So when the freeCodeCamp News server sends the HTML, CSS, images, and other code for this article, it breaks everything into small packets of data before sending them to your device. Your device then reassembles those packets into the files and images it needs to render this article.</p>
<p>TCP ensures that these packets all arrive to your device. If any packets are lost along the way, TCP makes it easy for your device to let the server know it's missing data, and for the server to resend those packets.</p>
<p>Once your device receives all the data it needs to render the article, TCP automatically terminates the connection between the two devices with a method similar to the three-way handshake, this time using FIN and ACK packets.</p>
<h2 id="heading-what-is-udp">What is UDP?</h2>
<p>UDP, or User Datagram Protocol, is another one of the major protocols that make up the internet protocol suite. UDP is less reliable than TCP, but is much simpler.</p>
<p>UDP is used for situations where some data loss is acceptable, like live video/audio, or where speed is a critical factor like online gaming.</p>
<p>While UDP is similar to TCP in that it's used to send and receive data online, there are a couple of key differences.</p>
<p>First, UDP is a connectionless protocol, meaning that it does not establish a connection beforehand like TCP does with its three-way handshake.</p>
<p>Next, UDP doesn't guarantee that all data is successfully transferred. With UDP, data is sent to any device that happens to be listening, but it doesn't care if some of it is lost along the way. This is one of the reasons why UDP is also known as the "fire-and-forget" protocol.</p>
<p>A good way to think about these differences is that TCP is like a conversation between two people. Person A asks person B to talk. Person B says sure, that's fine. Person A agrees and they both start speaking.</p>
<p>UDP is more like a protester outside with a megaphone. Everyone who is paying attention to the protester should hear most of what they're saying. But there's no guarantee that everyone in the area will hear what the protester is saying, or that they're even listening.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/udp-and-tcp-comparison.jpg" alt="A diagram comparing UDP and TCP connections" width="600" height="400" loading="lazy">
<em>UDP vs TCP — <a target="_blank" href="https://www.dpstele.com/snmp/transport-requirements-udp-tcp.php">Source</a></em></p>
<h2 id="heading-which-is-faster-tcp-or-udp">Which is Faster – TCP or UDP?</h2>
<p>In general, UDP is the faster protocol.</p>
<p>UDP is much simpler, and doesn't try to establish a connection between devices before sending data, or verify that all the data even arrived. It simply sends out data to any device that requests it, and keeps doing that until the other device disconnects or there is no more data left to send.</p>
<p>Think drinking from a hose rather than sipping from a bottle. You'll quench your thirst either way, but will probably end up with a damp shirt using the former method.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/07/tcp-vs-udp-meme.png" alt="A meme showing one person drinking from a water bottle to represent TCP, and another person pouring water from a bottle onto their face to represent UDP." width="600" height="400" loading="lazy">
_Not a hose, but still pretty accurate. Also imagine that the TCP bottle keeps asking if you received water while you drink from it. <a target="_blank" href="https://www.reddit.com/r/ProgrammerHumor/comments/9gcwgw/tcp_vs_udp/e63axmd/">Source</a>_</p>
<p>But being faster doesn't mean that UDP is the better protocol overall. It just means that it's better in certain situations.</p>
<p>As mentioned earlier, TCP is necessary in situations where it's vital that all data packets are sent in order, and that all packets arrive. The web just wouldn't function without TCP.</p>
<p>And while TCP is slower because of the way it establishes connections, and due to the checks for missing packets, it can still be blazing fast. Because they're on the web and use HTTP, sites like YouTube or Netflix all use TCP to send data to your devices.</p>
<p>TCP also allows for buffering, so your browser can request and load more data as you watch, allowing for smooth playback and for you to skip ahead to other parts of the video.</p>
<p>UDP is the better choice for live video and audio or online games where speed is more important than potential data loss.</p>
<p>When you make a call over Google Meet or Zoom, your video and audio are being transmitted over UDP. If some packets are lost along the way, it'll just appear as a bit of lag or clipped video/audio.</p>
<p>If you play video games, you might think that the way TCP ensures all data packets arrive at the other device would make it the ideal choice. But in reality, all the checking and resending data that TCP does just adds latency.</p>
<p>Game developers have found other clever ways to ensure that player input and state are as accurate as possible. If you're interested in reading more about why UDP is preferred for online gaming, check out <a target="_blank" href="https://gafferongames.com/post/udp_vs_tcp/">this article</a>.</p>
<h2 id="heading-fin">FIN</h2>
<p>I hope this article helped you understand some of the nuances between TCP and UDP. And if someone asks which is faster, tell 'em what you read here: "UDP is faster, <em>but</em>..."</p>
<p>And if you like what you read, let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Gmail Dark Mode – How to Change the Gmail Background Theme on Desktop, iOS, and Android ]]>
                </title>
                <description>
                    <![CDATA[ If you're like me, you spend several hours a week in Gmail. Staring at Gmail's bright white design can strain your eyes – especially at night. Fortunately, Gmail has a built-in dark mode theme. This will make it much easier to read at night. In addit... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/gmail-dark-mode/</link>
                <guid isPermaLink="false">66ac87f54465950a6e26c92f</guid>
                
                    <category>
                        <![CDATA[ dark mode ]]>
                    </category>
                
                    <category>
                        <![CDATA[ gmail ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Thu, 08 Apr 2021 06:07:32 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/602b5ce90a2838549dcc632e.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you're like me, you spend several hours a week in Gmail. Staring at Gmail's bright white design can strain your eyes – especially at night.</p>
<p>Fortunately, Gmail has a built-in dark mode theme. This will make it much easier to read at night.</p>
<p>In addition to reducing eye strain, dark mode can even reduce the battery consumption of your device, allowing you to use it for longer without charging it. (It's a small improvement, but it helps.)</p>
<p>So how do you turn on dark mode in Gmail? I'll show you how to switch to Gmail's dark theme in just a few steps.</p>
<h2 id="heading-gmail-dark-mode-on-desktop">Gmail Dark Mode on Desktop</h2>
<p>First, open your browser and go to <a target="_blank" href="https://mail.google.com/">Gmail</a>. Sign in if necessary.</p>
<p>Click on the gear icon in the top right and next to "Theme" click "View all":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-browser-1-1.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In the "Pick your theme" menu, scroll down until you see the different color options.</p>
<p>Select "Dark" (this text will be visible when you hover over the black thumbnail), and click "Save":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-browser-2.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>And when you go back to your inbox, it'll be in dark mode:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-browser-final.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-gmail-dark-mode-on-android">Gmail Dark Mode on Android</h2>
<p><strong>Note:</strong> This method requires Android 10 and up.</p>
<p>First, open the <a target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.gm">Gmail</a> app. Download the app and / or sign in if necessary.</p>
<p>In Gmail, open the side menu by tapping the three vertical bars on the top left of the screen, or by swiping from the left:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-1-5.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In the side menu, scroll down to the bottom and tap "Settings":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-2.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Then in the Settings menu, tap "General settings":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-3.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In the General settings menu, tap "Theme":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-4.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Finally in the Theme pop up menu, select "Dark":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-5.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>And Gmail will switch to dark mode:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-android-final-1.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-gmail-dark-mode-on-ios">Gmail Dark Mode on iOS</h2>
<p><strong>Note:</strong> This method requires iOS 13 and up.</p>
<p>If you have an iPhone and want your Gmail to be in dark mode, it's super simple to make that happen.</p>
<p>There isn't a setting in the Gmail app itself – you simply set your phone's settings to dark mode (and Gmail will follow suit). Here's how to do that.</p>
<p>First, go to your phone's "Settings" and scroll until you see "Display &amp; Brightness" partway down:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/iphone-settings.PNG" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Click on Display and Brightness, and you'll be taken to this screen:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-vs-light-mode.PNG" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As you can see, my phone is currently set to Light Mode (it's selected). If I want to switch to dark mode,  just toggle that option on, like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/change-to-dark-mode.PNG" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Now my phone is set to dark mode (all the time, rather than just auto-adjusting when it gets dark outside).</p>
<p>So my Gmail app will now look like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-gmail.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>There you have it! If you only want your Gmail app to use dark mode at night, you can update your settings accordingly. </p>
<p>Just make sure your phone is on Light mode and the "Automatic" option is toggled on. Then just select the "Sunset to Sunrise" option under "Options" and your phone will automatically adjust your apps into dark mode when the sun goes down!</p>
<p>It'll look like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/dark-mode-vs-light-mode-1.PNG" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-thanks-for-reading"><strong>Thanks for Reading</strong></h2>
<p>If you found this helpful, please share it with your friends so more people can enable Gmail's dark mode on desktop, Android, and iOS devices.</p>
<p>Also, if you liked this article, let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Learn How to Code ]]>
                </title>
                <description>
                    <![CDATA[ Are you a new developer just getting started? Or are you a seasoned developer looking to expand your skill set? Either way, the freeCodeCamp community's got you covered. A lot of the time, learning how to program is not so much a straight line as it ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to/</link>
                <guid isPermaLink="false">66ac881115af8baa725ed384</guid>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ programing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Wed, 17 Mar 2021 05:55:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/604f04d028094f59be255cc6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Are you a new developer just getting started? Or are you a seasoned developer looking to expand your skill set?</p>
<p>Either way, the freeCodeCamp community's got you covered.</p>
<p>A lot of the time, learning how to program is not so much a straight line as it is a vast flowchart, with lots of repeated sections and loops:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/windows-system-calls.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>A flowchart for system calls in Windows Server Edition (<a target="_blank" href="https://slideplayer.com/slide/11896895/">source</a>)</em></p>
<p>But it doesn't have to be that complicated.</p>
<p>I've gone through our vast catalog of tutorials and created a list of some of the best resources on how to learn pretty much everything you'd need to know as a developer.</p>
<p>The list is loosely organized into different sections and subsections. Feel free to browse the table of contents below and skip around to look for an article on whatever you're trying to learn.</p>
<p>Also, many things on this list require some prerequisite knowledge of another technology. Don't be surprised if you find yourself opening articles from multiple sections.</p>
<p>Finally, this is a living document, and will grow as we publish more helpful articles. Be sure to check back often, and share this with your friends if you find it helpful.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><a class="post-section-overview" href="#how-to-build-a-website">How to Build a Website</a><ul>
<li><a class="post-section-overview" href="#html">HTML</a></li>
<li><a class="post-section-overview" href="#css">CSS</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-programming">How to Learn Programming</a><ul>
<li><a class="post-section-overview" href="#javascript">JavaScript</a></li>
<li><a class="post-section-overview" href="#node-js">Node.js</a></li>
<li><a class="post-section-overview" href="#typescript">TypeScript</a></li>
<li><a class="post-section-overview" href="#deno">Deno</a></li>
<li><a class="post-section-overview" href="#python">Python</a></li>
<li><a class="post-section-overview" href="#java">Java</a></li>
<li><a class="post-section-overview" href="#go-golang-">Go (Golang)</a></li>
<li><a class="post-section-overview" href="#rust">Rust</a></li>
<li><a class="post-section-overview" href="#c">C</a></li>
<li><a class="post-section-overview" href="#c-">C++</a></li>
<li><a class="post-section-overview" href="#c--1">C#</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-linux">How to Learn Linux</a></li>
<li><a class="post-section-overview" href="#how-to-learn-git-and-version-control">How to Learn Git and Version Control</a></li>
<li><a class="post-section-overview" href="#how-to-learn-a-frontend-framework-library">How to Learn a Frontend Framework / Library</a><ul>
<li><a class="post-section-overview" href="#react">React</a></li>
<li><a class="post-section-overview" href="#vue">Vue</a></li>
<li><a class="post-section-overview" href="#angular">Angular</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-web-basics-and-web-security">How to Learn Web Basics and Web Security</a><ul>
<li><a class="post-section-overview" href="#web-basics">Web Basics</a></li>
<li><a class="post-section-overview" href="#https">HTTPS</a></li>
<li><a class="post-section-overview" href="#cookies">Cookies</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-databases">How to Learn Databases</a><ul>
<li><a class="post-section-overview" href="#sql-mysql">SQL / MySQL</a></li>
<li><a class="post-section-overview" href="#mongodb-mongoose-nosql-">MongoDB / Mongoose (NoSQL)</a></li>
<li><a class="post-section-overview" href="#redis-nosql-">Redis (NoSQL)</a></li>
<li><a class="post-section-overview" href="#postgres-postgresql">Postgres / PostgreSQL</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-backend-development">How to Learn Backend Development</a><ul>
<li><a class="post-section-overview" href="#express">Express</a></li>
<li><a class="post-section-overview" href="#flask">Flask</a></li>
<li><a class="post-section-overview" href="#django">Django</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-static-site-generators">How to Learn Static Site Generators</a><ul>
<li><a class="post-section-overview" href="#gatsby">Gatsby</a></li>
<li><a class="post-section-overview" href="#next-js">Next.js</a></li>
<li><a class="post-section-overview" href="#hugo">Hugo</a></li>
<li><a class="post-section-overview" href="#nuxt-js">Nuxt.js</a></li>
<li><a target="_blank" href="vuepress">Vuepress</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-bundlers-compilers-dependency-managers-task-runners-formatters-and-linters">How to Learn Bundlers, Compilers, Dependency Managers, Task Runners, Formatters, and Linters</a><ul>
<li><a class="post-section-overview" href="#webpack-and-babel">Webpack and Babel</a></li>
<li><a class="post-section-overview" href="#eslint-and-prettier">ESLint and Prettier</a></li>
<li><a class="post-section-overview" href="#parcel">Parcel</a></li>
<li><a class="post-section-overview" href="#gulp">Gulp</a></li>
<li><a class="post-section-overview" href="#npm-scripts">npm Scripts</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-mobile-application-development">How to Learn Mobile Application Development</a><ul>
<li><a class="post-section-overview" href="#react-native">React Native</a></li>
<li><a class="post-section-overview" href="#ionic">Ionic</a></li>
<li><a class="post-section-overview" href="#flutter">Flutter</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-desktop-application-development">How to Learn Desktop Application Development</a><ul>
<li><a class="post-section-overview" href="#electron">Electron</a></li>
<li><a class="post-section-overview" href="#proton-native">Proton Native</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-data-science-and-machine-learning">How to Learn Data Science and Machine Learning</a><ul>
<li><a class="post-section-overview" href="#general-machine-learning">General Machine Learning</a></li>
<li><a class="post-section-overview" href="#pandas">Pandas</a></li>
<li><a class="post-section-overview" href="#numpy">Numpy</a></li>
<li><a class="post-section-overview" href="#scikit-learn">Scikit-Learn</a></li>
<li><a class="post-section-overview" href="#seaborn">Seaborn</a></li>
<li><a class="post-section-overview" href="#matplotlib">Matplotlib</a></li>
<li><a class="post-section-overview" href="#tensorflow">TensorFlow</a></li>
<li><a class="post-section-overview" href="#pytorch">PyTorch</a></li>
<li><a class="post-section-overview" href="#keras">Keras</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-virtualization-and-containerization">How to Learn Virtualization and Containerization</a><ul>
<li><a class="post-section-overview" href="#virtual-machines">Virtual Machines</a></li>
<li><a class="post-section-overview" href="#docker">Docker</a></li>
<li><a class="post-section-overview" href="#kubernetes">Kubernetes</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-cloud-computing">How to Learn Cloud Computing</a><ul>
<li><a class="post-section-overview" href="#amazon-web-services-aws-">Amazon Web Services (AWS)</a></li>
<li><a class="post-section-overview" href="#google-cloud-platform-gcp-">Google Cloud Platform (GCP)</a></li>
<li><a class="post-section-overview" href="#microsoft-azure">Microsoft Azure</a></li>
</ul>
</li>
<li><a class="post-section-overview" href="#how-to-learn-devops">How to Learn DevOps</a><ul>
<li><a class="post-section-overview" href="#general-devops">General DevOps</a></li>
<li><a class="post-section-overview" href="#travis-ci">Travis CI</a></li>
<li><a class="post-section-overview" href="#jenkins">Jenkins</a></li>
<li><a class="post-section-overview" href="#gocd">GoCD</a></li>
<li><a class="post-section-overview" href="#ansible">Ansible</a></li>
<li><a class="post-section-overview" href="#chef">Chef</a></li>
<li><a class="post-section-overview" href="#kafka">Kafka</a></li>
<li><a class="post-section-overview" href="#terraform">Terraform</a></li>
</ul>
</li>
</ul>
<h2 id="heading-how-to-build-a-website">How to Build a Website</h2>
<p>To build a basic website, all you really need are HTML (Hypertext Markup Language) and CSS (Cascading Style Sheets). HTML provides the content and structure of the site, and CSS is used to style it.</p>
<p>Here are some of the best resources on HTML and CSS. Once you're familiar with these technologies, move on to the next section and learn JavaScript to make your web sites more interactive.</p>
<h3 id="heading-html">HTML</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-basics-for-beginners/">Learn HTML Basics for Beginners in Just 15 Minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-html-hyperlinks-using-the-href-attribute-on-tags/">How to Make HTML Hyperlinks Using the HREF Attribute on Tags</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-html-to-open-link-in-new-tab/">How to Use HTML to Open a Link in a New Tab</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-link-code-how-to-insert-a-link-to-a-website-with-href-3/">HTML Link Code – How to Insert a Link to a Website with HREF</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-entities-symbols-special-character-codes-list/">HTML Entities – A List of HTML Space and other HTML Symbols and Special Character Codes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/dark-mode-in-html-email-everything-you-need-to-know/">How to Enable Dark Mode in HTML Email – Everything You Need to Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/make-it-blink-html-tutorial-how-to-use-the-blink-tag-with-code-examples/">Make It Blink HTML Tutorial – How to Use the Blink Tag, with Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-full-course-for-beginners/">HTML Basics: A Free Full-Length Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-html-handbook/">The HTML Handbook</a></li>
</ul>
<h3 id="heading-css">CSS</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/css-font-size-tutorial-how-to-change-text-size-in-html/">CSS Font Size Tutorial – How to Change Text Size in HTML</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-background-color-tutorial-how-to-change-a-div-background-color-explained-with-code-examples/">HTML Background Color Tutorial – How to Change a Div Background Color, Explained with Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/inline-css-guide-how-to-style-an-html-tag-directly/">Inline CSS Guide – How to Style an HTML Tag Directly</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-center-text-how-to-css-vertical-align-a-div/">HTML Center Text – How to CSS Vertical Align a Div</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-center-anything-with-css-align-a-div-text-and-more/">How to Center Anything with CSS - Align a Div, Text, and More</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/html-page-width-height/">HTML vs Body: How to Set Width and Height for Full Page Size</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/css-tutorial-drop-shadow/">Box Shadow CSS Tutorial – How to Add a Drop Shadow to Any HTML Element</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/css-positioning-and-flexbox-explained/">How CSS Positioning and Flexbox Work – Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/flexbox-the-ultimate-css-flex-cheatsheet/">Flexbox - The Ultimate CSS Flex Cheatsheet (with animated diagrams!)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/intro-to-css-grid-layout/">An Introduction to CSS Grid Layout (with Examples)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-css-grid-by-building-5-layouts/">Learn CSS Grid by Building 5 Layouts in 17 minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/css-grid-changes-how-we-can-think-about-structuring-our-content/">How CSS Grid Changes the Way We Think About Structuring Our Content</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/flexbox-vs-grid-how-to-build-the-most-common-html-layouts/">Flexbox vs Grid - How to Build the Most Common HTML Layouts</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-css-in-this-free-6-hour-video-course/">Learn CSS in this free 6-hour video course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-css-handbook-a-handy-guide-to-css-for-developers-b56695917d11/">The CSS Handbook: A Handy Guide to CSS for Developers</a></li>
</ul>
<h3 id="heading-how-to-learn-programming">How to Learn Programming</h3>
<p>In essence, programming is how humans tell computers what to do. Whether it's a laptop, a smartphone, or a browser, programming and programming languages give us a way to interact with those devices.</p>
<p>In this section, you'll learn the fundamentals of programming and the basics of some of the most popular programming languages today.</p>
<p>If you want to learn frontend and backend development, definitely learn JavaScript and Node.js. And once you're familiar with those, look into TypeScript.</p>
<p>If you're more interested in data science and machine learning, learn Python. For mobile apps, it helps to know Java. Game development? C++, C#, or even Java.</p>
<p>We've got a bit of everything, including newer programming languages like Go.</p>
<h3 id="heading-javascript">JavaScript</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-variables-beginners-guide/">JavaScript Variables – A Beginner's Guide to var, const, and let</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-split-string-example/">JavaScript Split String Example – How to Split a String into an Array in JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-typeof-how-to-check-the-type-of-a-variable-or-object-in-js/">JavaScript TypeOf – How to Check the Type of a Variable or Object in JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/check-if-javascript-array-is-empty-or-not-with-length/">How to Check if a JavaScript Array is Empty or Not with .length</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-loop-tutorial-how-to-iterate-over-an-array-in-javascript/">JS For Loop Tutorial – How to Iterate Over an Array in JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-array-sort-tutorial-how-to-use-js-sort-methods-with-code-examples/">JavaScript Array Sort – How to Use JS Sort Methods (With Code Examples)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-array-reverse-tutorial-with-example-js-code/">JavaScript Reverse Array – Tutorial With Example JS Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-foreach-how-to-loop-through-an-array-in-js/">JavaScript forEach – How to Loop Through an Array in JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-array-slice-vs-splice-whats-the-difference/">JavaScript Array Slice vs Splice: the Difference Explained with Cake</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-object-keys-tutorial-how-to-use-a-js-key-value-pair/">JavaScript Object Keys Tutorial – How to Use a JS Key-Value Pair</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-create-object-how-to-define-objects-in-js/">JavaScript Create Object  –  How to Define Objects in JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-javascript-implements-oop/">Object Oriented Programming in JavaScript – Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-this-keyword-binding-rules/">The JavaScript <code>this</code> Keyword + 5 Key Binding Rules Explained for JS Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-to-javascripts-prototype/">A Beginner’s Guide to JavaScript’s Prototype</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-date-now-how-to-get-the-current-date-in-javascript/">JavaScript Date Now – How to Get the Current Date in JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-ultimate-guide-to-javascript-date-and-moment-js/">The Ultimate Guide to JavaScript Date and Moment.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-array-reverse-tutorial-with-example-js-code/">What is Functional Programming? A Beginner's JavaScript Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-javascript-full-course/">Learn JavaScript - Full 134-Part Course for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/data-structures-and-algorithms-in-javascript/">Data Structures and Algorithms in JavaScript - Full Course for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sparse-and-dense-arrays-in-javascript/">Sparse Arrays vs Dense Arrays in JavaScript — Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-regex-match-example-how-to-use-the-js-replace-method-on-a-string/">JavaScript Regex Match Example – How to Use JS Replace on a String</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-quick-and-simple-guide-to-javascript-regular-expressions-48b46a68df29/">A Quick and Simple Guide to JavaScript Regular Expressions</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-keycode-list-keypress-event-key-codes/">JavaScript Keycode List – Keypress Event Key Codes for Enter, Space, Backspace, and More</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-object-destructuring-spread-operator-rest-parameter/">JavaScript Object Destructuring, Spread Syntax, and the Rest Parameter – A Practical Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/nullish-coalescing-operator-in-javascript/">How the Nullish Coalescing Operator Works in JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/try-catch-in-javascript/">Try/Catch in JavaScript – How to Handle Errors in JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/async-await-in-javascript/">How to Use Async/Await in JavaScript with Example JS Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-the-question-mark-works-in-javascript/">How the Question Mark (?) Operator Works in JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ternary-operator-javascript-if-statement-tutorial/">Ternary Operator JavaScript If Statement Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-debounce-example/">Debounce – How to Delay a Function in JavaScript (JS ES6 Example)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/find-the-number-of-vowels-in-a-string-with-javascript/">How to Find the Number of Vowels in a String with JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/form-validation-with-html5-and-javascript/">Data Validation – How to Check User Input on HTML Forms with Example JavaScript Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-recursion-in-javascript/">What is Recursion? A Recursive Function Explained with JavaScript Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/javascript-skills-you-need-for-react-practical-examples/">The JavaScript Skills You Need For React (+ Practical Examples)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/higher-order-functions-in-javascript-examples/">Higher Order Functions in JavaScript – Reach New Heights in Your JS Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/node-module-exports-explained-with-javascript-export-function-examples/">Node Module Exports Explained – With JavaScript Export Function Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-a-landing-page-using-html-scss-and-javascript/">How to Make a Landing Page using HTML, SCSS, and JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-and-validate-beautiful-forms-with-vanilla-html-css-js/">How to Build and Validate Beautiful Forms with Vanilla HTML, CSS, &amp; JS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-responsive-and-dynamic-progress-bar/">How to Build a Responsive and Dynamic Progress Bar with HTML, CSS, and JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-complete-javascript-handbook-f26b2c71719c/">The JavaScript Beginner's Handbook</a></li>
</ul>
<h3 id="heading-nodejs">Node.js</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-node-js-and-npm-on-windows/">How to Install Node.js and npm on Windows</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-node-js-on-ubuntu-and-update-npm-to-the-latest-version/">How to Install Node.js on Ubuntu and Update npm to the Latest Version</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/node-module-exports-explained-with-javascript-export-function-examples/">Node Module Exports Explained – With JavaScript Export Function Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/npm-cheat-sheet-most-common-commands-and-nvm/">npm Cheat Sheet - Most Common Commands and nvm</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-npm-a-node-package-manager-tutorial-for-beginners/">What is npm? A Node Package Manager Tutorial for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-ignore-files-from-your-npm-package-4724e6d9575d/">How to Ignore Files from Your npm Package</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-publish-packages-to-npm-the-way-the-industry-does-things-2077ec34d7e8/">How to Publish Packages to npm (the Way the Industry Does Things)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-a-beautiful-tiny-npm-package-and-publish-it-2881d4307f78/">How to Make a Beautiful, Tiny npm Package and Publish It</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-force-use-yarn-or-npm/">How to Force Use Yarn or NPM</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-enable-es6-and-beyond-syntax-with-node-and-express-68d3e11fe1ab/">How to enable ES6 (and beyond) syntax with Node and Express</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/automate-simple-tasks-with-nodejs/">How to Automate Simple Tasks with Node.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/node-js-production-checklist/">The Ultimate Node.js Production Checklist</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/get-started-with-graphql-and-nodejs/">How to Get Started with GraphQL and Node.js</a></li>
</ul>
<h3 id="heading-typescript">TypeScript</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-and-begin-using-typescript/">How to Install and Start Using TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-typescript-to-a-javascript-project/">How to Add TypeScript to a JavaScript Project</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-typescript-data-types-from-zero-to-hero/">Learn TypeScript Data Types – From Zero to Hero</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/all-about-typescript-static-members-typescript-oop/">All about TypeScript Static Members | TypeScript OOP</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/typescript-javascript-getters-and-setters-are-they-useless/">No, Getters and Setters in TypeScript &amp; JavaScript Aren't Useless</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-crash-course-in-typescript-e6bf9c10946/">A Crash Course in TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-mental-model-to-think-in-typescript-2/">TypeScript Types Explained – A Mental Model to Help You Think in Types</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-typescript-how-to-set-up-types-on-hooks/">The React TypeScript Cheatsheet – How To Set Up Types on Hooks</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/make-typescript-easy-using-basic-ts-generics/">How TypeScript Generics Help You Write Less Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ux-studies-with-react-typescript-and-testing-library/">How to Create a Great User Experience with React, TypeScript, and the React Testing Library</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/advanced-typescript-types-cheat-sheet-with-examples/">Advanced TypeScript Types Cheat Sheet (with Examples)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-practical-guide-to-typescript-how-to-build-a-pokedex-app-using-html-css-and-typescript/">A Practical Guide to TypeScript - How to Build a Pokedex App Using HTML, CSS, and TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-todo-app-with-react-typescript-nodejs-and-mongodb/">How to Build a Todo App with React, TypeScript, NodeJS, and MongoDB</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-rocketchat-bot-with-typescript/">How to Build a RocketChat Chatbot with TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-definitive-typescript-handbook/">The Definitive TypeScript Handbook</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-typescript-with-this-crash-course/">Learn TypeScript With This Crash Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-quiz-app-using-react-and-typescript/">How to Build a Quiz App Using React and TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-shopping-cart-with-react-and-typescript/">Build a Shopping Cart with React and TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/typescript-in-react/">How to Use Typescript in React</a></li>
</ul>
<h3 id="heading-deno">Deno</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-deno-a-node-js-alternative/">Learn Deno, a Node.js Alternative</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-react-app-using-deno-and-alephjs/">How to Build React Applications with Deno Using the AlephJS Library</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-url-shortener-in-deno/">How to Build a URL Shortener in Deno</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/create-a-todo-api-in-deno-written-by-a-guy-coming-from-node/">How to Create a Todo API in Deno and Oak</a></li>
<li>T<a target="_blank" href="https://www.freecodecamp.org/news/the-deno-handbook/">he Deno Handbook: A TypeScript Runtime Tutorial with Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52/">Securing Node.js RESTful APIs with JSON Web Tokens</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/getting-started-with-node-js/">Learn Node.js and Start Executing JavaScript Outside of the Browser</a></li>
</ul>
<h3 id="heading-python">Python</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/hello-world-programming-tutorial-for-python/">Hello World Programming Tutorial for Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-while-loop-tutorial/">Python While Loop Tutorial – While True Syntax Examples and Infinite Loops</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-new-line-and-how-to-python-print-without-a-newline/">Python New Line and How to Python Print Without a Newline</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-dictionaries-detailed-visual-introduction/">Python Dictionaries 101: A Detailed Visual Introduction</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-sets-detailed-visual-introduction/">Python Sets: A Detailed Visual Introduction</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-read-json-file-how-to-load-json-from-a-file-and-parse-dumps/">Python Read JSON File – How to Load JSON from a File and Parse Dumps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-list-files-in-a-directory-guide-listdir-vs-system-ls-explained-with-examples/">Python List Files in a Directory Guide - listdir VS system("ls") Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-write-to-file-open-read-append-and-other-file-handling-functions-explained/">Python Write to File – Open, Read, Append, and Other File Handling Functions Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-empty-list-tutorial-how-to-create-an-empty-list-in-python/">Python Empty List Tutorial – How to Create an Empty List in Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-list-append-how-to-add-an-element-to-an-array-explained-with-examples/">Python List Append – How to Add an Element to an Array, Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-list-append-vs-python-list-extend/">Python List Append VS Python List Extend – The Difference Explained with Array Method Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-python-sort-list-array-method-ascending-and-descending-explained-with-examples/">The Python Sort List Array Method – Ascending and Descending Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-unique-list-how-to-get-all-the-unique-values-in-a-list-or-array/">Python Unique List – How to Get all the Unique Values in a List or Array</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/truthy-and-falsy-values-in-python/">Truthy and Falsy Values in Python: A Detailed Introduction</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-python-modulo-operator-what-does-the-symbol-mean-in-python-solved/">The Python Modulo Operator - What Does the % Symbol Mean in Python? (Solved)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-datetime-module/">Python's datetime Module – How to Handle Dates in Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/exception-handling-python/">How to Handle Exceptions in Python: A Detailed Visual Introduction</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-property-decorator/">The @property Decorator in Python: Its Use Cases, Advantages, and Syntax</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-python-sleep-function-how-to-make-python-wait-a-few-seconds-before-continuing-with-example-commands/">The Python Sleep Function – How to Make Python Wait A Few Seconds Before Continuing, With Example Commands</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mutable-vs-immutable-objects-python/">Mutable vs Immutable Objects in Python – A Visual and Hands-On Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-your-first-python-package/">How to Build Your Very First Python Package</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-dictionary-guide/">Python Dictionary Guide – How to Iterate Over, Copy, and Merge Dictionaries in Python 3.9</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/binary-search-in-python-visual-introduction/">Binary Search in Python: A Visual Introduction</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/multithreaded-python/">Multithreaded Python: Slithering Through an I/O Bottleneck?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-set-up-python-virtual-environment-on-ubuntu-20-04/">How to Set Up a Python Virtual Environment on Ubuntu 20.04</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/virtualenv-with-virtualenvwrapper-on-ubuntu-18-04/">How to Set Up Virtualenv with Virtualenvwrapper on Ubuntu 18.04</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/installing-multiple-python-versions-on-windows-using-virtualenv/">Installing Multiple Python Versions on Windows Using Virtualenv</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/intermediate-python-course/">Take Your Python Skills to the Next Level With This Free 6-Hour Video Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-python-handbook/">The Python Handbook</a></li>
</ul>
<h3 id="heading-java">Java</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/java-string-to-int-how-to-convert-a-string-to-an-integer/">Java String to Int – How to Convert a String to an Integer</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/java-list-tutorial-util-list-api-example/">Java List Methods Tutorial – Util List API Example</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/java-array-methods-how-to-print-an-array-in-java/">Java Array Methods – How to Print an Array in Java</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/utilizing-javas-arrays-sort-for-any-list-of-objects-e3e2db61d70b/">Using Java’s Arrays.sort() for any List of Objects</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-handle-nullpointerexception-in-java/">How to Handle NullPointerException in Java</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/priority-queue-implementation-in-java/">Priority Queues in Java Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/java-object-oriented-programming-system-principles-oops-concepts-for-beginners/">Object-Oriented Programming Principles  in Java:  OOP Concepts for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/polymorphism-in-java-tutorial-with-object-oriented-programming-example-code/">Polymorphism in Java Tutorial – With Object Oriented Programming Example Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/functional-programming-in-java-course/">Learn Functional Programming in Java - Full Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-started-with-multithreading-in-java/">Multithreading in Java: How to Get Started with Threads</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/generate-random-numbers-java/">Java Random Number Generator – How to Generate Integers With Math Random</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/garbage-collection-in-java-what-is-gc-and-how-it-works-in-the-jvm/">Garbage Collection in Java – What is GC and How it Works in the JVM</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/jvm-tutorial-java-virtual-machine-architecture-explained-for-beginners/">JVM Tutorial - Java Virtual Machine Architecture Explained for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/java-android-app-using-rest-api-network-data-in-android-course/">Build a Java Android App Using a REST API - Network Data in Android Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-setup-jwt-authorization-and-authentication-in-spring/">How to Set Up Java Spring Boot JWT Authorization and Authentication</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/jvm-tutorial-java-virtual-machine-architecture-explained-for-beginners/">JVM Tutorial - Java Virtual Machine Architecture Explained for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/use-spring-boot-and-java-to-create-a-rest-api-tutorial/">Use Spring Boot and Java to Create a Rest API (Tutorial)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-sudoku-java-desktop-application/">How to Build a Sudoku Game Java Desktop Application – A Free 2-hour Course</a></li>
</ul>
<h3 id="heading-go-golang">Go (Golang)</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/go-golang-programming-language/">Go (Golang) Programming Language</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learning-go-from-zero-to-hero-d2a3223b3d86/">Learning Go — From Zero to Hero</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/go-automate-your-github-profile-readme/">How to Automate Your GitHub Profile README</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-your-own-serverless-subscriber-list-with-go-and-aws/">How to Build Your Own Serverless Subscriber List with Go and AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-validate-ssl-certificates-in-go/">How to Validate SSL Certificates in Go</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/design-a-key-value-store-in-go/">How to Design a Transactional Key-value Store in Go</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-i-built-a-web-server-using-go-and-on-chromeos-3b83e4c2da5f/">How I built a Web Server Using Go — and On ChromeOS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/grpc-server-side-streaming-with-go/">How to Set Up gRPC Server-Side Streaming with Go</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-i-set-up-a-real-world-project-with-go-and-vue/">How to Set Up a Real-World Project with Go and Vue</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/go-elasticsearch/">How to Implement Elasticsearch in Go</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/reading-challenge-heap-sort-in-go/">How to Implement Heap-Sort in the Go Standard Library</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/go-golang-course/">Learn the Fast and Simple Go Programming Language (Golang) in 7 Hours</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-go-in-this-crash-course/">Learn Go in This Crash Course</a></li>
</ul>
<h3 id="heading-rust">Rust</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/rust-getting-started-with-the-most-loved-programming-language/">Rust for Beginners – Get Started with the Most Loved Programming Language</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-rust-with-github-actions/">How to Learn Rust Without Installing Any Software</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-to-do-app-with-rust/">Rust Programming Language Tutorial – How to Build a To-Do List App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/building-powerful-graphql-servers-with-rust/">How to Build Powerful GraphQL Servers with Rust</a></li>
</ul>
<h3 id="heading-c">C</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/boost-programming-skills-read-git-code/">Boost Your Programming Skills by Reading Git's Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/format-specifiers-in-c/">Format Specifiers in C</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/file-handling-in-c-how-to-open-close-and-write-to-files/">File Handling in C — How to Open, Close, and Write to Files</a></li>
</ul>
<h3 id="heading-c-1">C++</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-classes-work-in-cplusplus/">How Classes Work in C++</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/do-while-loops-in-c-plus-plus-example-loop-syntax/">Do While Loops in C++ with Example Loop Syntax</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-overload-operators-in-cplusplus/">How to Overload Operators in C++</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/c-plus-plus-map-explained-with-examples/">C++ Map Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-clean-code-in-c/">How to Write Clean Code in C++</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-compile-your-c-code-in-visual-studio-code/">How to Compile Your C++ Code in Visual Studio Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-object-oriented-programming-oop-in-c-full-video-course/">Learn Object Oriented Programming (OOP) in C++ | Full Video Course</a></li>
</ul>
<h3 id="heading-c-2">C</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/csharp/">C# Programming: An Intro for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/c-basics-your-first-c-program-types-and-variables-and-flow-control-statements/">C# Basics - Your First C# Program, Types and Variables, and Flow Control Statements</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/is-the-c-internal-keyword-a-code-smell/">Is the C# Internal Keyword a Code Smell?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-an-spa-with-vuejs-and-c-using-net-core/">How to Build an SPA with Vue.js and C# Using .NET Core</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-c-and-unity-by-making-digital-tabletop-games/">Learn C# and Unity by Making Digital Tabletop Games</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/c-sharp-24-hour-course/">Create a C# Application from Start to Finish - Complete 24-Hour Course</a></li>
</ul>
<h2 id="heading-how-to-learn-linux">How to Learn Linux</h2>
<p>Whether you know it or not, you probably use Linux every day. Android is based on Linux, and macOS, which is based on Unix just like Linux, is a close cousin. And an estimated <a target="_blank" href="https://w3techs.com/technologies/overview/operating_system">74.2%</a> (as of March, 2021) of all web servers run on Unix, the vast majority of which are probably Linux.</p>
<p>In short, if you work on the web, you should get comfortable with Linux and its default shell, Bash. And here are some of our best tutorials to get started:</p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/basic-linux-commands-bash-tips-you-should-know/">Linux Commands - Basic Bash Command Line Tips You Should Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-cat-command-in-linux-concatenation-explained-with-bash-examples/">The Cat Command in Linux – Concatenation Explained with Bash Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-cat-command-in-linux-how-to-create-a-text-file-with-cat-or-touch/">The Cat Command in Linux – How to Create a Text File with Cat or Touch</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/grep-command-tutorial-how-to-search-for-a-file-in-linux-and-unix/">Grep Command Tutorial – How to Search for a File in Linux and Unix with Recursive Find</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-how-to-add-users-and-create-users-with-useradd/">Linux: How to Add Users and Create Users with useradd</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-user-groups-explained-how-to-add-a-new-group-a-new-group-member-and-change-groups/">Linux User Groups Explained: How to Add a New Group, a New Group Member, and Change Groups</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-linux-ls-command-how-to-list-files-in-a-directory-with-options/">The Linux LS Command – How to List Files in a Directory + Option Flags</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/tar-in-linux-example-tar-gz-tar-file-and-tar-directory-and-tar-compress-commands/">Tar in Linux – Tar GZ, Tar File, Tar Directory, and Tar Compress Command Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/tar-command-linux-tar-cvf-tar-xvf/">The Tar Command in Linux: Tar CVF and Tar XVF Explained with Example Commands</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/symlink-tutorial-in-linux-how-to-create-and-remove-a-symbolic-link/">Symlink Tutorial in Linux – How to Create and Remove a Symbolic Link</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-package-management-with-snaps/">Linux Package Management with Snaps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-your-own-dotfiles-manager-from-scratch/">How to Build Your Own Linux Dotfiles Manager from Scratch</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-for-ethical-hackers-course/">Learn the Basics of Linux and How It Can Be Used by Ethical Hackers</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-server-course-system-configuration-and-operation/">How to Configure and Operate Linux Servers - Full Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-linux-commands-handbook/">The Linux Command Handbook</a></li>
</ul>
<h2 id="heading-how-to-learn-git-and-version-control">How to Learn Git and Version Control</h2>
<p>Once your programs start growing in size and complexity, you'll want a way to track your changes in case you need to roll back to an earlier version.</p>
<p>Git lets you do just that, and is the most popular version control software in use today. If you want to collaborate with other developers and get a job in the industry, it's important to know how Git works.</p>
<p>Some of our best articles on Git are listed below. Also, when you use Git it'll probably be through the command line, so make sure you know some basic Linux / Bash before diving in. </p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-git-learn-git-version-control/">What is Git? A Beginner's Guide to Git Version Control</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-git-and-version-control-in-an-hour/">Learn Git and Version Control in an Hour</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-and-github-overview/">Git vs GitHub – What is Version Control and How Does it Work?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-github-what-is-git-and-how-to-use-these-developer-tools/">What is GitHub? What is Git? And How to Use These Developer Tools</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/5-git-commands-you-should-know-with-code-examples/">Git Commands You Should Know, with Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-cheat-sheet/">Git Cheat Sheet – 50 Git Commands You Should Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-reset-to-remote-head-how-to-reset-a-remote-branch-to-origin/">Git Reset to Remote Head – How to Reset a Remote Branch to Origin</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-checkout-remote-branch-tutorial/">Git Checkout Remote Branch Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-branches-in-git/">How to Use Branches in Git – the Ultimate Cheatsheet</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-to-git-how-to-write-a-good-commit-message/">A Beginner’s Guide to Git — How to Write a Good Commit Message</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/">How to Write Good Commit Messages: A Practical Git Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-to-git-what-is-a-changelog-and-how-to-generate-it/">A Beginner’s Guide to Git — What is a Changelog and How to Generate it</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-ssh-how-to/">How to Get and Configure Your Git and GitHub SSH Keys</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-handle-multiple-git-configurations-in-one-machine/">How to Use Multiple Git Configs on One Computer</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-handle-merge-conflicts-in-git/">How to Understand and Solve Conflicts in Git</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-undo-mistakes-with-git/">How to Undo Mistakes with Git</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-git-aliases/">How to Use Git Aliases to Increase Your Productivity</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/save-the-day-with-git-reset/">Git Reset Explained – How to Save the Day with the Reset Command</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/7-git-commands-you-might-not-know/">Git Secrets: 7 Commands You Might Not Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-uncommit-sensitive-files-from-git/">How to Uncommit Sensitive Files from Git</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-pull-force-how-to-overwrite-local-changes-with-git/">Git Pull Force – How to Overwrite Local Changes With Git</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-clone-branch-how-to-clone-a-specific-branch/">Git Clone Branch – How to Clone a Specific Branch</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-switch-between-issues-in-git/">How to Switch Between Issues in Your Local Git Repository</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-sync-your-fork-with-the-original-git-repository/">How to Sync Your Fork with the Original Git Repository</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/git-and-github-crash-course/">Git and GitHub Crash Course</a></li>
</ul>
<h2 id="heading-how-to-learn-a-frontend-framework-library">How to Learn a Frontend Framework / Library</h2>
<p>Once you know how to build basic websites with HTML, CSS, and JavaScript, level up your skills by learning a frontend framework / library. Of these, the three most popular are React, Vue, and Angular.</p>
<p>Angular is considered a framework because it includes a lot of things like routing out of the box. </p>
<p>React, on the other hand, is usually referred to as a library because it doesn't come with a lot by default. Instead, you'll need to add some extra packages to handle routing and other things. </p>
<p>Vue falls somewhere in the middle in terms of functionality and weight.</p>
<p>Whatever you call them, each has its own strengths and weaknesses. There is no best framework / library – just choose one that seems the most interesting, or that companies in your area are hiring for, and go from there.</p>
<h3 id="heading-react">React</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/install-react-with-create-react-app/">How to Install React.js with create-react-app</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-components-jsx-props-for-beginners/">React Functional Components, Props, and JSX – React.js Tutorial for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/jsx-in-react-introduction/">JSX in React – Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-background-image-tutorial-how-to-set-backgroundimage-with-inline-css-style/">React Background Image Tutorial – How to Set backgroundImage with Inline CSS Style</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-accordion-menu-in-react-without-external-libraries/">How to Build an Accordion Menu in React from Scratch – No External Libraries Required</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-react-forms/">How to Build React Forms the Easy Way with react-hook-form</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-react-hooks/">How to Build Your Own React Hooks: A Step-by-Step Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-testing-library-tutorial-javascript-example-code/">React Testing Library – Tutorial with JavaScript Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-react-by-building-a-weather-app/">How to Build a Weather Application with React and React Hooks</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-drag-and-drop-in-react-with-react-beautiful-dnd/">How to Add Drag and Drop in React with React Beautiful DnD</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-svg-icons-in-react-with-react-icons-and-font-awesome/">How to Use SVG Icons in React with React Icons and Font Awesome</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-shopping-list-using-react-hooks-w-starter-code-and-video-walkthrough/">How to Build a Shopping List Using React Hooks (w/ Starter Code and Video Walkthrough)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-budget-tracker-app/">Build a React Budget Tracker App – Learn React &amp; Context API with this Fun Project</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/best-file-structure-for-react-components/">The Best File Structure for Your React Components</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-props-cheatsheet/">React Props Cheatsheet: 10 Patterns You Should Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-and-googlesheets/">How to Turn Google Sheets into a REST API and Use it with a React Application</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/fetch-data-react/">How to Fetch Data in React: Cheat Sheet + Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/use-the-youtube-iframe-api-in-react/">How to Use the YouTube IFrame API in React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-set-up-https-locally-with-create-react-app/">How to Setup HTTPS Locally with create-react-app</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-react-app-with-a-node-backend-the-complete-guide/">How to Create a React App with a Node Backend: The Complete Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-shopping-cart-with-react-and-typescript/">How to Add a Serverless Database to your React Projects</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/create-react-app-npm-scripts-explained/">The React Scripts Start Command – Create-React-App npm Scripts Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-shopping-cart-with-react-and-typescript/">Build a Shopping Cart with React and TypeScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-practice-project-birthday-reminder-app/">Learn React.js by Building Projects – Create a Birthday Reminder App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-nextjs-starter-to-easily-bootstrap-a-new-react-app/">How to Create a Next.js Starter to Easily Bootstrap a New React App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-how-to-use-react-and-graphql-to-make-a-full-stack-social-network/">Learn How to Use React and GraphQL to Make a Full Stack Social Network</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-beginner-handbook/">React for Beginners – A React.js Handbook for Front End Developers</a></li>
</ul>
<h3 id="heading-vue">Vue</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-basic-vue-js-crash-course-guide-vue-tutorial-e3da361c635/">Learn Vue: A 3-minute Interactive Vue JS T</a>utorial</li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-how-to-use-the-vue-js-cli-8349fb23a566/">Learn How to Use the Vue.js CLI</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/vue-js-full-course/">Learn Vue.js - Full Course for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/vue-js-components-an-interactive-guide-1b8149ecc254/">Vue Components: An Interactive Vue JS Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-routing-in-vue-js-to-create-a-better-user-experience-98d225bbcdd9/">How to Use Routing in Vue.js to Create a Better User Experience</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/markdown-previewer-vue-js-tutorial/">Build a Markdown Previewer with Vue.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-internationalization-to-a-vue-application-d9cfdcabb03b/">How to Add Internationalization to a Vue Application</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-charts-and-graphs-to-a-vue-js-application-29f943a45d09/">How to Add Charts and Graphs to a Vue.js Application</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-memory-card-game-with-vuejs/">How to Build a Memory Card Game with Vue.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-and-publish-a-vue-component-library/">How to Create and Publish a Vue Component Library</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-full-stack-mevn-app/">How to Build a Full Stack RPG Character Generator with MongoDB, Express, Vue, and Node (the MEVN Stack)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-a-vue-app-using-firebase/">How to Add Authentication to a Vue App Using Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-a-vue-app-using-auth0/">How to Add Authentication to a Vue App Using Auth0</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-a-vue-app-using-aws-amplify/">How to Add Authentication to a Vue App Using AWS Amplify</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-vue-handbook-a-thorough-introduction-to-vue-js-1e86835d8446/">The Vue Handbook: A Thorough Introduction to Vue.js</a></li>
</ul>
<h3 id="heading-angular">Angular</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-angular-on-windows-a-guide-to-angular-cli-node-js-and-build-tools/">How to Install Angular on Windows: A Guide to Angular CLI, Node.js, and Build Tools</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-9-for-beginners-components-and-string-interpolation/">Angular 9 for Beginners - Components and String Interpolation</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-9-for-beginners-how-to-install-your-first-app-with-angular-cli/">Angular 9 for Beginners — How to Install Your First App with Angular CLI</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/everything-you-need-to-know-about-ng-template-ng-content-ng-container-and-ngtemplateoutlet-4b7b51223691/">Everything you need to know about ng-template, ng-content, ng-container, and *ngTemplateOutlet in Angular</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/global-error-handling-in-angular-with-the-help-of-the-cdk/">What Could Go Wrong? How to Handle Errors in Angular</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-generic-form-validator/">How to Build a Generic Form Validator in Angular</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-validate-angular-template-driven-forms/">How to Validate Angular Template-Driven Forms</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-validate-angular-reactive-forms/">How to Validate Angular Reactive Forms</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-reusable-loading-indicator-for-angular-projects-d0a11f4631e0/">How to Create a Reusable Loading-Indicator for Angular Projects</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-i-built-a-customizable-loading-indicator-with-angular-dynamic-components-a291310f01d/">How I Built a Customizable Loading-Indicator with Angular Dynamic Components</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-an-online-poll-with-asp-net-core-angular-5-and-highcharts-85ff7fecbaf1/">How to Create an Online Poll with ASP.NET Core, Angular 5, and Highcharts</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/generate-qr-codes-in-angular-10/">How to Generate QR Codes in Angular 10</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-material-course/">Use Angular Material to add modern UI components to your Angular projects</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-rxjs-in-depth/">Angular RxJS In-Depth</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-an-optical-character-reader-using-angular-and-azure-computer-vision/">How To Create An Optical Character Reader Using Angular And Azure Computer Vision</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/angular-tutorial-course/">Learn Angular - Full Tutorial Course</a></li>
</ul>
<h2 id="heading-how-to-learn-web-basics-and-web-security">How to Learn Web Basics and Web Security</h2>
<p>When you get familiar with building web sites and web applications in the framework / library of your choice, you'll want to deploy them. But before you put your work online, it helps to know how the web works and the basics of web security.</p>
<h3 id="heading-web-basics">Web Basics</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-the-internet-works/">How HTTP Works and Why it's Important – Explained in Plain English</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/http-401-error-vs-http-403-error-status-code-responses-explained/">HTTP 401 Error vs HTTP 403 Error – Status Code Responses Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/http-error-403-forbidden-what-it-means-and-how-to-fix-it/">HTTP Error 403 Forbidden: What It Means and How to Fix It</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/error-403-forbidden-explained-how-can-i-fix-this-http-error-code/">Error 403 Forbidden Explained - How Can I Fix This HTTP Error Code?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/http-error-500-internal-server-error-explained-in-plain-english/">HTTP Error 500 – Internal Server Error Explained in Plain English</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/http-error-503-service-unavailable-explained-what-the-503-error-code-means/">HTTP Error 503 Service Unavailable Explained – What the 503 Error Code Means</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-in-depth-introduction-to-http-caching-cache-control-vary/">An In-depth Introduction to HTTP Caching: Cache-control &amp; Vary</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/http-and-everything-you-need-to-know-about-it/">An Introduction to HTTP: Everything You Need to Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-tcp-ip-layers-and-protocols-explained/">What is the TCP/IP Model? Layers and Protocols Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/wifi-security-explained/">WPA Key, WPA2, WPA3, and WEP Key: Wi-Fi Security Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-tls-transport-layer-security-encryption-explained-in-plain-english/">What is TLS? Transport Layer Security Encryption Explained in Plain English</a></li>
</ul>
<h3 id="heading-https">HTTPS</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-https-a-guide-to-secure-web-browsing-and-browser-encryption/">What is HTTPS? A Guide to Secure Web Browsing and Browser Encryption</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/wtf-is-https/">WTF is HTTPS?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/chrome-plans-to-implement-insecure-form-warnings-how-can-wordpress-plugins-help-fix-your-form/">How to Protect Your WordPress Website With HTTPS in 5 Simple Steps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/">How to Redirect HTTP to HTTPS Using .htaccess</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/simple-site-hosting-with-amazon-s3-and-https-5e78017f482a/">Simple Site Hosting with Amazon S3 and HTTPS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/https-explained-with-carrier-pigeons-7029d2193351/">HTTPS Explained with Carrier Pigeons</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec/">How to Get HTTPS Working on Your Local Development Environment in 5 Minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/free-https-c051ca570324/">How to Add HTTPS to Your Website for Free in 10 Minutes, and Why You Need to Do This Now More Than…</a></li>
</ul>
<h3 id="heading-cookies">Cookies</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/web-security-hardening-http-cookies-be8d8d8016e1/">Web Security: How to Harden Your HTTP Cookies</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/everything-you-need-to-know-about-cookies-for-web-development/">Everything You Need to Know About Cookies for Web Development</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-are-cookies-on-the-web-and-how-do-you-use-them/">What are Cookies on the Web and How Do You Use Them?</a></li>
</ul>
<h2 id="heading-how-to-learn-databases">How to Learn Databases</h2>
<p>By this point you've probably built a bunch of websites and applications. You've likely used an API to get data on things like the weather, or to grab a random quote to display on the page.</p>
<p>But if you've ever wanted to create your own API, or store information from your users, you'll need to learn how to use a database.</p>
<p>Generally speaking, databases fall into two categories: <strong>relational</strong>, or SQL, and <strong>non-relational</strong>, or NoSQL. SQL stands for "structured query language", and is a broad term to refer to relational databases. NoSQL, or "not only SQL" refer to non-relational databases.</p>
<p>Neither type of database is better or worse than the other – it mostly comes down to the project you're working on, and the sort of data you'll be working with.</p>
<p>Here's a list of some of the best articles we have on databases. I'll make a note about whether the database system is relational (SQL) or non-relational (NoSQL) if it isn't clear:</p>
<h3 id="heading-sql-mysql">SQL / MySQL</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-and-databases-explained-in-plain-english/">What is SQL? What is a Database? Relational Database Management Systems (RDBMS) Explained in Plain English</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/why-learn-sql/">Why You Should Learn SQL – Even If You're Not a Developer</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/basic-sql-commands/">Basic SQL Commands - The List of Database Queries and Statements You Should Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-recipes/">Learn SQL with These 5 Easy Recipes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-create-table-statement-with-example-syntax/">SQL Create Table Statement - With Example Syntax</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-operators-tutorial/">SQL Operators Tutorial – Bitwise, Comparison, Arithmetic, and Logical Operator Query Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-joins-tutorial/">SQL Joins Tutorial: Cross Join, Full Outer Join, Inner Join, Left Join, and Right Join</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-foreign-key-vs-primary-key-explained-with-mysql-syntax-examples/">SQL Foreign Key VS Primary Key Explained with MySQL Syntax Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-create-view-mysql/">SQL View Explained - How to Create a View in SQL and MySQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-sql-update-statement-explained/">The SQL Update Statement Explained: Queries for Updating Tables (including MySQL Examples)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-insert-and-insert-into-statements-with-example-syntax/">SQL Insert Into and Insert Statements: With Example MySQL Syntax</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-create-table-explained-with-mysql-and-postgres-examples/">SQL Create Table Explained with Syntax Examples for MySQL and Postgres</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/check-constraint-sql-server-mysql/">Check Constraint in SQL - Explained with MySQL and SQL Server Syntax Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-delete-row-statement-examples/">SQL Delete Row Statement - How to Remove Data From a Table With Example Queries</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/primary-key-sql-tutorial-how-to-define-a-primary-key-in-a-database/">Primary Key SQL Tutorial – How to Define a Primary Key in a Database</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-the-basics-of-sql-injection-and-how-to-protect-your-web-apps/">Learn the Basics of SQL Injection and How to Protect Your Web Apps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-sql-injection-how-to-prevent-it/">SQL Injection Tutorial - What is SQL Injection and How to Prevent it</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-update-statement-example-queries-for-updating-table-values/">SQL Update Statement — Example Queries for Updating Table Values</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/cjn-is-your-mysql-secured-7793e5444cf5/">How to Make Sure Your MySQL Database is Secured</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/connect-python-with-sql/">How to Create and Manipulate SQL Databases with Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/laravel-5-7-tutorial-build-your-first-crud-app-with-laravel-and-mysql-15cbd06c6cef/">How to Build Your First CRUD App with Laravel and MySQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sql-and-databases-full-course/">SQL and Databases - A Full Course for Beginners</a></li>
</ul>
<h3 id="heading-mongodb-mongoose-nosql">MongoDB / Mongoose (NoSQL)</h3>
<p>Note: Mongoose is a tool for MongoDB that lets you do things like object data modeling (ODM) to create models or schemas for your data. A lot of people use Mongoose to interact with a MongoDB database, so I've combined them here.</p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-mongodb-a4ce205e7739/">How to Get Started with MongoDB in 10 Minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-aggregation-framework/">How to Handle Advanced Data Processing with MongoDB's Aggregation Framework</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-node-express-project/">Learn Node + MongoDB by Creating a URL Shortener Project</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-mongoose-node-tutorial/">How to Use MongoDB + Mongoose with Node.js – Best Practices for Back End Devs</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/deploying-a-mern-application-using-mongodb-atlas-to-heroku/">How to Deploy a MERN Application to Heroku Using MongoDB Atlas</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-todo-app-with-react-typescript-nodejs-and-mongodb/">How to Build a Todo App with React, TypeScript, NodeJS, and MongoDB</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-full-stack-mevn-app/">How to Build a Full Stack RPG Character Generator with MongoDB, Express, Vue, and Node (the MEVN Stack)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-blazing-fast-graphql-api-with-node-js-mongodb-and-fastify-77fd5acd2998/">How to build a blazing fast GraphQL API with Node.js, MongoDB and Fastify</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-realtime-app-using-socket-io-react-node-mongodb-a10c4a1ab676/">How to Create a Realtime App Wsing Socket.io, React, Node &amp; MongoDB</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-blazing-fast-rest-apis-with-node-js-mongodb-fastify-and-swagger-114e062db0c9/">How to Build Blazing Fast REST APIs with Node.js, MongoDB, Fastify and Swagger</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/introduction-to-mongoose-for-mongodb-d2a7aa593c57/">Introduction to Mongoose for MongoDB</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-log-a-node-js-api-in-an-express-js-app-with-mongoose-plugins-efe32717b59/">How to Log a Node.js API in an Express.js App with Mongoose Plugins</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongoose101/">Mongoose 101: An Introduction to the Basics, Subdocuments, and Population</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-allow-users-to-upload-images-with-node-express-mongoose-and-cloudinary-84cefbdff1d9/">How to Allow Users to Upload Images with Node/Express, Mongoose, and Cloudinary</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-quickstart-with-python/">MongoDB Quickstart with Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-crud-app/">MongoDB Tutorial - CRUD App from Scratch Using Node.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/mongodb-full-course-nodejs-express-mongoose/">MongoDB Full Course w/ Node.js, Express, &amp; Mongoose</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/restful-api-using-node-express-mongo/">How to Build a RESTful API Using Node, Express, and Mongo</a></li>
</ul>
<h3 id="heading-redis-nosql">Redis (NoSQL)</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/redis-caching-essentials-with-node-and-mongoose/">How to Use Redis to Supercharge Your Web APIs</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-quick-guide-to-redis-lua-scripting/">A Quick Guide to Redis Lua Scripting</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/redis-hash-table-scan-explained-537cc8bb9f52/">How the Redis Hash Table Scan Function Works</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-multi-step-registration-app-with-animated-transitions-using-mern-stack/">How to Build a Multi-Step Registration App with Animated Transitions Using the MERN Stack</a></li>
</ul>
<h3 id="heading-postgres-postgresql">Postgres / PostgreSQL</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-started-with-postgresql-9d3bc1dd1b11/">How to Get Started with PostgreSQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/postgresql-tricks/">Learn These Quick Tricks in PostgreSQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/fuzzy-string-matching-with-postgresql/">How to Use Fuzzy String Matching with PostgreSQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-update-objects-inside-jsonb-arrays-with-postgresql-5c4e03be256a/">How to Update Objects Inside JSONB Arrays with PostgreSQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-deploy-a-rails-5-2-postgresql-app-on-aws-elastic-beanstalk-34e5cec3a984/">How to Deploy a Rails 5.2 PostgreSQL App on AWS Elastic Beanstalk</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/django-uwsgi-nginx-postgresql-setup-on-aws-ec2-ubuntu16-04-with-python-3-6-6c58698ae9d3/">How to Create a Django Server Running uWSGI, NGINX and PostgreSQL on AWS EC2 with Python 3.6</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-web-apis-with-nestjs-beginners-guide/">How to Build Web APIs with NestJS, Postgres, and Sequelize - A Beginner's Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/production-fullstack-react-express/">How to Deploy a React App to Production on AWS Using Express, Postgres, PM2 and NGINX</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-development-workflow-a-guide-with-flask-and-postgres-db1a1843044a/">Docker Development WorkFlow — a Guide with Flask and Postgres</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/postgresql-full-course/">Learn SQL with This Free 4-hour Course on the Popular PostgreSQL Database</a></li>
</ul>
<h2 id="heading-how-to-learn-backend-development">How to Learn Backend Development</h2>
<p>Similar to how frontend development is a broad subject, backend development can refer to many things, and encompasses a lot of different technologies.</p>
<p>Usually when you start working on the backend, which controls how sites and web apps work behind the scenes, you'll use a framework like Express, Flask, or Django.</p>
<h3 id="heading-express">Express</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-enable-es6-and-beyond-syntax-with-node-and-express-68d3e11fe1ab/">How to Enable ES6 (and beyond) Syntax with Node and Express</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-deploy-your-site-using-express-and-heroku/">How to Deploy Your App to the Web Using Express.js and Heroku</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/add-a-graphql-server-to-a-restful-express-js-api-in-2-minutes/">How to Add a GraphQL Server to a RESTful Express.js API in 2 Minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/express-js-security-tips/">Express.js Security Tips: How You Can Save and Secure Your App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-full-stack-mevn-app/">How to Build a Full Stack RPG Character Generator with MongoDB, Express, Vue, and Node (the MEVN Stack)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-multiplayer-card-game-with-phaser-3-express-and-socket-io/">How to Build a Multiplayer Card Game with Phaser 3, Express, and Socket.IO</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-multiplayer-tabletop-game-simulator/">How to Build a Multiplayer Tabletop Game Simulator with Vue, Phaser, Node, Express, and Socket.IO</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-input-validation-simple-and-clean-in-your-express-js-app-ea9b5ff5a8a7/">How to Make Input Validation Simple and Clean in Your Express.js App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-a-production-ready-node-and-express-app-f214f0b17d8c/">How to Write a Production-Ready Node and Express App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/restful-api-using-node-express-mongo/">How to Build a RESTful API using Node, Express, and Mongo</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-express-js-in-this-complete-course/">Learn Express.js in This Complete Course</a></li>
</ul>
<h3 id="heading-flask">Flask</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/end-to-end-machine-learning-project-turorial/">How to Develop an End-to-End Machine Learning Project and Deploy it to Heroku with Flask</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-microservices-course/">Learn About Python Microservices by Building an App Using Django, Flask, and React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-python-and-flask-to-build-a-web-app-an-in-depth-tutorial-437dbfe9f1c6/">How to Use Python and Flask to Build a Web App — An In-Depth Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/setting-up-a-ci-cd-on-gitlab-for-deploying-a-python-flask-application-on-heroku-e154db93952b/">Setting up CI/CD on GitLab for Deploying Python Flask Application on Heroku</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-flask-for-python-full-tutorial/">Learn Flask Web Development for Python in This Free 1-hour Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-web-programming-with-flask-from-harvards-cs50/">Learn Web Programming with Flask from Harvard's CS50</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-the-flask-python-web-framework-by-building-a-market-platform/">Learn the Flask Python Web Development Framework by Building an Ecommerce Platform</a></li>
</ul>
<h3 id="heading-django">Django</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-efficient-views-models-and-queries-in-django/">How to Write Efficient Views, Models, and Queries in Django</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-manipulate-data-with-django-migrations/">How to Manipulate Data with Django Migrations</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/django-project-best-practices-for-happy-developers/">Django Project Best Practices That'll Keep Your Developers Happy</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/increase-developer-confidence-with-a-great-django-test-suite/">Django Test Suite Introduction – How to Increase Your Confidence as a Python Developer</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/eli5-full-stack-basics-breakthrough-with-django-emberjs-402fc7af0e3/">ELI5 Full Stack Basics: Breakthrough with Django &amp; EmberJS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/i-built-a-members-area-on-my-website-with-python-and-django-heres-what-i-learned/">I Built a Members' Area on My Website with Python and Django. Here's What I Learned.</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-web-based-dashboard-with-django-mongodb-and-pivot-table/">How to Build a Web-Based Dashboard with Django, MongoDB, and Pivot Table</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-an-analytics-dashboard-in-django-app/">How to Create an Analytics Dashboard in a Django App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-an-e-commerce-website-with-django-and-python/">How to Build an E-commerce Website with Django and Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/django-rest-framework-react-tutorial/">Build a Moodle / Blackboard clone with Django Rest Framework &amp; React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-progress-bar-for-the-web-with-django-and-celery-12a405637440/">How to Build a Progress Bar for the Web with Django and Celery</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/sphinx-for-django-documentation-2454e924b3bc/">How to Document Your Django Project Using the Sphinx Tool</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-django-course/">Python Django Web Framework - Full Course for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-microservices-course/">Learn About Python Microservices by Building an App Using Django, Flask, and React</a></li>
</ul>
<h2 id="heading-how-to-learn-static-site-generators">How to Learn Static Site Generators</h2>
<p>Static Site Generators were created to make development easy, and they represent the "M" in <a target="_blank" href="https://www.freecodecamp.org/news/what-is-the-jamstack-and-how-do-i-host-my-website-on-it/">JAMstack</a> (JavaScript, APIs, and Markup). With a static site generator, it's much easier to create a quick, scaleable website, blog, or web app with modern benefits like server-side rendering.</p>
<h3 id="heading-gatsby">Gatsby</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/gatsby-blog-header-image-twitter-card/">Gatsby Starter Blog: How to Add Header Images to Posts with Support for Twitter Cards</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-an-image-gallery-gatsby-and-cloudinary/">How to Create an Image Gallery Using Gatsby and Cloudinary</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-blog-with-gatsby-and-netlify-cms/">How to Build a Blog with Gatsby and Netlify CMS – A Complete Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/create-a-full-stack-website-with-strapi-and-gatsbyjs/">Create a Full-Stack Website with Strapi and GatsbyJS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-travel-bucket-list-map-with-gatsby-react-leaflet-graphcms/">How to Create a Travel Bucket List Map with Gatsby, React Leaflet, &amp; GraphCMS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-enable-offline-mode-for-gatsby-site/">How to Enable Offline Mode for Your Gatsby Site</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-are-environment-variables-and-how-can-i-use-them-with-gatsby-and-netlify/">What Are Environment Variables and How Can I Use Them with Gatsby and Netlify?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/3-ways-to-edit-markdown-with-tina-gatsby/">3 Ways to Edit Markdown with TinaCMS</a> + Gatsby</li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-developer-blog-from-scratch-with-gatsby-and-mdx/">How to Build Your Coding Blog From Scratch Using Gatsby and MDX</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-gatsby-and-why-its-time-to-get-on-the-hype-train/">What Is Gatsby and Why It's Time to Get on the Hype Train</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/building-jamstack-apps/">How to Build Authenticated Serverless JAMstack Apps with Gatsby and Netlify</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/keeping-state-between-pages-with-local-state-in-gatsby-js/">How to Keep State Between Pages with Local State in Gatsby.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-automatically-cross-post-from-your-gatsbyjs-blog-with-rss/">How to Automatically Cross-post from Your GatsbyJS Blog with RSS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-searchable-log-with-gatsby-d624bf3a05af/">How to Create a Searchable Log with Gatsby</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/from-zero-to-deploy-how-i-created-a-static-website-from-scratch-using-netlify-gatsby-ebca82612ffd/">From Zero to Deploy: How I Created a Static Website from Scratch Using Netlify + Gatsby</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/get-your-graphcms-data-into-gatsby-2018/">Get Your GraphCMS Data into Gatsby</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/great-gatsby-bootcamp/">The Great Gatsby.js Bootcamp</a></li>
</ul>
<h3 id="heading-nextjs">Next.js</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/static-site-generation-with-nextjs/">What is Static Site Generation? How Next.js Uses SSG for Dynamic Web Apps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/nextjs-basics/">Next.js Basics Tutorial – Server-side Rendering, Static Sites, REST APIs, Routing, and More</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/routing-in-nextjs-beginners-guide/">Routing in Next.js – A Complete Beginner's Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-nextjs-starter-to-easily-bootstrap-a-new-react-app/">How to Create a Next.js Starter to Easily Bootstrap a New React App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-jamstack-site-with-next-js-and-vercel-jamstack-handbook/">How to Build a Jamstack Site with Next.js and Vercel - Jamstack Handbook</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-contact-form-with-netlify-forms-and-nextjs/">How to Create a Contact Form with Netlify Forms and Next.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-an-image-gallery-with-nextjs/">How to Build an Image Gallery with NextJS Using the Pexels API and Chakra UI</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-interactive-animations-and-page-transitions-to-a-next-js-web-app-with-framer-motion/">How to Add Interactive Animations and Page Transitions to a Next.js Web App with Framer Motion</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-github-actions-to-deploy-a-next-js-website-to-aws-s3/">How to Use Github Actions to Deploy a Next.js Website to AWS S3</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-chakra-ui-with-next-js-and-react/">How to Use Chakra UI with Next.js and React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-sass-with-css-modules-in-next-js/">How to Run Visual Regression Testing on a Next.js App with Cypress and Applitools</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-fetch-graphql-data-in-next-js-with-apollo-graphql/">How to Fetch GraphQL Data in Next.js with Apollo GraphQL</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/discover-next-js-and-write-server-side-react-apps-the-easy-way-cc920dea2d9d/">Discover Next.js and Write Server-Side React Apps the Easy Way</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-next-js-handbook/">The Next.js Handbook</a></li>
</ul>
<h3 id="heading-hugo">Hugo</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/your-first-hugo-blog-a-practical-guide/">How to Create Your First Hugo Blog: a Practical Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-portable-makefile-for-continuous-delivery-with-hugo-and-github-pages/">A Portable Makefile for Continuous Delivery with Hugo and GitHub Pages</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/two-ways-to-deploy-a-public-github-pages-site-from-a-private-hugo-repository-627312ec63b9/">Two Ways to Deploy a Public GitHub Pages Site from a Private Hugo Repository</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/hugo-firebase-how-to-create-your-own-dynamic-website-for-free-in-minutes-463b4fb7bf5a/">Hugo + Firebase: How to Create Your Own Static Website for Free in Minutes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/hugo-vs-jekyll-battle-of-static-site-generator-themes/">Hugo vs Jekyll: an Epic Battle of Static Site Generator Themes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/my-latest-self-hosted-hugo-workflow/">How to Self-Host a Hugo Web App</a></li>
</ul>
<h3 id="heading-nuxtjs">Nuxt.js</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-flat-file-data-in-a-static-nuxt-app/">How to Use Flat-File Data in a Static Nuxt App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/up-goind-with-nuxt-js-bulma-and-sass/">Up &amp; Going with Nuxt.js, Bulma and Sass</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/universal-application-code-structure-in-nuxt-js-4cd014cc0baa/">Universal Application Code Structure in Nuxt.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/architecting-dapp-using-nuxt-js-nebulas-fc00712ae341/">How to Architect a DApp Using Nuxt.js and Nebulas</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/deploy-a-nuxt-app-to-s3-in-5-minutes-515a161eb74f/">Deploy a Nuxt App to S3 in 5 Minutes</a></li>
</ul>
<h3 id="heading-vuepress">Vuepress</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-documentation-website-using-vuepress-eeabe8a99045/">How to Create a Documentation Website Using VuePress</a></li>
</ul>
<h2 id="heading-how-to-learn-bundlers-compilers-dependency-managers-task-runners-formatters-and-linters">How to Learn Bundlers, Compilers, Dependency Managers, Task Runners, Formatters, and Linters</h2>
<p>Once you start working with frontend frameworks / libraries, or your projects start to grow in size and complexity, things can quickly get out of hand.</p>
<p>To keep things organized and tidy, it helps to learn linting, especially if you work on large teams. With linting, you can catch errors before they happen, and with a formatter like prettier, you can enforce a code style guide for your entire team.</p>
<p>And though a lot of Angular, Vue, and React projects already include a bundler like Webpack, it's helpful to learn more about how it works in case you need to adjust its behavior later.</p>
<h3 id="heading-webpack-and-babel">Webpack and Babel</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-intro-to-webpack-what-it-is-and-how-to-use-it-8304ecdc3c60/">An Intro to Webpack: What It Is and How to Use It</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/creating-a-production-ready-webpack-4-config-from-scratch/">How to Create a Production-Ready Webpack 4 Config From Scratch</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-share-variables-across-html-css-and-javascript-using-webpack/">How to Share Variables Across HTML, CSS, and JavaScript Using Webpack</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-combine-webpack-4-and-babel-7-to-create-a-fantastic-react-app-845797e036ff/">How to Combine Webpack 4 and Babel 7 to Create a Fantastic React App</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-set-up-deploy-your-react-app-from-scratch-using-webpack-and-babel-a669891033d4/">How to Set up &amp; Deploy Your React App from Scratch Using Webpack and Babel</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/using-babel-macros-with-react-native-8615aaf5b7df/">How to Use Babel Macros with React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/webpack-course/">Learn Webpack to Simplify and Speed Up Your Website</a></li>
</ul>
<h3 id="heading-eslint-and-prettier">ESLint and Prettier</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-linting-and-how-can-it-save-you-time/">What Is Linting and How Can It save You Time?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/dont-just-lint-your-code-fix-it-with-prettier/">Don’t Just Lint Your Code - Fix It with Prettier</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/creating-your-own-eslint-config-package/">How to Create Your Own ESLint Config Package</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-essentials-eslint/">ESLint: The Essential Facts About Essential Front End Tools</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-stop-errors-before-they-ever-hit-your-codebase-with-travis-ci-and-eslint-7a5a6b1fcd4a/">How to Stop Errors Before They Ever Hit Your Codebase with Travis CI and ESLint</a></li>
</ul>
<h3 id="heading-parcel">Parcel</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-up-a-react-app-with-parcel/">How to Set Up a React App with Parcel</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-parcel-to-bundle-your-react-js-application-d023979e9fe4/">How to Use Parcel to Bundle Your React.js Application</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/building-chrome-extensions-in-react-parcel-79d0240dd58f/">How to Build Chrome Extensions with React + Parcel</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/using-parcel-bundler-with-react/">Using Parcel Bundler with React</a></li>
</ul>
<h3 id="heading-gulp">Gulp</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/super-simple-gulp-tutorial-for-beginners-45141974bfe8/">Super Simple Gulp Tutorial for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/gulp-4-walk-through-with-example-code-c3c018eab306/">Using Gulp 4 in Your Workflow for Sass and JS Files</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-minify-images-with-gulp-gulp-imagemin-and-boost-your-sites-performance-6c226046e08e/">How to Minify Images with Gulp &amp; Gulp-imagemin and Boost Your Site’s Performance</a></li>
</ul>
<h3 id="heading-npm-scripts">npm Scripts</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/why-i-left-gulp-and-grunt-for-npm-scripts-3d6853dd22b8/">Why I Left Gulp and Grunt for npm Scripts</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/create-react-app-npm-scripts-explained/">The React Scripts Start Command – Create-React-App npm Scripts Explained</a></li>
</ul>
<h2 id="heading-how-to-learn-mobile-application-development">How to Learn Mobile Application Development</h2>
<p>These days, a lot of mobile app development is done with a framework like React Native.</p>
<p>While in the past you had to know a specific language like Java to develop a mobile app, with a framework, a lot of your frontend framework / library knowledge can be used to develop a mobile app.</p>
<p>Also, if you use a framework, you can just build the app once, and create both iOS and Android versions from the same code base.</p>
<h3 id="heading-react-native">React Native</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-react-native-animations-work/">How Animations Work in React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-background-video-in-react-native-cb53304ee4f6/">How to Use Video As a Background in React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/introducing-react-navigation-5/">How to Handle Navigation in React Native with react-navigation 5</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/i-switched-to-react-native-and-created-a-bottom-sheet-its-easier-than-native/">Why I Switched to React Native to Create a Super Easy Bottom Sheet</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-react-native-constructs-app-layouts-and-how-fabric-is-about-to-change-it-dd4cb510d055/">How React Native Constructs App Layouts (and How Fabric is About to Change It)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-camera-app-with-expo-and-react-native/">How to Create a Camera App with Expo and React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-react-native-app-user-authentication/">How to Build Your First Serverless React Native App with User Authentication</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-react-native-in-three-steps-using-firebase/">How to Add Authentication to React Native in Three Steps Using Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-native-firebase-tutorial/">How to Build a React Native App and Integrate It with Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/google-login-with-react-native-and-firebase/">How to Set Up Google Login in React Native &amp; Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-native-gestures-animations-tutorial/">Add Gestures and Animations to React Native Projects</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/using-babel-macros-with-react-native-8615aaf5b7df/">How to Use Babel Macros with React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-an-instagram-clone-with-react-native-firebase-firestore-redux-and-expo/">Build an Instagram Clone with React Native, Firebase Firestore, Redux, and Expo</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/create-an-app-that-works-on-ios-android-and-the-web-with-react-native-web/">React Native Course: How to Build an iPhone App, Android App, and Website - All with the Same Codebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-integrate-redux-into-your-application-with-react-native-and-expo-ec37c9ca6033/">How to Integrate Redux into Your Application with React Native and Expo</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/converting-a-react-app-to-react-native/">How to Convert a React App to React Native</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-native-course-for-beginners/">Intro to React Native Course</a></li>
</ul>
<h3 id="heading-ionic">Ionic</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-hello-world-in-ionic/">How to Write "Hello, World!" in Ionic</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/creating-a-crud-to-do-app-using-ionic-4/">How to Create a CRUD To-do App Using Ionic 3</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-your-first-ionic-4-app-with-api-calls-f6ea747dc17a/">How to Build Your First Ionic 4 App with API Calls</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-push-notifications-working-with-ionic-4-and-firebase-ad87cc92394e/">How to Get Push Notifications Working with Ionic 4 and Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-develop-a-great-facebook-login-flow-with-firebase-and-ionic-656a295c4fe9/">How to Develop a Great Facebook Login Flow with Firebase and Ionic</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-integrate-google-login-into-an-ionic-app-with-firebase-41cb69234919/">How to Integrate Google Login into an Ionic App with Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ionic-full-course/">Learn Ionic 4 and start creating iOS / Android Apps</a></li>
</ul>
<h3 id="heading-flutter">Flutter</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/https-medium-com-rahman-sameeha-whats-flutter-an-intro-to-dart-6fc42ba7c4a3/">A Simplified Introduction to Dart and Flutter</a></li>
<li>An Introduction to Flutter: The Basics</li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/serialize-object-flutter/">How to Serialize An Object In Flutter</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-handle-state-in-flutter-using-the-bloc-pattern-8ed2f1e49a13/">How to Handle State in Flutter Using the BLoC Pattern</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/using-streams-blocs-and-sqlite-in-flutter-2e59e1f7cdce/">How to Use Streams, BLoCs, and SQLite in Flutter</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-handle-navigation-in-your-flutter-apps-ceaf2f411dcd/">How to Handle Navigation in Your Flutter Apps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/provider-pattern-in-flutter/">How to Use the Provider Pattern in Flutter</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-chat-app-ui-with-flutter/">How to Build a Chat App UI With Flutter and Dart</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-push-notifications-to-flutter-app/">How to Add Push Notifications to a Flutter App using Firebase Cloud Messaging</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-google-admob-to-flutter/">How to Integrate Google AdMob into Flutter</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-native-communication-bridge-in-flutter-with-webview-and-javascript/">How to Build a Native Communication Bridge in Flutter with WebView and JavaScript</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-tip-calculator-with-flutter/">How to Use Flutter to Build a Tip Calculator</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-cryptocurrency-price-list-app-using-flutter-sdk-1c75998e1a58/">How to Build a Cryptocurrency Price List App Using Flutter SDK</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/flutter-messenger-clone/">Flutter UI Tutorial – How to Build a Chat App with Stories Using the Flutter SDK</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-a-production-app-with-flutter/">Flutter Course – How to Create a Production iPhone and Android App with the Flutter UI Tookit</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/flutter-app-course-mobile-web-desktop/">Use Flutter to Make an App for Mobile, Web, and Desktop - All with One Codebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/flutter-course-ios-android/">Learn to Build iOS and Android Apps with Flutter</a></li>
</ul>
<h2 id="heading-how-to-learn-desktop-application-development">How to Learn Desktop Application Development</h2>
<p>Similar to modern mobile app development, a lot of desktop apps these days are developed using a framework. This has a lot of the same advantages, and means that you can write your desktop app just once, and create Windows, macOS, and even Linux versions from the same code base.</p>
<h3 id="heading-electron">Electron</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-os-specific-code-in-electron-bf6379c62ff6/">Writing OS-specific Code in Electron</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/building-an-electron-application-with-create-react-app-97945861647c/">Building an Electron Application with create-react-app</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/quick-painless-automatic-updates-in-electron-d993d5408b3a/">Quick, Painless, Automatic Updates in Electron</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/heres-how-i-created-a-markdown-app-with-electron-and-react-1e902f8601ca/">Here’s How I created a Markdown App with Electron and React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/creating-an-electron-app-using-angular-and-sqlite3-24ca7d892810/">How to Create an Electron App Using Angular and SQLite3</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/lessons-learned-from-electronjs/">Things I Wish I Knew Before Working with Electron.js</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-an-electron-desktop-app-in-javascript-multithreading-sqlite-native-modules-and-1679d5ec0ac/">How to Build an Electron Desktop App in JavaScript: Multithreading, SQLite, Native Modules, and Other Common Pain Points</a></li>
</ul>
<h3 id="heading-proton-native">Proton Native</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-native-desktop-apps-with-javascript-a49ede90d8e9/">How to Build Native Desktop Apps with JavaScript (Pr</a>oton Native)</li>
</ul>
<h2 id="heading-how-to-learn-data-science-and-machine-learning">How to Learn Data Science and Machine Learning</h2>
<p>Data science and machine learning are all the rage, and the number of jobs in each field is growing every year.</p>
<p>Put simply, data science refers to a broad range of techniques used to analyze and make sense of vast amounts of data.</p>
<p>Machine learning falls under the umbrella of data science, and it employs techniques that data scientists use to enable computers to learn from all this data.</p>
<p>It's a lot to take in, but no worries – here are some of the best articles and courses we have on machine learning, and the different libraries and frameworks you'll use on the job.</p>
<h3 id="heading-general-machine-learning">General Machine Learning</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/machine-learning-basics-for-developers/">Machine Learning Basics for Developers</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/convolutional-neural-network-tutorial-for-beginners/">What Is a Convolutional Neural Network? A Beginner's Tutorial for Machine Learning and Deep Learning</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/">Clustering Algorithms in Machine Learning that All Data Scientists Should Know</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-no-code-intro-to-the-9-most-important-machine-learning-algorithms-today/">Key Machine Learning Algorithms Explained in Plain English</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-the-tree-based-algorithm-for-machine-learning/">Random Forest Classifier Tutorial: How to Use Tree-Based Algorithms for Machine Learning</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/google-bert-nlp-machine-learning-tutorial/">Google BERT NLP Machine Learning Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/svm-machine-learning-tutorial-what-is-the-support-vector-machine-algorithm-explained-with-code-examples/">SVM Machine Learning Tutorial – What is the Support Vector Machine Algorithm, Explained with Code Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/machine-learning-with-scikit-learn-full-course/">Machine Learning with Scikit-Learn—Full Course</a></li>
</ul>
<h3 id="heading-pandas">Pandas</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-ultimate-guide-to-the-pandas-library-for-data-science-in-python/">The Ultimate Guide to the Pandas Library for Data Science in Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-pandas-functions/">How to Get Started with Pandas in Python – a Beginner's Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-pandas-major-storms-hard-data/">How to Use Python and Pandas to Map Major Storms, Pessimism, and Hard Data</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-analyze-data-with-python-pandas/">How to Analyze Data with Python, Pandas &amp; Numpy - 10 Hour Course</a></li>
</ul>
<h3 id="heading-numpy">Numpy</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-ultimate-guide-to-the-numpy-scientific-computing-library-for-python/">The Ultimate Guide to the NumPy Package for Scientific Computing in Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/numpy-crash-course-build-powerful-n-d-arrays-with-numpy/">Python NumPy Crash Course – How to Build N-Dimensional Arrays for Machine Learning</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/numpy-python-tutorial/">Learn NumPy and Start Doing Scientific Computing in Python</a></li>
</ul>
<h3 id="heading-scikit-learn">Scikit-Learn</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/machine-learning-with-scikit-learn-full-course/">Machine Learning with Scikit-Learn—Full Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/regression-analysis-on-life-expectancy/">How I Used Regression Analysis to Analyze Life Expectancy with Scikit-Learn and Statsmodels</a></li>
</ul>
<h3 id="heading-seaborn">Seaborn</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/kaggle-dataset-analysis-with-pandas-matplotlib-seaborn/">Python Data Analysis: How to Visualize a Kaggle Dataset with Pandas, Matplotlib, and Seaborn</a></li>
</ul>
<h3 id="heading-matplotlib">Matplotlib</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/matplotlib-course-learn-python-data-visualization/">Matplotlib Course – Learn Python Data Visualization</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-embed-interactive-python-visualizations-on-your-website-with-python-and-matplotlib/">How to Embed Interactive Python Visualizations on Your Website with Python and Matplotlib</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-auto-updating-data-visualizations-in-python-with-matplotlib-and-aws/">How to Create Auto-Updating Data Visualizations in Python with IEX Cloud, Matplotlib, and AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/kaggle-dataset-analysis-with-pandas-matplotlib-seaborn/">Python Data Analysis: How to Visualize a Kaggle Dataset with Pandas, Matplotlib, and Seaborn</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/python-data-science-course-matplotlib-pandas-numpy/">Python Data Science – A Free 12-Hour Course for Beginners. Learn Pandas, NumPy, Matplotlib, and More</a></li>
</ul>
<h3 id="heading-tensorflow">TensorFlow</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/massive-tensorflow-2-0-free-course/">Learn How to Use TensorFlow 2.0 For Machine Learning in This Massive Free Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-natural-language-processing-no-experience-required/">Learn Natural Language Processing with Python and TensorFlow 2.0 – No Machine Learning Experience Required</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/applied-deep-learning-with-pytorch-full-course/">Learn to Apply Deep Learning with Pytorch in This Full Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-to-develop-neural-networks-using-tensorflow-2-0-in-this-beginners-course/">Learn to Develop Neural Networks Using TensorFlow 2.0 In This Beginner's Course</a></li>
</ul>
<h3 id="heading-pytorch">PyTorch</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/pytorch-tensor-methods/">PyTorch Tensor Methods – How to Create Tensors in Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-neural-network-with-pytorch/">How to Build a Neural Network from Scratch with PyTorch</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/pytorch-full-course/">Learn How to Use PyTorch for Deep Learning</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/free-deep-learning-with-pytorch-live-course/">Free Live Course: Deep Learning with PyTorch</a></li>
</ul>
<h3 id="heading-keras">Keras</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/keras-video-course-python-deep-learning/">Keras Course – Learn Python Deep Learning and Neural Networks</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/classify-butterfly-images-deep-learning-keras/">How to Classify Butterflies with Deep Learning in Keras</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-your-first-neural-network-to-predict-house-prices-with-keras-f8db83049159/">How to Build Your First Neural Network to Predict House Prices with Keras</a></li>
</ul>
<h2 id="heading-how-to-learn-virtualization-and-containerization">How to Learn Virtualization and Containerization</h2>
<p>Once you learn the basics of Linux, you'll want to learn about virtual machines / virtualization, and containerization.</p>
<p>The main difference between the two is that virtualization is an abstraction on the hardware level, and allows multiple emulated machines to run on a single machine.</p>
<p>For example, with virtualization, you can split up a single machine's resources (CPU, SSD, RAM, and so on) into two smaller machines, with one running Windows server and another running Ubuntu.</p>
<p>On the other hand, containerization is emulation on the software level. This allows you to package applications and all their dependencies into a small, portable container that runs pretty much anywhere.</p>
<p>With containerization, you have a Node.js app that runs on Ubuntu. You can include your app, all its <code>node_module</code> files, and even the entire Ubuntu OS, in a small ~1 GB container. VMs are typically between 20 - 160 GB in size.</p>
<p>But both are useful, and serve different purposes. Check out our tutorials below to learn more about both virtualization and containerization.</p>
<h3 id="heading-virtual-machines">Virtual Machines</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/linux-server-virtualization-the-basics/">Linux Server Virtualization: The Basics</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/virtualbox-are-you-getting-your-moneys-worth/">VirtualBox: Are You Getting Your Money’s Worth?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-ubuntu-with-oracle-virtualbox/">How to install Ubuntu on VirtualBox</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-virtual-machine-and-how-to-setup-a-vm-on-windows-linux-and-mac/">What is a Virtual Machine And How to Setup a VM on Windows, Linux, and Mac</a></li>
</ul>
<h3 id="heading-docker">Docker</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-docker-used-for-a-docker-container-tutorial-for-beginners/">What is Docker Used For? A Docker Container Tutorial for Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/comprehensive-introductory-guide-to-docker-vms-and-containers-4e42a13ee103/">A Comprehensive Introduction to Docker, Virtual Machines, and Containers</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-101-creation-to-deployment/">Docker 101 - How to Get from Creation to Deployment</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/">A Beginner’s Guide to Docker — How to Create Your First Docker Application</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-remove-image-how-to-delete-docker-images-explained-with-examples/">Docker Remove Image: How to Delete Docker Images Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-a-docker-container-ip-address-explained-with-examples/">How to Get A Docker Container IP Address - Explained with Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-install-docker-on-ubuntu-18-04-guide-for-both-ce-and-ee/">How to Install Docker on Ubuntu 18.04 [Guide for both CE and EE]</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-run-docker-on-windows-10-home-edition/">How to Run Docker on Windows 10 Home Edition</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/node-js-debugging/">How to Debug a Node.js Application with VSCode, Docker, and Your Terminal</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-exec-how-to-run-a-command-inside-a-docker-image-or-container/">Docker Exec - How to Run a Command Inside a Docker Image or Container</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/">Where are Docker Images Stored? Docker Container Paths Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-data-containers/">Docker Data Containers</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-image-guide-how-to-remove-and-delete-docker-images-stop-containers-and-remove-all-volumes/">Docker Image Guide: How to Delete Docker Images, Stop Containers, and Remove All Volumes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/cleaning-up-docker/">Cleaning Up Docker</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-introduction-to-docker-tags-9b5395636c2a/">A Quick Introduction to Docker Tags</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-enable-live-reload-on-docker-based-applications/">How to Enable Live-reload on Docker-based Applications with Docker Volumes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-practical-introduction-to-docker-compose/">A Practical Introduction to Docker Compose</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-a-client-server-side-with-docker-compose-12c8cf0ae0aa/">A Beginner’s Guide to Docker — How to Create a Client/Server Side with docker-compose</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-do-deploy-docker-containers-to-the-cloud-with-aws-lightsail/">Docker Deployment Guide – How to Deploy Containers to the Cloud with AWS Lightsail</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-docker-handbook/">The Docker Handbook – 2021 Edition</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/course-on-docker-and-kubernetes/">Free 4-Hour Course on Docker and Kubernetes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-devops-course/">Learn DevOps Basics with This Free 2-hour Docker Course</a></li>
</ul>
<h3 id="heading-kubernetes">Kubernetes</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/kubernetes-vs-docker-whats-the-difference-explained-with-examples/">Kubernetes VS Docker: What's the Difference? Explained With Examples</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-simple-introduction-to-kubernetes-container-orchestration/">A Simple Introduction to Kubernetes Container Orchestration</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-friendly-introduction-to-kubernetes-670c50ce4542/">A Friendly Introduction to Kubernetes</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/developing-kubernetes-applications-with-joy/">How to Develop Kubernetes Applications with Joy</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-helm-chart-tutorial-for-kubernetes-beginners/">What is a Helm Chart? A Tutorial for Kubernetes Beginners</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/helm-charts-tutorial-the-kubernetes-package-manager-explained/">Helm Charts Tutorial: The Kubernetes Package Manager Explained</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-kubernetes-in-under-3-hours-a-detailed-guide-to-orchestrating-containers-114ff420e882/">Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-swarm-vs-kubernetes-how-to-setup-both-in-two-virtual-machines-f8897fce7967/">Docker Swarm vs Kubernetes: How to Setup Both in Two Virtual Machines</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-kubernetes-handbook/">The Kubernetes Handbook</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-introduction-to-the-helm-package-manager-for-kubernetes/">An Introduction to the Helm Package Manager for Kubernetes</a></li>
</ul>
<h2 id="heading-how-to-learn-cloud-computing">How to Learn Cloud Computing</h2>
<p>Once you learn the basics about virtual machines, you'll want to learn about cloud computing.</p>
<p>Not too long ago, if a company wanted to run a server to host a website, they would have to build and maintain the server themselves.</p>
<p>With cloud computing, you can spin up virtual machine running your OS of choice in a few minutes. Better yet, the company hosting your VM will take care of the general maintenance for you, and ensure that the server is online and highly available.</p>
<p>And with cloud computing, you don't even have to have a server running 24/7 – with certain services, you can run a function and just pay for the milliseconds of time it took to complete.</p>
<p>Check out our tutorials below to learn more about cloud computing on the three big players in this space: Amazon Web Services, Google Cloud Platform, and Microsoft Azure.</p>
<h3 id="heading-amazon-web-services-aws">Amazon Web Services (AWS)</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-the-basics-of-amazon-web-services/">AWS Training – Learn the Basics of Amazon Web Services</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/top-5-things-to-learn-first-when-getting-started-with-aws/">AWS Cheatsheet: The Top 5 Things to Learn First When Getting Started with Amazon Web Services</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/everything-you-need-to-know-about-aws-s3/">Everything You Need to Know About AWS S3</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/getting-started-with-server-administration-on-aws/">How to Spin Up a Remote Server on AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/install-elastic-bean-cli-on-mac/">How to Install the AWS Elastic Beanstalk CLI on a Mac</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/aws-cli-tutorial-install-configure-understand-resource-environment/">AWS CLI Tutorial – How to Install, Configure, and Use AWS CLI to Understand Your Resource Environment</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-host-a-static-site-in-the-cloud-in-4-steps/">How to Host a Static Site in the Cloud in Four Steps</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-host-and-deploy-a-static-website-or-jamstack-app-to-s3-and-cloudfront/">How to Host and Deploy a Static Website or JAMstack App to AWS S3 and CloudFront</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/a-beginners-guide-on-how-to-host-a-static-site-with-aws/">How to Host your Static Website with AWS - A Beginner's Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/using-lambda-functions-as-cronjobs/">Cron Job AWS Lambda Functions Tutorial – How to Schedule Tasks</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-and-deploy-aws-applications-on-local-machine/">How to Build and Deploy AWS Applications on Your Local Machine</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-serverless-application-using-aws-sam/">How to Build a Serverless Application Using AWS SAM</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-serverless-application-using-aws-chalice/">How to Build a Serverless Application Using AWS Chalice</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/design-and-deploy-backend-with-amplify-sandbox/">How to Design Almost Any Backend and Deploy It to AWS with No Code</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-a-vue-app-using-aws-amplify/">How to Add Authentication to a Vue App Using AWS Amplify</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-screenshot-capture-api-using-terraform-aws-api-gateway-and-aws-lambda/">How to Build a Screenshot Capture API Using Terraform, AWS API Gateway, and AWS Lambda</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-your-own-serverless-subscriber-list-with-go-and-aws/">How to Build Your Own Serverless Subscriber List with Go and AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-secure-your-workloads-on-aws/">How to Secure Your Workloads on AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ultimate-guide-to-aws-amplify-and-reacxt/">How to Build a Full Stack App with AWS Amplify and React</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-github-actions-to-deploy-a-next-js-website-to-aws-s3/">How to Use Github Actions to Deploy a Next.js Website to AWS S3</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/cost-optimization-in-aws/">How to Optimize your AWS Cloud Architecture Costs</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-an-api-with-typescript-and-aws/">The Complete Guide to building an API with TypeScript and AWS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-and-deploy-graphql-server-in-aws-lambda-using-nodejs-and-cloudformation/">How to Build and Deploy a GraphQL Server in AWS Lambda Using Node.js and CloudFormation</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/complete-back-end-system-with-serverless/">How to Build a Complete Back End System with Serverless</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/simple-site-hosting-with-amazon-s3-and-https-5e78017f482a/">Simple Site Hosting with Amazon S3 and HTTPS</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/aws-sysops-adminstrator-associate-certification-exam-course/">Pass the AWS SysOps Administrator Associate Exam With This Free 14-Hour Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ultimate-dynamodb-2020-cheatsheet/">DynamoDB Cheatsheet – Everything you need to know about Amazon Dynamo DB for the 2020 AWS Certified Developer Associate Certification</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/pass-the-aws-developer-associate-exam-with-this-free-16-hour-course/">Pass the AWS Developer Associate Exam With This Free 16-Hour Course</a></li>
</ul>
<h3 id="heading-google-cloud-platform-gcp">Google Cloud Platform (GCP)</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/google-cloud-platform-from-zero-to-hero/">Google Cloud Platform Tutorial: From Zero to Hero with GCP</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-create-and-connect-to-google-cloud-virtual-machine-with-ssh-81a68b8f74dd/">How to Create and Connect to Google Cloud Virtual Machine with SSH</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-pass-almost-every-google-cloud-professional-certification-exam/">How to Pass Almost Every Google Cloud Platform Professional Certification Exam</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-setup-laravel-6-on-google-cloud-run-with-continuous-integration-ci-step-by-step/">How to Run Laravel on Google Cloud Run with Continuous Integration - a Step by Step Guide</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-perform-crud-operations-using-blazor-and-google-cloud-firestore-52890b06e2f8/">How to perform CRUD operations using Blazor and Google Cloud Firestore</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/the-firestore-tutorial-for-2020-learn-by-example/">The JavaScript + Firestore Tutorial for 2020: Learn by Example</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/firestoreliving/">Firestore: How to Stay Within the Limits of Firebase's New Database Free Tier</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-an-instagram-clone-with-react-native-firebase-firestore-redux-and-expo/">Build an Instagram Clone with React Native, Firebase Firestore, Redux, and Expo</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-get-started-with-firebase-using-python/">How to Get Started with Firebase Using Python</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-add-authentication-to-a-vue-app-using-firebase/">How to Add Authentication to a Vue App Using Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-an-android-app-with-firebase-and-kotlin/">How to Build an Android App with Firebase and Kotlin</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/authenticate-users-and-save-data-in-a-database-using-firebase/">How to Authenticate Users And Save Data in a Database Using Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/google-login-with-react-native-and-firebase/">How to Set Up Google Login in React Native &amp; Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-a-todo-application-using-reactjs-and-firebase/">How to Build a TodoApp Using ReactJS and Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-build-an-event-booking-app-using-html-css-javascript-and-firebase/">How to Build an Event Booking App Using HTML, CSS, JavaScript, and Firebase</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/netlify-functions-firebase-and-graphql-working-together-at-last/">How I Got Netlify Functions, Firebase, and GraphQL to Work Together At Last</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/you-cant-get-there-from-here-how-netlify-lambda-and-firebase-led-me-to-a-serverless-dead-end/">You Can't Get There from Here: How Netlify Lambda and Firebase Led Me to a Serverless Dead End</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/evernote-clone-react-firebase-tutorial/">Build an Evernote clone using React and Firebase (Video Tutorial)</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/react-firebase-social-media-app-course/">Learn How to Create a Social Media App from Scratch Using React, Firebase, Redux, and Express</a></li>
</ul>
<h3 id="heading-microsoft-azure">Microsoft Azure</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/getting-started-with-microsoft-azure/">How to Get Started with Microsoft Azure - Function Apps, HTTP Triggers, and Event Queues</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/introduction-to-azure-function-proxies/">A Quick Introduction to Azure Function Proxies</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/making-sense-of-azure-durable-functions/">Making Sense of Azure Durable Functions</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-introduction-to-azure-durable-functions-patterns-and-best-practices-b1939ae6c717/">An Introduction to Azure Durable Functions: Patterns and Best Practices</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-implement-azure-serverless-with-blazor-web-assembly/">How to Implement Azure Serverless with Blazor WebAssembly</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-azure-functions-to-process-high-throughput-messages-996d05d4ab23/">How to Use Azure Functions to Process High Throughput Messages</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/azure-fundamentals-course-az900/">Azure Fundamentals Certification (AZ-900) – Pass the Exam With This Free 3-Hour Course</a></li>
</ul>
<h2 id="heading-how-to-learn-devops">How to Learn DevOps</h2>
<p>Now that you know virtualization, containerization, and cloud computing, it's time to take things to the next level.</p>
<p>DevOps is equal parts software development and IT operations. If you're involved in DevOps, not only can you build an application, but you can spin up the VMs, deploy the app, monitor the servers, and scale the app and resources as more people start using it.</p>
<p>There's a lot to cover, and these articles should get you started on your DevOps path.</p>
<h3 id="heading-general-devops">General DevOps</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/2019-web-developer-roadmap/">The 2020 Web Developer Roadmap – A Visual Guide to Becoming a Front End, Back End, or DevOps Developer</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-your-startups-cloud-more-stable-4-practical-devops-tips-823e4202518c/">How to Make Your Startup’s Cloud More Stable: 4 Practical DevOps Tips</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/docker-devops-course/">Learn DevOps Basics with This Free 2-hour Docker Course</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/devops-prerequisites-course/">Want to learn DevOps? This Free 3-Hour Course will Teach You the Prerequisites to Get Started</a></li>
</ul>
<h3 id="heading-travis-ci">Travis CI</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-stop-errors-before-they-ever-hit-your-codebase-with-travis-ci-and-eslint-7a5a6b1fcd4a/">How to Stop Errors Before They Ever Hit Your Codebase with Travis CI and ESLint</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/learn-how-to-automate-deployment-on-github-pages-with-travis-ci/">How to Automate Deployment on GitHub-Pages with Travis CI</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/advanced-automatic-deployment-with-travis-ci-1da32f7930ce/">How to Set Up Advanced Automatic Deployment with Travis CI</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-wire-travis-ci-to-do-the-heavy-lifting-in-your-workflow-72693c855696/">How to Use Travis CI and GitHub for Your Web Development Workflow’s Heavy Lifting</a></li>
</ul>
<h3 id="heading-jenkins">Jenkins</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/you-rang-mlord-docker-in-docker-with-jenkins-declarative-pipelines/">You Rang, M'Lord? Docker in Docker with Jenkins Declarative Pipelines</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-make-an-ios-on-demand-build-system-with-jenkins-and-fastlane-8eb1e02c73d1/">How to Make an iOS On-demand Build System with Jenkins and Fastlane</a></li>
</ul>
<h3 id="heading-gocd">GoCD</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-integrate-dangerjs-into-gocd-pipelines-7f930932ea07/">How to Integrate DangerJS into GoCD Pipelines</a></li>
</ul>
<h3 id="heading-ansible">Ansible</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/ansible-manage-aws/">How to Use Ansible to Manage Your AWS Resources</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/why-you-might-need-ansible-and-not-even-know-it-d33b6e4b2ebe/">Why You Might Need Ansible and Not Even Know It</a></li>
</ul>
<h3 id="heading-chef">Chef</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/an-introduction-to-chef-and-infrastructure-as-code-7d8ad2689b8/">A Complete Beginner’s Guide to Chef and Infrastructure As Code</a></li>
</ul>
<h3 id="heading-kafka">Kafka</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-implement-the-change-data-capture-pattern-using-kafka-streams/">How to Implement Change Data Capture Using Kafka Streams</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-to-consider-for-painless-apache-kafka-integration-df559e828876/">What to Consider for Painless Apache Kafka Integration</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-ingest-data-into-neo4j-from-a-kafka-stream-a34f574f5655/">How to Ingest Data into Neo4j from a Kafka Stream</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/simple-chatops-with-kafka-grafana-prometheus-and-slack-764ece59e707/">How to Build a Aimple Chatops Bot with Kafka, Grafana, Prometheus, and Slack</a></li>
</ul>
<h3 id="heading-terraform">Terraform</h3>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/terraform-workflow-working-individually-and-in-a-team/">Terraform Workflow: How to Work Individually and in a Team</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/terraform-modules-explained/">What Are Terraform Modules and How Do They Work?</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-use-terraform-to-automate-your-aws-cloud-infrastructure-tutorial/">How to Use Terraform to Automate Your AWS Cloud Infrastructure – Tutorial</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-extend-your-aws-infrastructure/">How to Extend Your AWS Infrastructure with Direct Connect Using Terraform</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-manage-wavefront-resources-using-terraform/">How to Manage Wavefront Resources Using Terraform</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/build-a-screenshot-capture-api-using-terraform-aws-api-gateway-and-aws-lambda/">How to Build a Screenshot Capture API Using Terraform, AWS API Gateway, and AWS Lambda</a></li>
</ul>
<h2 id="heading-in-closing">In Closing</h2>
<p>Thanks for reading this far. If you found this compilation of resources helpful, share it with your friends so they can learn something, too.</p>
<p>Was there an article or video tutorial you liked? Did I miss anything? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ASCII Table – Hex to ASCII Value Character Code Chart ]]>
                </title>
                <description>
                    <![CDATA[ As a developer, you'll eventually need to look up hex or ASCII values and see what they translate to. You might also need to know what the decimal, binary, or HTML values are, too. If you search for these codes online, you'll often find tables that a... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/ascii-table-hex-to-ascii-value-character-code-chart-2/</link>
                <guid isPermaLink="false">66ac87eb59c54e72c773090e</guid>
                
                    <category>
                        <![CDATA[ ascii ]]>
                    </category>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Thu, 11 Mar 2021 17:26:37 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/60484fb6a7946308b7685892.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As a developer, you'll eventually need to look up hex or ASCII values and see what they translate to. You might also need to know what the decimal, binary, or HTML values are, too.</p>
<p>If you search for these codes online, you'll often find tables that are really just images. These are inaccessible to people with disabilities, and inconvenient to use – you can't search for something and copy-paste code you want.</p>
<p>To make your life easier, I created a table from the best sources I could find. Just scroll or use Ctrl/Cmd + f to find the value you're looking for.</p>
<p>Here's the traditional ASCII table:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Decimal</td><td>Hex</td><td>Binary</td><td>HTML Number</td><td>HTML Name</td><td>Character</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>00</td><td>00000000</td><td><code>&amp;#0;</code></td><td></td><td>NUL</td><td>Null</td></tr>
<tr>
<td>1</td><td>01</td><td>00000001</td><td><code>&amp;#1;</code></td><td></td><td>SOH</td><td>Start of Header</td></tr>
<tr>
<td>2</td><td>02</td><td>00000010</td><td><code>&amp;#2;</code></td><td></td><td>STX</td><td>Start of Text</td></tr>
<tr>
<td>3</td><td>03</td><td>00000011</td><td><code>&amp;#3;</code></td><td></td><td>ETX</td><td>End of Text</td></tr>
<tr>
<td>4</td><td>04</td><td>00000100</td><td><code>&amp;#4;</code></td><td></td><td>EOT</td><td>End of Transmission</td></tr>
<tr>
<td>5</td><td>05</td><td>00000101</td><td><code>&amp;#5;</code></td><td></td><td>ENQ</td><td>Enquiry</td></tr>
<tr>
<td>6</td><td>06</td><td>00000110</td><td><code>&amp;#6;</code></td><td></td><td>ACK</td><td>Acknowledge</td></tr>
<tr>
<td>7</td><td>07</td><td>00000111</td><td><code>&amp;#7;</code></td><td></td><td>BEL</td><td>Bell</td></tr>
<tr>
<td>8</td><td>08</td><td>00001000</td><td><code>&amp;#8;</code></td><td></td><td>BS</td><td>Backspace</td></tr>
<tr>
<td>9</td><td>09</td><td>00001001</td><td><code>&amp;#9;</code></td><td></td><td>HT</td><td>Horizontal Tab</td></tr>
<tr>
<td>10</td><td>0A</td><td>00001010</td><td><code>&amp;#10;</code></td><td></td><td>LF</td><td>Newline / Line Feed</td></tr>
<tr>
<td>11</td><td>0B</td><td>00001011</td><td><code>&amp;#11;</code></td><td></td><td>VT</td><td>Vertical Tab</td></tr>
<tr>
<td>12</td><td>0C</td><td>00001100</td><td><code>&amp;#12;</code></td><td></td><td>FF</td><td>Form Feed</td></tr>
<tr>
<td>13</td><td>0D</td><td>00001101</td><td><code>&amp;#13;</code></td><td></td><td>CR</td><td>Carriage Return</td></tr>
<tr>
<td>14</td><td>0E</td><td>00001110</td><td><code>&amp;#14;</code></td><td></td><td>SO</td><td>Shift Out</td></tr>
<tr>
<td>15</td><td>0F</td><td>00001111</td><td><code>&amp;#15;</code></td><td></td><td>SI</td><td>Shift In</td></tr>
<tr>
<td>16</td><td>10</td><td>00010000</td><td><code>&amp;#16;</code></td><td></td><td>DLE</td><td>Data Link Escape</td></tr>
<tr>
<td>17</td><td>11</td><td>00010001</td><td><code>&amp;#17;</code></td><td></td><td>DC1</td><td>Device Control 1</td></tr>
<tr>
<td>18</td><td>12</td><td>00010010</td><td><code>&amp;#18;</code></td><td></td><td>DC2</td><td>Device Control 2</td></tr>
<tr>
<td>19</td><td>13</td><td>00010011</td><td><code>&amp;#19;</code></td><td></td><td>DC3</td><td>Device Control 3</td></tr>
<tr>
<td>20</td><td>14</td><td>00010100</td><td><code>&amp;#20;</code></td><td></td><td>DC4</td><td>Device Control 4</td></tr>
<tr>
<td>21</td><td>15</td><td>00010101</td><td><code>&amp;#21;</code></td><td></td><td>NAK</td><td>Negative Acknowledge</td></tr>
<tr>
<td>22</td><td>16</td><td>00010110</td><td><code>&amp;#22;</code></td><td></td><td>SYN</td><td>Synchronize</td></tr>
<tr>
<td>23</td><td>17</td><td>00010111</td><td><code>&amp;#23;</code></td><td></td><td>ETB</td><td>End of Transmission Block</td></tr>
<tr>
<td>24</td><td>18</td><td>00011000</td><td><code>&amp;#24;</code></td><td></td><td>CAN</td><td>Cancel</td></tr>
<tr>
<td>25</td><td>19</td><td>00011001</td><td><code>&amp;#25;</code></td><td></td><td>EM</td><td>End of Medium</td></tr>
<tr>
<td>26</td><td>1A</td><td>00011010</td><td><code>&amp;#26;</code></td><td></td><td>SUB</td><td>Substitute</td></tr>
<tr>
<td>27</td><td>1B</td><td>00011011</td><td><code>&amp;#27;</code></td><td></td><td>ESC</td><td>Escape</td></tr>
<tr>
<td>28</td><td>1C</td><td>00011100</td><td><code>&amp;#28;</code></td><td></td><td>FS</td><td>File Separator</td></tr>
<tr>
<td>29</td><td>1D</td><td>00011101</td><td><code>&amp;#29;</code></td><td></td><td>GS</td><td>Group Separator</td></tr>
<tr>
<td>30</td><td>1E</td><td>00011110</td><td><code>&amp;#30;</code></td><td></td><td>RS</td><td>Record Separator</td></tr>
<tr>
<td>31</td><td>1F</td><td>00011111</td><td><code>&amp;#31;</code></td><td></td><td>US</td><td>Unit Separator</td></tr>
<tr>
<td>32</td><td>20</td><td>00100000</td><td><code>&amp;#32;</code></td><td></td><td>SP</td><td>Space</td></tr>
<tr>
<td>33</td><td>21</td><td>00100001</td><td><code>&amp;#33;</code></td><td></td><td>!</td><td>Exclamation mark</td></tr>
<tr>
<td>34</td><td>22</td><td>00100010</td><td><code>&amp;#34;</code></td><td><code>&amp;quot;</code></td><td>"</td><td>Double quote</td></tr>
<tr>
<td>35</td><td>23</td><td>00100011</td><td><code>&amp;#35;</code></td><td></td><td>#</td><td>Number</td></tr>
<tr>
<td>36</td><td>24</td><td>00100100</td><td><code>&amp;#36;</code></td><td></td><td>$</td><td>Dollar</td></tr>
<tr>
<td>37</td><td>25</td><td>00100101</td><td><code>&amp;#37;</code></td><td></td><td>%</td><td>Percent</td></tr>
<tr>
<td>38</td><td>26</td><td>00100110</td><td><code>&amp;#38;</code></td><td><code>&amp;amp;</code></td><td>&amp;</td><td>Ampersand</td></tr>
<tr>
<td>39</td><td>27</td><td>00100111</td><td><code>&amp;#39;</code></td><td></td><td>'</td><td>Single quote</td></tr>
<tr>
<td>40</td><td>28</td><td>00101000</td><td><code>&amp;#40;</code></td><td></td><td>(</td><td>Left parenthesis</td></tr>
<tr>
<td>41</td><td>29</td><td>00101001</td><td><code>&amp;#41;</code></td><td></td><td>)</td><td>Right parenthesis</td></tr>
<tr>
<td>42</td><td>2A</td><td>00101010</td><td><code>&amp;#42;</code></td><td></td><td>*</td><td>Asterisk</td></tr>
<tr>
<td>43</td><td>2B</td><td>00101011</td><td><code>&amp;#43;</code></td><td></td><td>+</td><td>Plus</td></tr>
<tr>
<td>44</td><td>2C</td><td>00101100</td><td><code>&amp;#44;</code></td><td></td><td>,</td><td>Comma</td></tr>
<tr>
<td>45</td><td>2D</td><td>00101101</td><td><code>&amp;#45;</code></td><td></td><td>-</td><td>Minus</td></tr>
<tr>
<td>46</td><td>2E</td><td>00101110</td><td><code>&amp;#46;</code></td><td></td><td>.</td><td>Period</td></tr>
<tr>
<td>47</td><td>2F</td><td>00101111</td><td><code>&amp;#47;</code></td><td></td><td>/</td><td>Slash</td></tr>
<tr>
<td>48</td><td>30</td><td>00110000</td><td><code>&amp;#48;</code></td><td></td><td>0</td><td>Zero</td></tr>
<tr>
<td>49</td><td>31</td><td>00110001</td><td><code>&amp;#49;</code></td><td></td><td>1</td><td>One</td></tr>
<tr>
<td>50</td><td>32</td><td>00110010</td><td><code>&amp;#50;</code></td><td></td><td>2</td><td>Two</td></tr>
<tr>
<td>51</td><td>33</td><td>00110011</td><td><code>&amp;#51;</code></td><td></td><td>3</td><td>Three</td></tr>
<tr>
<td>52</td><td>34</td><td>00110100</td><td><code>&amp;#52;</code></td><td></td><td>4</td><td>Four</td></tr>
<tr>
<td>53</td><td>35</td><td>00110101</td><td><code>&amp;#53;</code></td><td></td><td>5</td><td>Five</td></tr>
<tr>
<td>54</td><td>36</td><td>00110110</td><td><code>&amp;#54;</code></td><td></td><td>6</td><td>Six</td></tr>
<tr>
<td>55</td><td>37</td><td>00110111</td><td><code>&amp;#55;</code></td><td></td><td>7</td><td>Seven</td></tr>
<tr>
<td>56</td><td>38</td><td>00111000</td><td><code>&amp;#56;</code></td><td></td><td>8</td><td>Eight</td></tr>
<tr>
<td>57</td><td>39</td><td>00111001</td><td><code>&amp;#57;</code></td><td></td><td>9</td><td>Nine</td></tr>
<tr>
<td>58</td><td>3A</td><td>00111010</td><td><code>&amp;#58;</code></td><td></td><td>:</td><td>Colon</td></tr>
<tr>
<td>59</td><td>3B</td><td>00111011</td><td><code>&amp;#59;</code></td><td></td><td>;</td><td>Semicolon</td></tr>
<tr>
<td>60</td><td>3C</td><td>00111100</td><td><code>&amp;#60;</code></td><td><code>&amp;lt;</code></td><td>&lt;</td><td>Less than</td></tr>
<tr>
<td>61</td><td>3D</td><td>00111101</td><td><code>&amp;#61;</code></td><td></td><td>=</td><td>Equal sign</td></tr>
<tr>
<td>62</td><td>3E</td><td>00111110</td><td><code>&amp;#62;</code></td><td><code>&amp;gt;</code></td><td>&gt;</td><td>Greater than</td></tr>
<tr>
<td>63</td><td>3F</td><td>00111111</td><td><code>&amp;#63;</code></td><td></td><td>?</td><td>Question mark</td></tr>
<tr>
<td>64</td><td>40</td><td>01000000</td><td><code>&amp;#64;</code></td><td></td><td>@</td><td>At sign</td></tr>
<tr>
<td>65</td><td>41</td><td>01000001</td><td><code>&amp;#65;</code></td><td></td><td>A</td><td>Uppercase A</td></tr>
<tr>
<td>66</td><td>42</td><td>01000010</td><td><code>&amp;#66;</code></td><td></td><td>B</td><td>Uppercase B</td></tr>
<tr>
<td>67</td><td>43</td><td>01000011</td><td><code>&amp;#67;</code></td><td></td><td>C</td><td>Uppercase C</td></tr>
<tr>
<td>68</td><td>44</td><td>01000100</td><td><code>&amp;#68;</code></td><td></td><td>D</td><td>Uppercase D</td></tr>
<tr>
<td>69</td><td>45</td><td>01000101</td><td><code>&amp;#69;</code></td><td></td><td>E</td><td>Uppercase E</td></tr>
<tr>
<td>70</td><td>46</td><td>01000110</td><td><code>&amp;#70;</code></td><td></td><td>F</td><td>Uppercase F</td></tr>
<tr>
<td>71</td><td>47</td><td>01000111</td><td><code>&amp;#71;</code></td><td></td><td>G</td><td>Uppercase G</td></tr>
<tr>
<td>72</td><td>48</td><td>01001000</td><td><code>&amp;#72;</code></td><td></td><td>H</td><td>Uppercase H</td></tr>
<tr>
<td>73</td><td>49</td><td>01001001</td><td><code>&amp;#73;</code></td><td></td><td>I</td><td>Uppercase I</td></tr>
<tr>
<td>74</td><td>4A</td><td>01001010</td><td><code>&amp;#74;</code></td><td></td><td>J</td><td>Uppercase J</td></tr>
<tr>
<td>75</td><td>4B</td><td>01001011</td><td><code>&amp;#75;</code></td><td></td><td>K</td><td>Uppercase K</td></tr>
<tr>
<td>76</td><td>4C</td><td>01001100</td><td><code>&amp;#76;</code></td><td></td><td>L</td><td>Uppercase L</td></tr>
<tr>
<td>77</td><td>4D</td><td>01001101</td><td><code>&amp;#77;</code></td><td></td><td>M</td><td>Uppercase M</td></tr>
<tr>
<td>78</td><td>4E</td><td>01001110</td><td><code>&amp;#78;</code></td><td></td><td>N</td><td>Uppercase N</td></tr>
<tr>
<td>79</td><td>4F</td><td>01001111</td><td><code>&amp;#79;</code></td><td></td><td>O</td><td>Uppercase O</td></tr>
<tr>
<td>80</td><td>50</td><td>01010000</td><td><code>&amp;#80;</code></td><td></td><td>P</td><td>Uppercase P</td></tr>
<tr>
<td>81</td><td>51</td><td>01010001</td><td><code>&amp;#81;</code></td><td></td><td>Q</td><td>Uppercase Q</td></tr>
<tr>
<td>82</td><td>52</td><td>01010010</td><td><code>&amp;#82;</code></td><td></td><td>R</td><td>Uppercase R</td></tr>
<tr>
<td>83</td><td>53</td><td>01010011</td><td><code>&amp;#83;</code></td><td></td><td>S</td><td>Uppercase S</td></tr>
<tr>
<td>84</td><td>54</td><td>01010100</td><td><code>&amp;#84;</code></td><td></td><td>T</td><td>Uppercase T</td></tr>
<tr>
<td>85</td><td>55</td><td>01010101</td><td><code>&amp;#85;</code></td><td></td><td>U</td><td>Uppercase U</td></tr>
<tr>
<td>86</td><td>56</td><td>01010110</td><td><code>&amp;#86;</code></td><td></td><td>V</td><td>Uppercase V</td></tr>
<tr>
<td>87</td><td>57</td><td>01010111</td><td><code>&amp;#87;</code></td><td></td><td>W</td><td>Uppercase W</td></tr>
<tr>
<td>88</td><td>58</td><td>01011000</td><td><code>&amp;#88;</code></td><td></td><td>X</td><td>Uppercase X</td></tr>
<tr>
<td>89</td><td>59</td><td>01011001</td><td><code>&amp;#89;</code></td><td></td><td>Y</td><td>Uppercase Y</td></tr>
<tr>
<td>90</td><td>5A</td><td>01011010</td><td><code>&amp;#90;</code></td><td></td><td>Z</td><td>Uppercase Z</td></tr>
<tr>
<td>91</td><td>5B</td><td>01011011</td><td><code>&amp;#91;</code></td><td></td><td>[</td><td>Left square bracket</td></tr>
<tr>
<td>92</td><td>5C</td><td>01011100</td><td><code>&amp;#92;</code></td><td></td><td>\</td><td>backslash</td></tr>
<tr>
<td>93</td><td>5D</td><td>01011101</td><td><code>&amp;#93;</code></td><td></td><td>]</td><td>Right square bracket</td></tr>
<tr>
<td>94</td><td>5E</td><td>01011110</td><td><code>&amp;#94;</code></td><td></td><td>^</td><td>Caret / circumflex</td></tr>
<tr>
<td>95</td><td>5F</td><td>01011111</td><td><code>&amp;#95;</code></td><td></td><td>_</td><td>Underscore</td></tr>
<tr>
<td>96</td><td>60</td><td>01100000</td><td><code>&amp;#96;</code></td><td></td><td>`</td><td>Grave / accent</td></tr>
<tr>
<td>97</td><td>61</td><td>01100001</td><td><code>&amp;#97;</code></td><td></td><td>a</td><td>Lowercase a</td></tr>
<tr>
<td>98</td><td>62</td><td>01100010</td><td><code>&amp;#98;</code></td><td></td><td>b</td><td>Lowercase b</td></tr>
<tr>
<td>99</td><td>63</td><td>01100011</td><td><code>&amp;#99;</code></td><td></td><td>c</td><td>Lowercase c</td></tr>
<tr>
<td>100</td><td>64</td><td>01100100</td><td><code>&amp;#100;</code></td><td></td><td>d</td><td>Lowercase d</td></tr>
<tr>
<td>101</td><td>65</td><td>01100101</td><td><code>&amp;#101;</code></td><td></td><td>e</td><td>Lowercase e</td></tr>
<tr>
<td>102</td><td>66</td><td>01100110</td><td><code>&amp;#102;</code></td><td></td><td>f</td><td>Lowercase</td></tr>
<tr>
<td>103</td><td>67</td><td>01100111</td><td><code>&amp;#103;</code></td><td></td><td>g</td><td>Lowercase g</td></tr>
<tr>
<td>104</td><td>68</td><td>01101000</td><td><code>&amp;#104;</code></td><td></td><td>h</td><td>Lowercase h</td></tr>
<tr>
<td>105</td><td>69</td><td>01101001</td><td><code>&amp;#105;</code></td><td></td><td>i</td><td>Lowercase i</td></tr>
<tr>
<td>106</td><td>6A</td><td>01101010</td><td><code>&amp;#106;</code></td><td></td><td>j</td><td>Lowercase j</td></tr>
<tr>
<td>107</td><td>6B</td><td>01101011</td><td><code>&amp;#107;</code></td><td></td><td>k</td><td>Lowercase k</td></tr>
<tr>
<td>108</td><td>6C</td><td>01101100</td><td><code>&amp;#108;</code></td><td></td><td>l</td><td>Lowercase l</td></tr>
<tr>
<td>109</td><td>6D</td><td>01101101</td><td><code>&amp;#109;</code></td><td></td><td>m</td><td>Lowercase m</td></tr>
<tr>
<td>110</td><td>6E</td><td>01101110</td><td><code>&amp;#110;</code></td><td></td><td>n</td><td>Lowercase n</td></tr>
<tr>
<td>111</td><td>6F</td><td>01101111</td><td><code>&amp;#111;</code></td><td></td><td>o</td><td>Lowercase o</td></tr>
<tr>
<td>112</td><td>70</td><td>01110000</td><td><code>&amp;#112;</code></td><td></td><td>p</td><td>Lowercase p</td></tr>
<tr>
<td>113</td><td>71</td><td>01110001</td><td><code>&amp;#113;</code></td><td></td><td>q</td><td>Lowercase q</td></tr>
<tr>
<td>114</td><td>72</td><td>01110010</td><td><code>&amp;#114;</code></td><td></td><td>r</td><td>Lowercase r</td></tr>
<tr>
<td>115</td><td>73</td><td>01110011</td><td><code>&amp;#115;</code></td><td></td><td>s</td><td>Lowercase s</td></tr>
<tr>
<td>116</td><td>74</td><td>01110100</td><td><code>&amp;#116;</code></td><td></td><td>t</td><td>Lowercase t</td></tr>
<tr>
<td>117</td><td>75</td><td>01110101</td><td><code>&amp;#117;</code></td><td></td><td>u</td><td>Lowercase u</td></tr>
<tr>
<td>118</td><td>76</td><td>01110110</td><td><code>&amp;#118;</code></td><td></td><td>v</td><td>Lowercase v</td></tr>
<tr>
<td>119</td><td>77</td><td>01110111</td><td><code>&amp;#119;</code></td><td></td><td>w</td><td>Lowercase w</td></tr>
<tr>
<td>120</td><td>78</td><td>01111000</td><td><code>&amp;#120;</code></td><td></td><td>x</td><td>Lowercase x</td></tr>
<tr>
<td>121</td><td>79</td><td>01111001</td><td><code>&amp;#121;</code></td><td></td><td>y</td><td>Lowercase y</td></tr>
<tr>
<td>122</td><td>7A</td><td>01111010</td><td><code>&amp;#122;</code></td><td></td><td>z</td><td>Lowercase z</td></tr>
<tr>
<td>123</td><td>7B</td><td>01111011</td><td><code>&amp;#123;</code></td><td></td><td>{</td><td>Left curly bracket</td></tr>
<tr>
<td>124</td><td>7C</td><td>01111100</td><td><code>&amp;#124;</code></td><td></td><td>\</td><td></td><td>Vertical bar</td></tr>
<tr>
<td>125</td><td>7D</td><td>01111101</td><td><code>&amp;#125;</code></td><td></td><td>}</td><td>Right curly bracket</td></tr>
<tr>
<td>126</td><td>7E</td><td>01111110</td><td><code>&amp;#126;</code></td><td></td><td>~</td><td>Tilde</td></tr>
<tr>
<td>127</td><td>7F</td><td>01111111</td><td><code>&amp;#127;</code></td><td></td><td>DEL</td><td>Delete</td></tr>
</tbody>
</table>
</div><p>And here's the extended ASCII table for the web:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Decimal</td><td>Hex</td><td>Binary</td><td>HTML Number</td><td>HTML Name</td><td>Character</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td>128</td><td>80</td><td>10000000</td><td><code>&amp;#128;</code></td><td><code>&amp;euro;</code></td><td>€</td><td>Euro sign</td></tr>
<tr>
<td>129</td><td>81</td><td>10000001</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>130</td><td>82</td><td>10000010</td><td><code>&amp;#130;</code></td><td><code>&amp;sbquo;</code></td><td>‚</td><td>Single low-9 quotation mark</td></tr>
<tr>
<td>131</td><td>83</td><td>10000011</td><td><code>&amp;#131;</code></td><td><code>&amp;fnof;</code></td><td>ƒ</td><td>Latin small letter f with hook</td></tr>
<tr>
<td>132</td><td>84</td><td>10000100</td><td><code>&amp;#132;</code></td><td><code>&amp;bdquo;</code></td><td>„</td><td>Double low-9 quotation mark</td></tr>
<tr>
<td>133</td><td>85</td><td>10000101</td><td><code>&amp;#133;</code></td><td><code>&amp;hellip;</code></td><td>…</td><td>Horizontal ellipsis</td></tr>
<tr>
<td>134</td><td>86</td><td>10000110</td><td><code>&amp;#134;</code></td><td><code>&amp;dagger;</code></td><td>†</td><td>Dagger</td></tr>
<tr>
<td>135</td><td>87</td><td>10000111</td><td><code>&amp;#135;</code></td><td><code>&amp;Dagger;</code></td><td>‡</td><td>Double dagger</td></tr>
<tr>
<td>136</td><td>88</td><td>10001000</td><td><code>&amp;#136;</code></td><td><code>&amp;circ;</code></td><td>ˆ</td><td>Modifier letter circumflex accent</td></tr>
<tr>
<td>137</td><td>89</td><td>10001001</td><td><code>&amp;#137;</code></td><td><code>&amp;permil;</code></td><td>‰</td><td>Per mille sign</td></tr>
<tr>
<td>138</td><td>8A</td><td>10001010</td><td><code>&amp;#138;</code></td><td><code>&amp;Scaron;</code></td><td>Š</td><td>Latin capital letter S with caron</td></tr>
<tr>
<td>139</td><td>8B</td><td>10001011</td><td><code>&amp;#139;</code></td><td><code>&amp;lsaquo;</code></td><td>‹</td><td>Single left-pointing angle quotation</td></tr>
<tr>
<td>140</td><td>8C</td><td>10001100</td><td><code>&amp;#140;</code></td><td><code>&amp;OElig;</code></td><td>Œ</td><td>Latin capital ligature OE</td></tr>
<tr>
<td>141</td><td>8D</td><td>10001101</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>142</td><td>8E</td><td>10001110</td><td><code>&amp;#142;</code></td><td></td><td>Ž</td><td>Latin capital letter Z with caron</td></tr>
<tr>
<td>143</td><td>8F</td><td>10001111</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>144</td><td>90</td><td>10010000</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>145</td><td>91</td><td>10010001</td><td><code>&amp;#145;</code></td><td><code>&amp;lsquo;</code></td><td>‘</td><td>Left single quotation mark</td></tr>
<tr>
<td>146</td><td>92</td><td>10010010</td><td><code>&amp;#146;</code></td><td><code>&amp;rsquo;</code></td><td>’</td><td>Right single quotation mark</td></tr>
<tr>
<td>147</td><td>93</td><td>10010011</td><td><code>&amp;#147;</code></td><td><code>&amp;ldquo;</code></td><td>“</td><td>Left double quotation mark</td></tr>
<tr>
<td>148</td><td>94</td><td>10010100</td><td><code>&amp;#148;</code></td><td><code>&amp;rdquo;</code></td><td>”</td><td>Right double quotation mark</td></tr>
<tr>
<td>149</td><td>95</td><td>10010101</td><td><code>&amp;#149;</code></td><td><code>&amp;bull;</code></td><td>•</td><td>Bullet</td></tr>
<tr>
<td>150</td><td>96</td><td>10010110</td><td><code>&amp;#150;</code></td><td><code>&amp;ndash;</code></td><td>–</td><td>En dash</td></tr>
<tr>
<td>151</td><td>97</td><td>10010111</td><td><code>&amp;#151;</code></td><td><code>&amp;mdash;</code></td><td>—</td><td>Em dash</td></tr>
<tr>
<td>152</td><td>98</td><td>10011000</td><td><code>&amp;#152;</code></td><td><code>&amp;tilde;</code></td><td>˜</td><td>Small tilde</td></tr>
<tr>
<td>153</td><td>99</td><td>10011001</td><td><code>&amp;#153;</code></td><td><code>&amp;trade;</code></td><td>™</td><td>Trademark sign</td></tr>
<tr>
<td>154</td><td>9A</td><td>10011010</td><td><code>&amp;#154;</code></td><td><code>&amp;scaron;</code></td><td>š</td><td>Latin small letter S with caron</td></tr>
<tr>
<td>155</td><td>9B</td><td>10011011</td><td><code>&amp;#155;</code></td><td><code>&amp;rsaquo;</code></td><td>›</td><td>Single right-pointing angle quotation mark</td></tr>
<tr>
<td>156</td><td>9C</td><td>10011100</td><td><code>&amp;#156;</code></td><td><code>&amp;oelig;</code></td><td>œ</td><td>Latin small ligature oe</td></tr>
<tr>
<td>157</td><td>9D</td><td>10011101</td><td></td><td></td><td></td><td></td></tr>
<tr>
<td>158</td><td>9E</td><td>10011110</td><td><code>&amp;#158;</code></td><td></td><td>ž</td><td>Latin small letter z with caron</td></tr>
<tr>
<td>159</td><td>9F</td><td>10011111</td><td><code>&amp;#159;</code></td><td><code>&amp;Yuml;</code></td><td>Ÿ</td><td>Latin capital letter Y with diaeresis</td></tr>
<tr>
<td>160</td><td>A0</td><td>10100000</td><td><code>&amp;#160;</code></td><td><code>&amp;nbsp;</code></td><td>NBSP</td><td>Non-breaking space</td></tr>
<tr>
<td>161</td><td>A1</td><td>10100001</td><td><code>&amp;#161;</code></td><td><code>&amp;iexcl;</code></td><td>¡</td><td>Inverted exclamation mark</td></tr>
<tr>
<td>162</td><td>A2</td><td>10100010</td><td><code>&amp;#162;</code></td><td><code>&amp;cent;</code></td><td>¢</td><td>Cent sign</td></tr>
<tr>
<td>163</td><td>A3</td><td>10100011</td><td><code>&amp;#163;</code></td><td><code>&amp;pound;</code></td><td>£</td><td>Pound sign</td></tr>
<tr>
<td>164</td><td>A4</td><td>10100100</td><td><code>&amp;#164;</code></td><td><code>&amp;curren;</code></td><td>¤</td><td>Currency sign</td></tr>
<tr>
<td>165</td><td>A5</td><td>10100101</td><td><code>&amp;#165;</code></td><td><code>&amp;yen;</code></td><td>¥</td><td>Yen sign</td></tr>
<tr>
<td>166</td><td>A6</td><td>10100110</td><td><code>&amp;#166;</code></td><td><code>&amp;brvbar;</code></td><td>¦</td><td>Pipe, broken vertical bar</td></tr>
<tr>
<td>167</td><td>A7</td><td>10100111</td><td><code>&amp;#167;</code></td><td><code>&amp;sect;</code></td><td>§</td><td>Section sign</td></tr>
<tr>
<td>168</td><td>A8</td><td>10101000</td><td><code>&amp;#168;</code></td><td><code>&amp;uml;</code></td><td>¨</td><td>Spacing diaeresis - umlaut</td></tr>
<tr>
<td>169</td><td>A9</td><td>10101001</td><td><code>&amp;#169;</code></td><td><code>&amp;copy;</code></td><td>©</td><td>Copyright sign</td></tr>
<tr>
<td>170</td><td>AA</td><td>10101010</td><td><code>&amp;#170;</code></td><td><code>&amp;ordf;</code></td><td>ª</td><td>Feminine ordinal indicator</td></tr>
<tr>
<td>171</td><td>AB</td><td>10101011</td><td><code>&amp;#171;</code></td><td><code>&amp;laquo;</code></td><td>«</td><td>Left double angle quotes</td></tr>
<tr>
<td>172</td><td>AC</td><td>10101100</td><td><code>&amp;#172;</code></td><td><code>&amp;not;</code></td><td>¬</td><td>Not sign</td></tr>
<tr>
<td>173</td><td>AD</td><td>10101101</td><td><code>&amp;#173;</code></td><td><code>&amp;shy;</code></td><td>­</td><td>Soft hyphen</td></tr>
<tr>
<td>174</td><td>AE</td><td>10101110</td><td><code>&amp;#174;</code></td><td><code>&amp;reg;</code></td><td>®</td><td>Registered trade mark sign</td></tr>
<tr>
<td>175</td><td>AF</td><td>10101111</td><td><code>&amp;#175;</code></td><td><code>&amp;macr;</code></td><td>¯</td><td>Spacing macron - overline</td></tr>
<tr>
<td>176</td><td>B0</td><td>10110000</td><td><code>&amp;#176;</code></td><td><code>&amp;deg;</code></td><td>°</td><td>Degree sign</td></tr>
<tr>
<td>177</td><td>B1</td><td>10110001</td><td><code>&amp;#177;</code></td><td><code>&amp;plusmn;</code></td><td>±</td><td>Plus-or-minus sign</td></tr>
<tr>
<td>178</td><td>B2</td><td>10110010</td><td><code>&amp;#178;</code></td><td><code>&amp;sup2;</code></td><td>²</td><td>Superscript two - squared</td></tr>
<tr>
<td>179</td><td>B3</td><td>10110011</td><td><code>&amp;#179;</code></td><td><code>&amp;sup3;</code></td><td>³</td><td>Superscript three - cubed</td></tr>
<tr>
<td>180</td><td>B4</td><td>10110100</td><td><code>&amp;#180;</code></td><td><code>&amp;acute;</code></td><td>´</td><td>Acute accent - spacing acute</td></tr>
<tr>
<td>181</td><td>B5</td><td>10110101</td><td><code>&amp;#181;</code></td><td><code>&amp;micro;</code></td><td>µ</td><td>Micro sign</td></tr>
<tr>
<td>182</td><td>B6</td><td>10110110</td><td><code>&amp;#182;</code></td><td><code>&amp;para;</code></td><td>¶</td><td>Pilcrow sign - paragraph sign</td></tr>
<tr>
<td>183</td><td>B7</td><td>10110111</td><td><code>&amp;#183;</code></td><td><code>&amp;middot;</code></td><td>·</td><td>Middle dot - Georgian comma</td></tr>
<tr>
<td>184</td><td>B8</td><td>10111000</td><td><code>&amp;#184;</code></td><td><code>&amp;cedil;</code></td><td>¸</td><td>Spacing cedilla</td></tr>
<tr>
<td>185</td><td>B9</td><td>10111001</td><td><code>&amp;#185;</code></td><td><code>&amp;sup1;</code></td><td>¹</td><td>Superscript one</td></tr>
<tr>
<td>186</td><td>BA</td><td>10111010</td><td><code>&amp;#186;</code></td><td><code>&amp;ordm;</code></td><td>º</td><td>Masculine ordinal indicator</td></tr>
<tr>
<td>187</td><td>BB</td><td>10111011</td><td><code>&amp;#187;</code></td><td><code>&amp;raquo;</code></td><td>»</td><td>Right double angle quotes</td></tr>
<tr>
<td>188</td><td>BC</td><td>10111100</td><td><code>&amp;#188;</code></td><td><code>&amp;frac14;</code></td><td>¼</td><td>Fraction one quarter</td></tr>
<tr>
<td>189</td><td>BD</td><td>10111101</td><td><code>&amp;#189;</code></td><td><code>&amp;frac12;</code></td><td>½</td><td>Fraction one half</td></tr>
<tr>
<td>190</td><td>BE</td><td>10111110</td><td><code>&amp;#190;</code></td><td><code>&amp;frac34;</code></td><td>¾</td><td>Fraction three quarters</td></tr>
<tr>
<td>191</td><td>BF</td><td>10111111</td><td><code>&amp;#191;</code></td><td><code>&amp;iquest;</code></td><td>¿</td><td>Inverted question mark</td></tr>
<tr>
<td>192</td><td>C0</td><td>11000000</td><td><code>&amp;#192;</code></td><td><code>&amp;Agrave;</code></td><td>À</td><td>Latin capital letter A with grave</td></tr>
<tr>
<td>193</td><td>C1</td><td>11000001</td><td><code>&amp;#193;</code></td><td><code>&amp;Aacute;</code></td><td>Á</td><td>Latin capital letter A with acute</td></tr>
<tr>
<td>194</td><td>C2</td><td>11000010</td><td><code>&amp;#194;</code></td><td><code>&amp;Acirc;</code></td><td>Â</td><td>Latin capital letter A with circumflex</td></tr>
<tr>
<td>195</td><td>C3</td><td>11000011</td><td><code>&amp;#195;</code></td><td><code>&amp;Atilde;</code></td><td>Ã</td><td>Latin capital letter A with tilde</td></tr>
<tr>
<td>196</td><td>C4</td><td>11000100</td><td><code>&amp;#196;</code></td><td><code>&amp;Auml;</code></td><td>Ä</td><td>Latin capital letter A with diaeresis</td></tr>
<tr>
<td>197</td><td>C5</td><td>11000101</td><td><code>&amp;#197;</code></td><td><code>&amp;Aring;</code></td><td>Å</td><td>Latin capital letter A with ring above</td></tr>
<tr>
<td>198</td><td>C6</td><td>11000110</td><td><code>&amp;#198;</code></td><td><code>&amp;AElig;</code></td><td>Æ</td><td>Latin capital letter AE</td></tr>
<tr>
<td>199</td><td>C7</td><td>11000111</td><td><code>&amp;#199;</code></td><td><code>&amp;Ccedil;</code></td><td>Ç</td><td>Latin capital letter C with cedilla</td></tr>
<tr>
<td>200</td><td>C8</td><td>11001000</td><td><code>&amp;#200;</code></td><td><code>&amp;Egrave;</code></td><td>È</td><td>Latin capital letter E with grave</td></tr>
<tr>
<td>201</td><td>C9</td><td>11001001</td><td><code>&amp;#201;</code></td><td><code>&amp;Eacute;</code></td><td>É</td><td>Latin capital letter E with acute</td></tr>
<tr>
<td>202</td><td>CA</td><td>11001010</td><td><code>&amp;#202;</code></td><td><code>&amp;Ecirc;</code></td><td>Ê</td><td>Latin capital letter E with circumflex</td></tr>
<tr>
<td>203</td><td>CB</td><td>11001011</td><td><code>&amp;#203;</code></td><td><code>&amp;Euml;</code></td><td>Ë</td><td>Latin capital letter E with diaeresis</td></tr>
<tr>
<td>204</td><td>CC</td><td>11001100</td><td><code>&amp;#204;</code></td><td><code>&amp;Igrave;</code></td><td>Ì</td><td>Latin capital letter I with grave</td></tr>
<tr>
<td>205</td><td>CD</td><td>11001101</td><td><code>&amp;#205;</code></td><td><code>&amp;Iacute;</code></td><td>Í</td><td>Latin capital letter I with acute</td></tr>
<tr>
<td>206</td><td>CE</td><td>11001110</td><td><code>&amp;#206;</code></td><td><code>&amp;Icirc;</code></td><td>Î</td><td>Latin capital letter I with circumflex</td></tr>
<tr>
<td>207</td><td>CF</td><td>11001111</td><td><code>&amp;#207;</code></td><td><code>&amp;Iuml;</code></td><td>Ï</td><td>Latin capital letter I with diaeresis</td></tr>
<tr>
<td>208</td><td>D0</td><td>11010000</td><td><code>&amp;#208;</code></td><td><code>&amp;ETH;</code></td><td>Ð</td><td>Latin capital letter ETH</td></tr>
<tr>
<td>209</td><td>D1</td><td>11010001</td><td><code>&amp;#209;</code></td><td><code>&amp;Ntilde;</code></td><td>Ñ</td><td>Latin capital letter N with tilde</td></tr>
<tr>
<td>210</td><td>D2</td><td>11010010</td><td><code>&amp;#210;</code></td><td><code>&amp;Ograve;</code></td><td>Ò</td><td>Latin capital letter O with grave</td></tr>
<tr>
<td>211</td><td>D3</td><td>11010011</td><td><code>&amp;#211;</code></td><td><code>&amp;Oacute;</code></td><td>Ó</td><td>Latin capital letter O with acute</td></tr>
<tr>
<td>212</td><td>D4</td><td>11010100</td><td><code>&amp;#212;</code></td><td><code>&amp;Ocirc;</code></td><td>Ô</td><td>Latin capital letter O with circumflex</td></tr>
<tr>
<td>213</td><td>D5</td><td>11010101</td><td><code>&amp;#213;</code></td><td><code>&amp;Otilde;</code></td><td>Õ</td><td>Latin capital letter O with tilde</td></tr>
<tr>
<td>214</td><td>D6</td><td>11010110</td><td><code>&amp;#214;</code></td><td><code>&amp;Ouml;</code></td><td>Ö</td><td>Latin capital letter O with diaeresis</td></tr>
<tr>
<td>215</td><td>D7</td><td>11010111</td><td><code>&amp;#215;</code></td><td><code>&amp;times;</code></td><td>×</td><td>Multiplication sign</td></tr>
<tr>
<td>216</td><td>D8</td><td>11011000</td><td><code>&amp;#216;</code></td><td><code>&amp;Oslash;</code></td><td>Ø</td><td>Latin capital letter O with slash</td></tr>
<tr>
<td>217</td><td>D9</td><td>11011001</td><td><code>&amp;#217;</code></td><td><code>&amp;Ugrave;</code></td><td>Ù</td><td>Latin capital letter U with grave</td></tr>
<tr>
<td>218</td><td>DA</td><td>11011010</td><td><code>&amp;#218;</code></td><td><code>&amp;Uacute;</code></td><td>Ú</td><td>Latin capital letter U with acute</td></tr>
<tr>
<td>219</td><td>DB</td><td>11011011</td><td><code>&amp;#219;</code></td><td><code>&amp;Ucirc;</code></td><td>Û</td><td>Latin capital letter U with circumflex</td></tr>
<tr>
<td>220</td><td>DC</td><td>11011100</td><td><code>&amp;#220;</code></td><td><code>&amp;Uuml;</code></td><td>Ü</td><td>Latin capital letter U with diaeresis</td></tr>
<tr>
<td>221</td><td>DD</td><td>11011101</td><td><code>&amp;#221;</code></td><td><code>&amp;Yacute;</code></td><td>Ý</td><td>Latin capital letter Y with acute</td></tr>
<tr>
<td>222</td><td>DE</td><td>11011110</td><td><code>&amp;#222;</code></td><td><code>&amp;THORN;</code></td><td>Þ</td><td>Latin capital letter THORN</td></tr>
<tr>
<td>223</td><td>DF</td><td>11011111</td><td><code>&amp;#223;</code></td><td><code>&amp;szlig;</code></td><td>ß</td><td>Latin small letter sharp s - ess-zed</td></tr>
<tr>
<td>224</td><td>E0</td><td>11100000</td><td><code>&amp;#224;</code></td><td><code>&amp;agrave;</code></td><td>à</td><td>Latin small letter a with grave</td></tr>
<tr>
<td>225</td><td>E1</td><td>11100001</td><td><code>&amp;#225;</code></td><td><code>&amp;aacute;</code></td><td>á</td><td>Latin small letter a with acute</td></tr>
<tr>
<td>226</td><td>E2</td><td>11100010</td><td><code>&amp;#226;</code></td><td><code>&amp;acirc;</code></td><td>â</td><td>Latin small letter a with circumflex</td></tr>
<tr>
<td>227</td><td>E3</td><td>11100011</td><td><code>&amp;#227;</code></td><td><code>&amp;atilde;</code></td><td>ã</td><td>Latin small letter a with tilde</td></tr>
<tr>
<td>228</td><td>E4</td><td>11100100</td><td><code>&amp;#228;</code></td><td><code>&amp;auml;</code></td><td>ä</td><td>Latin small letter a with diaeresis</td></tr>
<tr>
<td>229</td><td>E5</td><td>11100101</td><td><code>&amp;#229;</code></td><td><code>&amp;aring;</code></td><td>å</td><td>Latin small letter a with ring above</td></tr>
<tr>
<td>230</td><td>E6</td><td>11100110</td><td><code>&amp;#230;</code></td><td><code>&amp;aelig;</code></td><td>æ</td><td>Latin small letter ae</td></tr>
<tr>
<td>231</td><td>E7</td><td>11100111</td><td><code>&amp;#231;</code></td><td><code>&amp;ccedil;</code></td><td>ç</td><td>Latin small letter c with cedilla</td></tr>
<tr>
<td>232</td><td>E8</td><td>11101000</td><td><code>&amp;#232;</code></td><td><code>&amp;egrave;</code></td><td>è</td><td>Latin small letter e with grave</td></tr>
<tr>
<td>233</td><td>E9</td><td>11101001</td><td><code>&amp;#233;</code></td><td><code>&amp;eacute;</code></td><td>é</td><td>Latin small letter e with acute</td></tr>
<tr>
<td>234</td><td>EA</td><td>11101010</td><td><code>&amp;#234;</code></td><td><code>&amp;ecirc;</code></td><td>ê</td><td>Latin small letter e with circumflex</td></tr>
<tr>
<td>235</td><td>EB</td><td>11101011</td><td><code>&amp;#235;</code></td><td><code>&amp;euml;</code></td><td>ë</td><td>Latin small letter e with diaeresis</td></tr>
<tr>
<td>236</td><td>EC</td><td>11101100</td><td><code>&amp;#236;</code></td><td><code>&amp;igrave;</code></td><td>ì</td><td>Latin small letter i with grave</td></tr>
<tr>
<td>237</td><td>ED</td><td>11101101</td><td><code>&amp;#237;</code></td><td><code>&amp;iacute;</code></td><td>í</td><td>Latin small letter i with acute</td></tr>
<tr>
<td>238</td><td>EE</td><td>11101110</td><td><code>&amp;#238;</code></td><td><code>&amp;icirc;</code></td><td>î</td><td>Latin small letter i with circumflex</td></tr>
<tr>
<td>239</td><td>EF</td><td>11101111</td><td><code>&amp;#239;</code></td><td><code>&amp;iuml;</code></td><td>ï</td><td>Latin small letter i with diaeresis</td></tr>
<tr>
<td>240</td><td>F0</td><td>11110000</td><td><code>&amp;#240;</code></td><td><code>&amp;eth;</code></td><td>ð</td><td>Latin small letter eth</td></tr>
<tr>
<td>241</td><td>F1</td><td>11110001</td><td><code>&amp;#241;</code></td><td><code>&amp;ntilde;</code></td><td>ñ</td><td>Latin small letter n with tilde</td></tr>
<tr>
<td>242</td><td>F2</td><td>11110010</td><td><code>&amp;#242;</code></td><td><code>&amp;ograve;</code></td><td>ò</td><td>Latin small letter o with grave</td></tr>
<tr>
<td>243</td><td>F3</td><td>11110011</td><td><code>&amp;#243;</code></td><td><code>&amp;oacute;</code></td><td>ó</td><td>Latin small letter o with acute</td></tr>
<tr>
<td>244</td><td>F4</td><td>11110100</td><td><code>&amp;#244;</code></td><td><code>&amp;ocirc;</code></td><td>ô</td><td>Latin small letter o with circumflex</td></tr>
<tr>
<td>245</td><td>F5</td><td>11110101</td><td><code>&amp;#245;</code></td><td><code>&amp;otilde;</code></td><td>õ</td><td>Latin small letter o with tilde</td></tr>
<tr>
<td>246</td><td>F6</td><td>11110110</td><td><code>&amp;#246;</code></td><td><code>&amp;ouml;</code></td><td>ö</td><td>Latin small letter o with diaeresis</td></tr>
<tr>
<td>247</td><td>F7</td><td>11110111</td><td><code>&amp;#247;</code></td><td><code>&amp;divide;</code></td><td>÷</td><td>Division sign</td></tr>
<tr>
<td>248</td><td>F8</td><td>11111000</td><td><code>&amp;#248;</code></td><td><code>&amp;oslash;</code></td><td>ø</td><td>Latin small letter o with slash</td></tr>
<tr>
<td>249</td><td>F9</td><td>11111001</td><td><code>&amp;#249;</code></td><td><code>&amp;ugrave;</code></td><td>ù</td><td>Latin small letter u with grave</td></tr>
<tr>
<td>250</td><td>FA</td><td>11111010</td><td><code>&amp;#250;</code></td><td><code>&amp;uacute;</code></td><td>ú</td><td>Latin small letter u with acute</td></tr>
<tr>
<td>251</td><td>FB</td><td>11111011</td><td><code>&amp;#251;</code></td><td><code>&amp;ucirc;</code></td><td>û</td><td>Latin small letter u with circumflex</td></tr>
<tr>
<td>252</td><td>FC</td><td>11111100</td><td><code>&amp;#252;</code></td><td><code>&amp;uuml;</code></td><td>ü</td><td>Latin small letter u with diaeresis</td></tr>
<tr>
<td>253</td><td>FD</td><td>11111101</td><td><code>&amp;#253;</code></td><td><code>&amp;yacute;</code></td><td>ý</td><td>Latin small letter y with acute</td></tr>
<tr>
<td>254</td><td>FE</td><td>11111110</td><td><code>&amp;#254;</code></td><td><code>&amp;thorn;</code></td><td>þ</td><td>Latin small letter thorn</td></tr>
<tr>
<td>255</td><td>FF</td><td>11111111</td><td><code>&amp;#255;</code></td><td><code>&amp;yuml;</code></td><td>ÿ</td><td>Latin small letter y with diaeresis</td></tr>
</tbody>
</table>
</div><p>Sources for both tables: <a target="_blank" href="https://en.wikipedia.org/wiki/Wikipedia:ASCII">ASCII</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a>, and <a target="_blank" href="https://www.ascii-code.com/">ASCII Code - The extended ASCII table</a></p>
<p>Note that there are several other extended ASCII tables like ISO 8859, ISO 8859-1, ISO 8859-2, and so on. The extended table above is based on Windows-1252 ASCII table, and is what web browsers used before UTF-8 was created.</p>
<p>Even though we've largely moved past ASCII and its limitations to modern character encodings like UTF-8, all of the HTML values in the tables above will still work on current browsers.</p>
<p>If you'd like to learn more about character encoding, ASCII, and unicode characters, check out <a target="_blank" href="https://www.freecodecamp.org/news/everything-you-need-to-know-about-encoding/">this article</a>.</p>
<h2 id="heading-how-to-use-ascii-characters-in-html">How to Use ASCII Characters in HTML</h2>
<p>ASCII characters can be useful for web developers, like if you need to manually insert whitespace or a special character into your HTML.</p>
<p>If you look at the tables above, you'll see that every ASCII character has an HTML entity number, and some also have an HTML entity name.</p>
<p>Each HTML entity number and name starts with an ampersand (&amp;) and ends with a semicolon (;).</p>
<p>You can use these anywhere in your HTML to reliably render that character, no matter what the a person's browser language is set to.</p>
<p>In general, it's recommended to use the HTML entity name whenever possible – they're easier to remember, and are self-descriptive for any other developers that read your code.</p>
<p>For example, if you need to render the Euro currency sign (€), the HTML entity name <code>&amp;euro;</code> is much easier to remember than <code>&amp;#128;</code>.</p>
<p>Here are some of the more common ASCII characters you'll use in HTML, along with some examples.</p>
<h3 id="heading-how-to-use-the-non-breaking-space-character-code">How to Use the <code>&amp;nbsp;</code> Non-Breaking Space Character Code</h3>
<p>There are times when you'll want to add a space, but want to keep other words or characters together, even if there's a limited amount of horizontal space.</p>
<p>An easy way to do this would be to use a non-breaking space character, for example:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Superpower:<span class="hljs-symbol">&amp;nbsp;</span>listening<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
</code></pre>
<p>Which renders the following:</p>
<p><span>Superpower:&nbsp;listening</span></p>
<p>Sure, it looks like there's a normal space between the colon and the "l" in "listening", but the <code>&amp;nbsp;</code> character makes it so that the line will never break there.</p>
<p>For example, here's that code with an outline around the <code>span</code> element, and with a width of 150 pixels:</p>
<p><span>Superpower:&nbsp;listening</span></p>
<p>With a normal space character, the line would break like this:</p>
<p><span>Superpower: listening</span></p>
<p>You can even insert several non-breaking spaces in a row to create make-shift text padding:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>Superpower:<span class="hljs-symbol">&amp;nbsp;</span><span class="hljs-symbol">&amp;nbsp;</span><span class="hljs-symbol">&amp;nbsp;</span>listening<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
</code></pre>
<h3 id="heading-how-to-make-a-newline-in-hmtl-using-the-newline-character-code">How to Make a Newline in HMTL using the <code>&amp;#13;</code> Newline Character Code</h3>
<p>While you can use JavaScript to render <code>\n</code> as a newline in HTML, that's not always an option. You might only have access to the HTML code, or just want to keep things simple.</p>
<p>In that case, you can use the newline / line feed character code to force a newline:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"margin-bottom: 1.5em;"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"example-1"</span>&gt;</span>Example 1: <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">textarea</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"example-1"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"example-1"</span>&gt;</span>Hello<span class="hljs-symbol">&amp;#10;</span>freeCodeCamp<span class="hljs-tag">&lt;/<span class="hljs-name">textarea</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Which renders the following:</p>
<div>
  Example 1: 
  
</div>


<p>And yes, you can use these back-to-back, too:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"margin-bottom: 1.5em;"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"example-2"</span>&gt;</span>Example 2: <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">textarea</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"example-2"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"example-2"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"height: 150px;"</span>&gt;</span>Hello<span class="hljs-symbol">&amp;#10;</span><span class="hljs-symbol">&amp;#10;</span><span class="hljs-symbol">&amp;#10;</span>freeCodeCamp<span class="hljs-tag">&lt;/<span class="hljs-name">textarea</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<div>
  Example 2: 
  
</div>


<p>However, note that the <code>&amp;#10;</code> character doesn't override the default styling of the element it's used in. For example, the <code>p</code> element doesn't allow line breaks within the element – you'd have to create another paragraph element:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"outline: red 1px solid;"</span>&gt;</span>This is paragraph text and <span class="hljs-symbol">&amp;#010;</span> whoops there is a new line.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
</code></pre>
<p>The code above renders everything to a single line:</p>
<p>This is paragraph text and 
 whoops there is a new line.</p>


<p>To override this behavior, just set the <code>white-space</code> property to <code>pre-wrap</code>:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"outline: red 1px solid; white-space: pre-wrap;"</span>&gt;</span>This is paragraph text and <span class="hljs-symbol">&amp;#010;</span> whoops there is a new line.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
</code></pre>
<p>This is paragraph text and 
 whoops there is a new line.</p>


<h2 id="heading-thanks-for-reading">Thanks for Reading</h2>
<p>If you found this helpful, please share it with your friends so more people can get started using ASCII characters.</p>
<p>Also, if you liked this article, let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Subnet Cheat Sheet – 24 Subnet Mask, 30, 26, 27, 29, and other IP Address CIDR Network References ]]>
                </title>
                <description>
                    <![CDATA[ As a developer or network engineer, you may need to occasionally look up subnet mask values and figure out what they mean. To make your life easier, the freeCodeCamp community has made this simple cheat sheet. Just scroll or use Ctrl/Cmd + f to find ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/subnet-cheat-sheet-24-subnet-mask-30-26-27-29-and-other-ip-address-cidr-network-references/</link>
                <guid isPermaLink="false">66ac883115af8baa725ed388</guid>
                
                    <category>
                        <![CDATA[ computer networking ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Network Engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ networking ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Fri, 12 Feb 2021 19:06:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9647740569d1a4ca10a9.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As a developer or network engineer, you may need to occasionally look up subnet mask values and figure out what they mean.</p>
<p>To make your life easier, the freeCodeCamp community has made this simple cheat sheet. Just scroll or use Ctrl/Cmd + f to find the value you're looking for.</p>
<p>Here are the charts, followed by some explanations of what they mean.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>CIDR</td><td>Subnet mask</td><td>Wildcard mask</td><td># of IP addresses</td><td># of usable IP addresses</td></tr>
</thead>
<tbody>
<tr>
<td>/32</td><td>255.255.255.255</td><td>0.0.0.0</td><td>1</td><td>1</td></tr>
<tr>
<td>/31</td><td>255.255.255.254</td><td>0.0.0.1</td><td>2</td><td>2*</td></tr>
<tr>
<td>/30</td><td>255.255.255.252</td><td>0.0.0.3</td><td>4</td><td>2</td></tr>
<tr>
<td>/29</td><td>255.255.255.248</td><td>0.0.0.7</td><td>8</td><td>6</td></tr>
<tr>
<td>/28</td><td>255.255.255.240</td><td>0.0.0.15</td><td>16</td><td>14</td></tr>
<tr>
<td>/27</td><td>255.255.255.224</td><td>0.0.0.31</td><td>32</td><td>30</td></tr>
<tr>
<td>/26</td><td>255.255.255.192</td><td>0.0.0.63</td><td>64</td><td>62</td></tr>
<tr>
<td>/25</td><td>255.255.255.128</td><td>0.0.0.127</td><td>128</td><td>126</td></tr>
<tr>
<td>/24</td><td>255.255.255.0</td><td>0.0.0.255</td><td>256</td><td>254</td></tr>
<tr>
<td>/23</td><td>255.255.254.0</td><td>0.0.1.255</td><td>512</td><td>510</td></tr>
<tr>
<td>/22</td><td>255.255.252.0</td><td>0.0.3.255</td><td>1,024</td><td>1,022</td></tr>
<tr>
<td>/21</td><td>255.255.248.0</td><td>0.0.7.255</td><td>2,048</td><td>2,046</td></tr>
<tr>
<td>/20</td><td>255.255.240.0</td><td>0.0.15.255</td><td>4,096</td><td>4,094</td></tr>
<tr>
<td>/19</td><td>255.255.224.0</td><td>0.0.31.255</td><td>8,192</td><td>8,190</td></tr>
<tr>
<td>/18</td><td>255.255.192.0</td><td>0.0.63.255</td><td>16,384</td><td>16,382</td></tr>
<tr>
<td>/17</td><td>255.255.128.0</td><td>0.0.127.255</td><td>32,768</td><td>32,766</td></tr>
<tr>
<td>/16</td><td>255.255.0.0</td><td>0.0.255.255</td><td>65,536</td><td>65,534</td></tr>
<tr>
<td>/15</td><td>255.254.0.0</td><td>0.1.255.255</td><td>131,072</td><td>131,070</td></tr>
<tr>
<td>/14</td><td>255.252.0.0</td><td>0.3.255.255</td><td>262,144</td><td>262,142</td></tr>
<tr>
<td>/13</td><td>255.248.0.0</td><td>0.7.255.255</td><td>524,288</td><td>524,286</td></tr>
<tr>
<td>/12</td><td>255.240.0.0</td><td>0.15.255.255</td><td>1,048,576</td><td>1,048,574</td></tr>
<tr>
<td>/11</td><td>255.224.0.0</td><td>0.31.255.255</td><td>2,097,152</td><td>2,097,150</td></tr>
<tr>
<td>/10</td><td>255.192.0.0</td><td>0.63.255.255</td><td>4,194,304</td><td>4,194,302</td></tr>
<tr>
<td>/9</td><td>255.128.0.0</td><td>0.127.255.255</td><td>8,388,608</td><td>8,388,606</td></tr>
<tr>
<td>/8</td><td>255.0.0.0</td><td>0.255.255.255</td><td>16,777,216</td><td>16,777,214</td></tr>
<tr>
<td>/7</td><td>254.0.0.0</td><td>1.255.255.255</td><td>33,554,432</td><td>33,554,430</td></tr>
<tr>
<td>/6</td><td>252.0.0.0</td><td>3.255.255.255</td><td>67,108,864</td><td>67,108,862</td></tr>
<tr>
<td>/5</td><td>248.0.0.0</td><td>7.255.255.255</td><td>134,217,728</td><td>134,217,726</td></tr>
<tr>
<td>/4</td><td>240.0.0.0</td><td>15.255.255.255</td><td>268,435,456</td><td>268,435,454</td></tr>
<tr>
<td>/3</td><td>224.0.0.0</td><td>31.255.255.255</td><td>536,870,912</td><td>536,870,910</td></tr>
<tr>
<td>/2</td><td>192.0.0.0</td><td>63.255.255.255</td><td>1,073,741,824</td><td>1,073,741,822</td></tr>
<tr>
<td>/1</td><td>128.0.0.0</td><td>127.255.255.255</td><td>2,147,483,648</td><td>2,147,483,646</td></tr>
<tr>
<td>/0</td><td>0.0.0.0</td><td>255.255.255.255</td><td>4,294,967,296</td><td>4,294,967,294</td></tr>
</tbody>
</table>
</div><ul>
<li>/31 is a special case detailed in <a target="_blank" href="https://tools.ietf.org/html/rfc3021">RFC 3021</a> where networks with this type of subnet mask can assign two IP addresses as a point-to-point link.</li>
</ul>
<p>And here's a table of the decimal to binary conversions for subnet mask and wildcard octets:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td>Subnet Mask</td><td></td><td>Wildcard</td></tr>
</thead>
<tbody>
<tr>
<td>0</td><td>00000000</td><td>255</td><td>11111111</td></tr>
<tr>
<td>128</td><td>10000000</td><td>127</td><td>01111111</td></tr>
<tr>
<td>192</td><td>11000000</td><td>63</td><td>00111111</td></tr>
<tr>
<td>224</td><td>11100000</td><td>31</td><td>00011111</td></tr>
<tr>
<td>240</td><td>11110000</td><td>15</td><td>00001111</td></tr>
<tr>
<td>248</td><td>11111000</td><td>7</td><td>00000111</td></tr>
<tr>
<td>252</td><td>11111100</td><td>3</td><td>00000011</td></tr>
<tr>
<td>254</td><td>11111110</td><td>1</td><td>00000001</td></tr>
<tr>
<td>255</td><td>11111111</td><td>0</td><td>00000000</td></tr>
</tbody>
</table>
</div><p>Note that the wildcard is just the inverse of the subnet mask.</p>
<p>If you are new to network engineering, you can <a target="_blank" href="https://www.freecodecamp.org/news/computer-networks-and-how-to-actually-understand-them-c1401908172d/">get a better idea of how computer networks work here</a>.</p>
<p>Finally, this cheat sheet and the rest of the article is focused on IPv4 addresses, not the newer IPv6 protocol. If you'd like to learn more about IPv6, check out the article on computer networks above.</p>
<h2 id="heading-how-do-ip-address-blocks-work">How Do IP Address Blocks Work?</h2>
<p>IPv4 addresses like <code>192.168.0.1</code> are really just decimal representations of four binary blocks.</p>
<p>Each block is 8 bits, and represents numbers from 0-255. Because the blocks are groups of 8 bits, each block is known as an <strong>octet</strong>. And since there are four blocks of 8 bits, every IPv4 address is 32 bits. </p>
<p>For example, here's what the IP address <code>172.16.254.1</code> looks like in binary:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1125px-Ipv4_address.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://en.wikipedia.org/wiki/IPv4">IPv4</a></em></p>
<p>To convert an IP address between its decimal and binary forms, you can use this chart:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>128</td><td>64</td><td>32</td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr>
</thead>
<tbody>
<tr>
<td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td></tr>
</tbody>
</table>
</div><p>The chart above represents one 8 bit octive.</p>
<p>Now lets say you want to convert the IP address <code>168.210.225.206</code>. All you need to do is break the address into four blocks (<code>168</code>, <code>210</code>, <code>225</code>, and <code>206</code>), and convert each into binary using the chart above.</p>
<p>Remember that in binary, 1 is the equivalent to "on" and 0 is "off". So to convert the first block, <code>168</code>, into binary, just start from the beginning of the chart and place a 1 or 0 in that cell until you get a sum of <code>168</code>.</p>
<p>For example:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>128</td><td>64</td><td>32</td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td></tr>
</tbody>
</table>
</div><p>128 + 32 + 8 = 168, which in binary is <code>10101000</code>.</p>
<p>If you do this for the rest of the blocks, you'd get <code>10101000.11010010.11100001.11001110</code>.</p>
<h2 id="heading-what-is-subnetting">What is Subnetting?</h2>
<p>If you look at the table above, it can seem like the number of IP addresses is practically unlimited. After all, there are almost 4.2 billion possible IPv4 addresses available.</p>
<p>But if you think about how much the internet has grown, and how many more devices are connected these days, it might not surprise you to hear that there's already a <a target="_blank" href="https://whatismyipaddress.com/ipv4-shortage">shortage of IPv4 addresses</a>.</p>
<p>Because the shortage was recognized years ago, developers came up with a way to split up an IP address into smaller networks called subnets.</p>
<p>This process, called subnetting, uses the host section of the IP address to break it down into those smaller networks or subnets.</p>
<p>Generally, an IP address is made up of network bits and host bits:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/network-and-host-bits.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://support.huawei.com/enterprise/en/doc/EDOC1100145159">What is IPv4</a></em></p>
<p>So generally, subnetting does two things: it gives us a way to break up networks into subnets, and allows devices to determine whether another device/IP address is on the same local network or not.</p>
<p>A good way to think about subnetting is to picture your wireless network at home.</p>
<p>Without subnetting, every internet connected device would need its own unique IP address.</p>
<p>But since you have a wireless router, you just need one IP address for your router. This public or external IP address is usually handled automatically, and is assigned by your internet service provider (ISP).</p>
<p>Then every device connected to that router has its own private or internal IP address:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/home-network-diagram.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://www.popularmechanics.com/technology/a32729384/how-to-find-ip-address/">What Is My IP Address?</a></em></p>
<p>Now if your device with the internal IP address <code>192.168.1.101</code> wants to communicate with another device, it'll use the IP address of the other device and the subnet mask.</p>
<p>The combination of the IP addresses and subnet mask allows the device at <code>192.168.1.101</code> to figure out if the other device is on the same network (like the device at <code>192.168.1.103</code>), or on a completely different network somewhere else online.</p>
<p>Interestingly, the external IP address assigned to your router by your ISP is probably part of a subnet, which might include many other IP addresses for nearby homes or businesses. And just like internal IP addresses, it also needs a subnet mask to work.</p>
<h3 id="heading-how-subnet-masks-work">How Subnet Masks Work</h3>
<p>Subnet masks function as a sort of filter for an IP address. With a subnet mask, devices can look at an IP address, and figure out which parts are the network bits and which are the host bits.</p>
<p>Then using those things, it can figure out the best way for those devices to communicate.</p>
<p>If you've poked around the network settings on your router or computer, you've likely seen this number: <code>255.255.255.0</code>.</p>
<p>If so, you've seen a very common subnet mask for simple home networks.</p>
<p>Like IPv4 addresses, subnet masks are 32 bits. And just like converting an IP address into binary, you can do the same thing with a subnet mask.</p>
<p>For example, here's our chart from earlier:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>128</td><td>64</td><td>32</td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr>
</thead>
<tbody>
<tr>
<td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td><td>x</td></tr>
</tbody>
</table>
</div><p>Now let's convert the first octet, 255:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>128</td><td>64</td><td>32</td><td>16</td><td>8</td><td>4</td><td>2</td><td>1</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
</tbody>
</table>
</div><p>Pretty simple, right? So any octet that's <code>255</code> is just <code>11111111</code> in binary. This means that <code>255.255.255.0</code> is really <code>11111111.11111111.11111111.00000000</code> in binary.</p>
<p>Now let's look at a subnet mask and IP address together and calculate which parts of the IP address are the network bits and host bits.</p>
<p>Here are the two in both decimal and binary:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Type</td><td>Decimal</td><td>Binary</td></tr>
</thead>
<tbody>
<tr>
<td>IP address</td><td>192.168.0.101</td><td>11000000.10101000.00000000.01100101</td></tr>
<tr>
<td>Subnet mask</td><td>255.255.255.0</td><td>11111111.11111111.11111111.00000000</td></tr>
</tbody>
</table>
</div><p>With the two laid out like this, it's easy to separate <code>192.168.0.101</code> into network bits and host bits.</p>
<p>Whenever a bit in a binary subnet mask is 1, then the same bit in a binary IP address is part of the network, not the host.</p>
<p>Since the octet <code>255</code> is <code>11111111</code> in binary, that whole octet in the IP address is part of the network. So the first three octets, <code>192.168.0</code>, is the network portion of the IP address, and <code>101</code> is the host portion.</p>
<p>In other words, if the device at <code>192.168.0.101</code> wants to communicate with another device, using the subnet mask it knows that anything with the IP address <code>192.168.0.xxx</code> is on the same local network.</p>
<p>Another way to express this is with a network ID, which is just the network portion of the IP address. So the network ID of the address <code>192.168.0.101</code> with a subnet mask of <code>255.255.255.0</code> is <code>192.168.0.0</code>.</p>
<p>And it's the same for the other devices on the local network (<code>192.168.0.102</code>, <code>192.168.0.103</code>, and so on).</p>
<h3 id="heading-what-does-cidr-mean-and-what-is-cidr-notation">What Does CIDR Mean and What is CIDR Notation?</h3>
<p><strong>CIDR</strong> stands for Classless Inter-Domain Routing, and is used in IPv4, and more recently, IPv6 routing.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/1920px-IP_Address_Match.svg.png" alt="Image" width="600" height="400" loading="lazy">
_Source: <a target="_blank" href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing">Classless Inter-Domain Routing</a>_</p>
<p>CIDR was introduced in 1993 as a way to slow the usage of IPv4 addresses, which were quickly being exhausted under the older Classful IP addressing system that the internet was first built on.</p>
<p>CIDR encompasses a couple of major concepts.</p>
<p>The first is Variable Length Submasking (VLSM), which basically allowed network engineers to create subnets within subnets. And those subnets could be different sizes, so there would be fewer unused IP addresses.</p>
<p>The second major concept CIDR introduced is CIDR notation.</p>
<p>CIDR notation is really just shorthand for the subnet mask, and represents the number of bits available to the IP address. For instance, the <code>/24</code> in <code>192.168.0.101/24</code> is equivalent to the IP address <code>192.168.0.101</code> and the subnet mask <code>255.255.255.0</code>.</p>
<h3 id="heading-how-to-calculate-cidr-noation">How to Calculate CIDR Noation</h3>
<p>To figure out the CIDR notation for a given subnet mask, all you need to do is convert the subnet mask into binary, then count the number of ones or "on" digits. For example:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Type</td><td>Decimal</td><td>Binary</td></tr>
</thead>
<tbody>
<tr>
<td>Subnet mask</td><td>255.255.255.0</td><td>11111111.11111111.11111111.00000000</td></tr>
</tbody>
</table>
</div><p>Because there's three octets of ones, there are 24 "on" bits meaning that the CIDR notation is <code>/24</code>.</p>
<p>You can write it either way, but I'm sure you'll agree that <code>/24</code> is a whole lot easier to write than <code>255.255.255.0</code>.</p>
<p>This is usually done with an IP address, so let's take a look at the same subnet mask with an IP address:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Type</td><td>Decimal</td><td>Binary</td></tr>
</thead>
<tbody>
<tr>
<td>IP address</td><td>192.168.0.101</td><td>11000000.10101000.00000000.01100101</td></tr>
<tr>
<td>Subnet mask</td><td>255.255.255.0</td><td>11111111.11111111.11111111.00000000</td></tr>
</tbody>
</table>
</div><p>The first three octets of the subnet mask are all "on" bits, so that means that the same three octets in the IP address are all network bits.</p>
<p>Let's take a look at the last forth octet in a bit more detail:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Type</td><td>Decimal</td><td>Binary</td></tr>
</thead>
<tbody>
<tr>
<td>IP address</td><td>101</td><td>01100101</td></tr>
<tr>
<td>Subnet mask</td><td>0</td><td>00000000</td></tr>
</tbody>
</table>
</div><p>In this case, because all the bits for this octet in the subnet mask are "off", we can be certain that all of the corresponding bits for this octet in the IP address are part of the host.</p>
<p>When you write CIDR notation it's usually done with the network ID. So the CIDR notation of the IP address <code>192.168.0.101</code> with a subnet mask of <code>255.255.255.0</code> is <code>192.168.0.0/24</code>.</p>
<p>To see more examples of how to calculate the CIDR notation and network ID for a given IP address and subnet mask, check out this video:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/XQ3T14SIlV4" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-classful-ip-addressing">Classful IP Addressing</h2>
<p>Now that we've gone over some basic examples of subnetting and CIDR, let's zoom out and look at what's known as Classful IP addressing.</p>
<p>Back before subnetting was developed, all IP addresses fell into a particular class:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/subnetting.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://community.spiceworks.com/networking/articles/2489-subnetting-for-dummies">Subnetting for dummies</a></em></p>
<p>Note that there are class D and E IP addresses, but we'll go into these in more detail a bit later.</p>
<p>Classful IP addresses gave network engineers a way to provide different organizations with a range of valid IP addresses.</p>
<p>There were a lot of issues with this approach that eventually lead to subnetting. But before we get into those, let's take a closer look at the different classes.</p>
<h3 id="heading-class-a-ip-addresses">Class A IP Addresses</h3>
<p>For Class A IP addresses,  the first octet (8 bits / 1 byte) represent the network ID, and the remaining three octets (24 bits / 3 bytes) are the host ID.</p>
<p>Class A IP addresses range from <code>1.0.0.0</code> to <code>127.255.255.255</code>, with a default mask of <code>255.0.0.0</code> (or <code>/8</code> in CIDR).</p>
<p>This means that Class A addressing can have a total of 128 (2<sup>7</sup>) networks and 16,777,214 (2<sup>24</sup>-2) usable addresses per network.</p>
<p>Also, note that the range <code>127.0.0.0</code> to <code>127.255.255.255</code> within the Class A range is reserved for host loopback address (see <a target="_blank" href="https://tools.ietf.org/html/rfc5735">RFC5735</a>).</p>
<h3 id="heading-class-b-ip-addresses">Class B IP Addresses</h3>
<p>For Class B IP addresses, the first two octets (16 bits / 2 bytes) represent the network ID and the remaining two octets (16 bits / 2 bytes) are the host ID.</p>
<p>Class B IP addresses range from <code>128.0.0.0</code> to <code>191.255.255.255</code>, with a default subnet mask of <code>255.255.0.0</code> (or <code>/16</code> in CIDR).</p>
<p>Class B addressing can have 16,384 (2<sup>14</sup>) network addresses and 65,534 (2<sup>16</sup>) usable addresses per network.</p>
<h3 id="heading-class-c-ip-addresses">Class C IP Addresses</h3>
<p>For Class C IP addresses, the first three octets (24 bits / 3 bytes) represent the network ID and the last octet (8 bits / 1 bytes) is the host ID.</p>
<p>Class C IP Addresses range from <code>192.0.0.0</code> to <code>223.255.255.255</code>, with a default subnet mask of <code>255.255.255.0</code> (or <code>/24</code> in CIDR).</p>
<p>Class C translates to 2,097,152 (2<sup>21</sup>) networks and 254 (2<sup>8</sup>-2) usable addresses per network.</p>
<h3 id="heading-class-d-and-class-e-ip-addresses">Class D and Class E IP Addresses</h3>
<p>The last two classes are Class D and Class E.</p>
<p>Class D IP addresses are reserved for multicasts. They occupy the range from <code>224.0.0.0</code> through <code>239.255.255.255</code>.</p>
<p>Class E IP addresses are experimental, and are anything over <code>240.0.0.0</code>.</p>
<h3 id="heading-the-issue-with-classful-ip-addresses">The Issue with Classful IP Addresses</h3>
<p>The main issue with classful IP addresses is that it wasn't efficient, and could lead to a lot of wasted IP addresses.</p>
<p>For example, imagine that you're part of a large organization back then. Your company has 1,000 employees, meaning that it would fall into class B.</p>
<p>But if you look above, you'll see that a class B network can support up to 65,534 usable addresses. That's way more than your organization would likely need, even if each employee had multiple devices with a unique address.</p>
<p>And there was no way your organization could fall back to class C – there just wouldn't be enough usable IP addresses.</p>
<p>So while classful IP addresses were used around the time IPv4 addresses became widespread, it quickly became clear that a better system would be necessary to ensure we wouldn't use up all of the ~4.2 billion usable addresses.</p>
<p>Classful IP addresses haven't been used since they were replaced by CIDR in 1993, and are mostly studied to understand early internet architecture, and why subnetting is important.</p>
<h2 id="heading-i-hope-this-cheat-sheet-has-been-a-helpful-reference-for-you">I hope this cheat sheet has been a helpful reference for you</h2>
<p>If you found this helpful, please share it with your friends so more people can benefit from it.</p>
<p>Also, feel free to reach out on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a> and let me know what you think.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A Brief History of Responsive Web Design ]]>
                </title>
                <description>
                    <![CDATA[ These days, responsive web design is something we all take for granted. When we visit a website, we expect it to work and look good on all our devices, no matter what the screen size is. But it took us a long time to get to this point, and developers... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-brief-history-of-responsive-web-design/</link>
                <guid isPermaLink="false">66ac87e46fb3204d41f5634c</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                    <category>
                        <![CDATA[ responsive design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Thu, 04 Feb 2021 09:44:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/6034711fa675540a22921aad.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>These days, responsive web design is something we all take for granted. When we visit a website, we expect it to work and look good on all our devices, no matter what the screen size is.</p>
<p>But it took us a long time to get to this point, and developers came up with a number of techniques to adapt sites to different screen sizes before settling on responsive web design.</p>
<p>In this article, we'll take a look at the early web, different ways developers would adapt a site to different screen sizes, and modern responsive design.</p>
<h2 id="heading-the-first-website">The first website</h2>
<p>On August 6, 1991, the first website ever came online. The site was created by Tim Berners-Lee, and detailed the World Wide Web (W3) project. It originally ran off of a NeXT computer at CERN, the European Organization for Nuclear Research.</p>
<p>Though the original site went offline, CERN <a target="_blank" href="https://first-website.web.cern.ch/first-website/">launched a project</a> in 2013 to "preserve some of the digital assets that are associated with the birth of the web." Everything from the original machine names, IP addresses, and URL of the first website was restored to the best of their ability.</p>
<p>While the original 1991 version of the website was lost, they were able to restore a version from 1992. If you'd like to check out yourself, it now lives at <a target="_blank" href="http://info.cern.ch/hypertext/WWW/TheProject.html">http://info.cern.ch/hypertext/WWW/TheProject.html</a>.</p>
<h2 id="heading-early-web-design">Early web design</h2>
<p>The web changed rapidly since Berners-Lee's first website went online. Every year, thousands of websites were launched, and new design techniques developed as rapidly as web technology itself.</p>
<p>In the early 90s, web design was very simple. Most websites used simple header, paragraph, and early list tags like <code>&lt;dl&gt;</code>, <code>&lt;dt&gt;</code>, and <code>&lt;dd&gt;</code> tags to organize information.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/yahoo-1994.png" alt="Image" width="600" height="400" loading="lazy">
<em>Yahoo in 1994 (<a target="_blank" href="https://www.webdesignmuseum.org/web-design-history/yahoo-1994">Source</a>)</em></p>
<p>More complex sites had to use tables to control the layout of the page, and create things like navigation and sidebars that are common today.</p>
<p>Though methods of styling websites existed in some form or another, Håkon Wium Lie first proposed CSS in 1994 while working at CERN. Then in 1996, the World Wide Web Consortium (W3C), also founded by Berners-Lee, released the first formal specification for Cascading Style Sheets, level 1 (CSS1).</p>
<p>With CSS and other technologies like JavaScript and Flash, web developers could get more creative and playful with their designs.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/internet-archive-1997.png" alt="Image" width="600" height="400" loading="lazy">
<em>Internet Archive in 1997 (<a target="_blank" href="https://www.webdesignmuseum.org/web-design-history/internet-archive-1996">Source</a>)</em></p>
<p>By the late 90s to early 2000s, patterns in web design and user experience had emerged, and websites started to look like the ones we use today:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/deviant-art-2000.png" alt="Image" width="600" height="400" loading="lazy">
<em>DeviantArt in 2000 (<a target="_blank" href="https://www.webdesignmuseum.org/web-design-history/deviantart-2000">Source</a>)</em></p>
<h2 id="heading-early-responsive-design-methods">Early responsive design methods</h2>
<p>With the wider adoption of CSS, developers had to spend a lot more time on things like layout, design, and typography. But one thing they didn't have to worry much about was adapting to different screen sizes. At the time, most people's monitors were either 640x480, 800x600, or 1024×768.</p>
<p>Still, developers found a few different ways to work with these monitor or browser window sizes, which eventually lead to responsive web design as we know it today. Let's take a look at a few of them.</p>
<h3 id="heading-liquid-layouts">Liquid layouts</h3>
<p>According to <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design">MDN</a>, the two main layout options developers had early on were either fixed-width, where content was set to an exact, to-the-pixel width, or liquid, where content was sized using percentages.</p>
<p>MDN has some good examples of both <a target="_blank" href="https://mdn.github.io/css-examples/learn/rwd/fixed-width.html">fixed-width</a> and <a target="_blank" href="https://mdn.github.io/css-examples/learn/rwd/liquid-width.html">liquid</a> layouts.</p>
<p>Liquid layouts, first coined and popularized by Glenn Davis, were revolutionary at the time, and can be considered one of the first major methods of responsive web design.</p>
<p>While fixed-width layouts might break if your monitor wasn't the same resolution as the one the site was designed on, liquid layouts were much more flexible, and could adapt to different monitor resolutions or browser sizes.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/elastic.gif" alt="Image" width="600" height="400" loading="lazy">
<em>An example of liquid design (<a target="_blank" href="https://thehistoryoftheweb.com/mostly-complete-history-layout-web-part-1-liquid-cool/">Source</a>)</em></p>
<p>But it wasn't perfect. On liquid layout sites, content could overflow and text could break on smaller screens, and on larger screens there could be a lot of unnecessary white space.</p>
<h3 id="heading-resolution-dependent-layouts">Resolution dependent layouts</h3>
<p>In 2004, Cameron Adams wrote a <a target="_blank" href="https://www.themaninblue.com/writing/perspective/2004/09/21/">blog post</a> where he detailed a method of using JavaScript to swap out different stylesheets based on the size of the browser window.</p>
<p>This technique came to be known as resolution dependent layouts, named after Adams' blog post. Even though it was a bit of extra work for developers at the time, it allowed more fine-grained control over the layout of the site, and functioned as an early version of CSS breakpoints before those were a thing.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-117.png" alt="Image" width="600" height="400" loading="lazy">
<em>Adams' example of a resolution dependent layout (<a target="_blank" href="https://www.themaninblue.com/experiment/ResolutionLayout/">Source</a>)</em></p>
<p>The downside of this method was that developers had to create different stylesheets for each target resolution, and ensure that the styling and JavaScript worked across all major browsers.</p>
<p>There were a whole lot of browsers at the time, and sometimes they handled HTML, CSS, and JavaScript differently. In fact, that's one of the major reasons that jQuery first became so popular at the time – it abstracted a lot of the browser differences away so you only had to write your code once.</p>
<h3 id="heading-mobile-subdomains">Mobile subdomains</h3>
<p>All this was happening right around the time that more mobile devices were going online. Nokia, Blackberry, and eventually, the iPhone, came with their own browsers. And suddenly developers had to come up with different ways to tailor the online experience to different screen sizes.</p>
<p>One clever way that developers came up with to handle all these new devices was to create a version of a site just for mobile and make it available on a subdomain.</p>
<p>Mobile subdomains, sometimes called m-dots or m subdomains, are just that – a mobile specific version of a site that's hosted on a subdomain, typically <code>m</code>.</p>
<p>For example, the desktop version of Facebook is at <code>facebook.com</code>, or more specifically, at the <code>www</code> subdomain, <code>www.facebook.com</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-119.png" alt="Image" width="600" height="400" loading="lazy">
<em>The desktop version of Facebook</em></p>
<p>But the mobile version of Facebook is at <code>m.facebook.com</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-118.png" alt="Image" width="600" height="400" loading="lazy">
<em>The mobile version of Facebook</em></p>
<p>If you sign in to both applications and look at them side-by-side, they look pretty similar. But under the hood, they're really two separate applications – the mobile version is quite a bit lighter, and is optimized to work on smaller screens and on most mobile browsers.</p>
<p>Mobile subdomains are still around today, and there are some definite advantages to this approach. With a separate version of a site on a mobile subdomain, developers can ensure the site loads quickly, and uses less mobile data.</p>
<p>Also, having a mobile subdomain allows developers to really tailor the SEO (search engine optimization) to mobile devices, and drive more traffic to the mobile version of the site.</p>
<p>But there are some definite downsides as well. Going with mobile subdomains means that developers have to maintain two, sometimes very different, websites instead of just one.</p>
<p>And mobile subdomains can sometimes be frustrating. I'm sure many of you know the pain of trying to visit the desktop version of a site only to get redirected to the mobile version.</p>
<p>Not only that, but developers have to figure out which devices to redirect, and under what conditions. </p>
<p>Traditionally this was done by checking the user agent of the visitor's browser, but with the number of devices coming out at the time, it was a constant moving target. Eventually developers started checking the width of the browser window with JavaScript and redirecting based on that.</p>
<p>Now you might be thinking, that sounds a lot like responsive web design today. And it's true – in many ways, modern responsive web design is a, well, response, to past techniques. It takes a lot of the good ideas that developers came up with and builds on top of them.</p>
<h2 id="heading-responsive-web-design">Responsive web design</h2>
<p>By the late 2000s, designing a site to work on different screen sizes was quickly becoming the norm. But to do this, developers had to come up with a lot of tricks. </p>
<p>Even for simple layouts, developers had to use things like the <code>max-width: 100%</code> trick for flexible images, and <code>float</code> with <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Floats#the_clearfix_hack">clearfixes</a> to keep things from breaking.</p>
<p>Then in 2010, a developer named Ethan Marcotte published an article in <a target="_blank" href="https://alistapart.com/">A List Apart</a> where he outlined a new way of thinking about flexible web design. In the article, Marcotte listed three important components for creating a responsive website: fluid grids, flexible images, and media queries.</p>
<p>Beyond outlining the major components of responsive web design, Marcotte is also credited for coining the term itself, which was named after the title of the <a target="_blank" href="https://alistapart.com/article/responsive-web-design/">2010 article</a>.</p>
<h3 id="heading-fluid-grids">Fluid grids</h3>
<p>Fluid grids are the idea that a website should adopt a different number of flexible columns that grow or shrink depending on the current screen size. On mobile devices, there should be one or two flexible columns of content, and on desktops there can be more:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-126.png" alt="Image" width="600" height="400" loading="lazy">
<em>Ethan Marcott's website on a mobile device (<a target="_blank" href="https://ethanmarcotte.com/work/">Source</a>)</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-125.png" alt="Image" width="600" height="400" loading="lazy">
<em>The same page on a desktop (<a target="_blank" href="https://ethanmarcotte.com/work/">Source</a>)</em></p>
<p>You can read more of Marcott's thoughts on fluid grids in this <a target="_blank" href="https://alistapart.com/article/fluidgrids/">earlier article</a>.</p>
<h3 id="heading-flexible-images">Flexible images</h3>
<p>Flexible images are the idea that images should grow or shrink along with the fluid grid they're in:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-127.png" alt="Image" width="600" height="400" loading="lazy">
<em>Smaller photos on a mobile device (<a target="_blank" href="https://ethanmarcotte.com/work/">Source</a>)</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-128.png" alt="Image" width="600" height="400" loading="lazy">
<em>Larger photos on a desktop (<a target="_blank" href="https://ethanmarcotte.com/work/">Source</a>)</em></p>
<p>A common way to do this is with the <code>max-width</code> trick mentioned above.</p>
<p>If you have an image in a container, it could overflow, especially if the container is responsive. For example, if you have the following, the image could overflow like this:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
  <span class="hljs-selector-class">.container</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">250px</span>;
    <span class="hljs-attribute">outline</span>: solid;
    <span class="hljs-attribute">text-align</span>: center;
  }
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./images/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Example image<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-129.png" alt="An image overflowing its 250px wide container." width="600" height="400" loading="lazy"></p>
<p>But if you set its <code>max-width</code> to <code>100%</code>, the image will not overflow:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
  <span class="hljs-selector-class">.container</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">250px</span>;
    <span class="hljs-attribute">outline</span>: solid;
    <span class="hljs-attribute">text-align</span>: center;
  }

  <span class="hljs-selector-class">.my-image</span> {
    <span class="hljs-attribute">max-width</span>: <span class="hljs-number">100%</span>;
  }
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span>
      <span class="hljs-attr">class</span>=<span class="hljs-string">"my-image"</span>
      <span class="hljs-attr">src</span>=<span class="hljs-string">"./images/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg"</span>
    /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Example image<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-130.png" alt="The same image contained in its 250px wide container." width="600" height="400" loading="lazy"></p>
<p>And will even resize with the parent container:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
  <span class="hljs-selector-class">.container</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">600px</span>;
    <span class="hljs-attribute">outline</span>: solid;
    <span class="hljs-attribute">text-align</span>: center;
  }

  <span class="hljs-selector-class">.my-image</span> {
    <span class="hljs-attribute">max-width</span>: <span class="hljs-number">100%</span>;
  }
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">img</span>
      <span class="hljs-attr">class</span>=<span class="hljs-string">"my-image"</span>
      <span class="hljs-attr">src</span>=<span class="hljs-string">"./images/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg"</span>
    /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Example image<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-131.png" alt="The image resizing to the larger 600px wide container." width="600" height="400" loading="lazy"></p>
<h3 id="heading-media-queries">Media queries</h3>
<p>Media queries refer to CSS media queries that were available in 2010, but not widely adopted until its official release as a <a target="_blank" href="https://www.w3.org/TR/2012/REC-css3-mediaqueries-20120619/">W3 Recommendation</a> in 2012.</p>
<p>A media query is just a CSS rule that gets triggered based on options like the media type (<code>screen</code>, <code>print</code>, etc.) and media features (<code>width</code>, <code>height</code>, and so on):</p>
<pre><code class="lang-css"><span class="hljs-keyword">@media</span> screen <span class="hljs-keyword">and</span> (<span class="hljs-attribute">min-width:</span> <span class="hljs-number">500px</span>) {
  <span class="hljs-selector-tag">background-color</span>: <span class="hljs-selector-tag">red</span>;
}
</code></pre>
<p>Even though they were a bit simpler back then, media queries allowed developers to implement breakpoints, which are still used in responsive web design today.</p>
<p>A breakpoint is just when a website changes layouts or other styles based on the device or browser window's width. For example, here's the full code for the snippet above:</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
    <span class="hljs-selector-class">.container</span> {
      <span class="hljs-attribute">width</span>: <span class="hljs-number">250px</span>;
      <span class="hljs-attribute">outline</span>: solid;
      <span class="hljs-attribute">text-align</span>: center;
    }

    <span class="hljs-selector-class">.my-image</span> {
      <span class="hljs-attribute">max-width</span>: <span class="hljs-number">100%</span>;
    }

    <span class="hljs-keyword">@media</span> screen <span class="hljs-keyword">and</span> (<span class="hljs-attribute">max-width:</span> <span class="hljs-number">500px</span>) {
      <span class="hljs-selector-class">.container</span> {
        <span class="hljs-attribute">background-color</span>: red;
      }
    }
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">img</span>
        <span class="hljs-attr">class</span>=<span class="hljs-string">"my-image"</span>
        <span class="hljs-attr">src</span>=<span class="hljs-string">"./images/kelly-sikkema-v9FQR4tbIq8-unsplash.jpg"</span>
      /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Example image<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Note that it's important to use a <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTML/Viewport_meta_tag">viewport meta tag</a> for media queries to work the way you expect. This works in most cases:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
</code></pre>
<p>With the media query above, here's what the container looks like when the resolution is 500px wide or below:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-132.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>And here's what it looks like when the resolution is 501px or greater:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-133.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-mobile-first-vs-desktop-first">Mobile-first vs Desktop-first</h3>
<p>More recently, there are two main approaches to responsive web design: mobile-first or desktop-first. Both are totally valid options, and each has its pros and cons.</p>
<p>If you're designing a website from scratch, many developers today feel that mobile-first is the way to go – mobile designs tend to be single column, and are much easier.</p>
<p>If you want to go the mobile-first route, you would write your styles normally, then create breakpoints like the one above with <code>min-width</code> once you start creating the tablet and desktop layouts.</p>
<p>But maybe you're working on an older site that was designed with desktops in mind, and need to adapt it to smaller mobile devices. In this case you'd use media queries with <code>max-width</code> to target those lower resolutions.</p>
<p>You can read more about mobile-first and desktop-first design philosophies in <a target="_blank" href="https://www.freecodecamp.org/news/taking-the-right-approach-to-responsive-web-design/">this article</a>.</p>
<h2 id="heading-in-closing">In closing</h2>
<p>That's it! Now you know a bit about the history of responsive web design, and all the fits and starts that developers went through before everything we have today.</p>
<p>If you'd like to take a deep dive into responsive web design, Flexbox, and other modern techniques, check out this 4 hour tutorial on our YouTube channel:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/srvUrASNj0s" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>And if you'd like to learn about CSS Grid, the new way to create complex, flexible layouts, check out one of our written tutorials <a target="_blank" href="https://www.freecodecamp.org/news/search/?query=css%20grid">here</a>.</p>
<p>What's your history with responsive web design? Did I miss something? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Everything You Need to Know About Cookies for Web Development ]]>
                </title>
                <description>
                    <![CDATA[ Have you ever wondered how you can sign in to a website once and remain signed in, even if you close your browser? Or added an item to your shopping cart without signing in at all? Whether you know it or not, cookies are everywhere, and for better or... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/everything-you-need-to-know-about-cookies-for-web-development/</link>
                <guid isPermaLink="false">66ac87f29c95a40246abe1b4</guid>
                
                    <category>
                        <![CDATA[ cookies ]]>
                    </category>
                
                    <category>
                        <![CDATA[ web ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Wed, 03 Feb 2021 06:14:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/602cb40c0a2838549dcc6af3.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Have you ever wondered how you can sign in to a website once and remain signed in, even if you close your browser? Or added an item to your shopping cart without signing in at all?</p>
<p>Whether you know it or not, cookies are everywhere, and for better or worse, they completely changed the way we use the web.</p>
<p>In this article, we'll go over the history of cookies, how they work, how to use them in JavaScript, and some security concerns to keep in mind.</p>
<h2 id="heading-a-brief-history-of-cookies">A brief history of cookies</h2>
<p>HTTP, or the Hypertext Transfer Protocol, is a stateless protocol. According to Wikipedia, its a stateless protocol because it "does not require the HTTP server to retain information or status about each user for the duration of multiple requests."</p>
<p>You can still see this today with simple websites – you type in the URL to the browser, the browser makes a request to a server somewhere, and the server returns the files to render the page and the connection is closed.</p>
<p>Now imagine that you need to sign in to a website to see certain content, like with LinkedIn. The process is largely the same as the one above, but you're presented with a form to enter in your email address and password.</p>
<p>You enter that information in and your browser sends it to the server. The server checks your login information, and if everything looks good, it sends the data needed to render the page back to your browser.</p>
<p>But if LinkedIn was truly stateless, once you navigate to a different page, the server would not remember that you just signed in. It would ask you to enter in your email address and password again, check them, then send over the data to render the new page.</p>
<p>That would be super frustrating, wouldn't it? A lot of developers thought so, too, and found different ways to create stateful sessions on the web.</p>
<h3 id="heading-the-invention-of-the-http-cookie">The invention of the HTTP cookie</h3>
<p>Lou Montoulli, a developer at Netscape in the early 90s, had a problem – he was developing an online store for another company, MCI, which would store the items in each customer's cart on its servers. This meant that people had to create an account first, it was slow, and it took up a lot of storage.</p>
<p>MCI requested for all of this data to be stored on each customer's own computer instead. Also, they wanted everything to work without customers having to sign in first.</p>
<p>To solve this, Lou turned to an idea that was already pretty well known among programmers: the magic cookie.</p>
<p>A magic cookie, or just cookie, is a bit of data that's passed between two computer programs. They're "magic" because the data in the cookie is often a random key or token, and is really just meant for the software using it.</p>
<p>Lou took the magic cookie concept and applied it to the online store, and later to browsers as a whole.</p>
<p>Now that you know about their history, let's take a quick look at how cookies are used to create stateful sessions on the web.</p>
<h2 id="heading-how-cookies-work">How cookies work</h2>
<p>One way to think of cookies is that they're a bit like the wristbands you get when you visit an amusement park.</p>
<p>For example, when you sign in to a website, it's like the process of entering an amusement park. First you pay for a ticket, then when you enter the park, the staff checks your ticket and gives you a wristband.</p>
<p>This is like how you sign in – the server checks your username and password, creates and stores a session, generates a unique session id, and sends back a cookie with the session id.</p>
<p>(Note that the session id is <em>not</em> your password, but is something completely separate and generated on the fly. Proper password handling and authentication is outside the scope of this article, but you can find some in depth guides <a target="_blank" href="https://www.freecodecamp.org/news/search/?query=authentication">here</a>.)</p>
<p>While you're in the amusement park, you can go on any ride by showing your wristband. </p>
<p>Similarly, when you make requests to the website you're signed in to, your browser sends your cookie with your session id back to the server. The server checks for your session using your session id, then returns data for your request.</p>
<p>Finally, once you leave the amusement park, your wristband no longer works – you can't use it to get back into the park or go on more rides. </p>
<p>This is like signing out of a website. Your browser sends your sign out request to the server with your cookie, the server removes your session, and lets your browser know to remove your session id cookie.</p>
<p>If you want to get back into the amusement park, you'd have to buy another ticket and get another wristband. In other words, if you want to continue using the website, you'd have to sign back in.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/fireship-cookies.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://www.youtube.com/watch?v=UBUNrFtufWo">Session vs Token Authentication in 100 Seconds</a> (YouTube)</em></p>
<p>This is just a simple example of how cookies can be used to keep you signed in to websites. They can be used to remember your setting for dark mode, to track your behavior on a website, and so much more.</p>
<h2 id="heading-how-to-use-cookies">How to use cookies</h2>
<p>Now that you know about the history of cookies and why they're used, let's look at some of the limitations of using cookies, then dive into some simple examples.</p>
<h3 id="heading-cookie-limitations">Cookie limitations</h3>
<p>Cookies are quite limited compared to some modern alternatives to storing data in the browser like <code>localStorage</code> or <code>sessionStorage</code>. Here's a rundown of cookies compared to those other technologies:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td>Cookies</td><td>Local Storage</td><td>Session Storage</td></tr>
</thead>
<tbody>
<tr>
<td>Capacity</td><td>4KB</td><td>10MB</td><td>5MB</td></tr>
<tr>
<td>Accessible from</td><td>Any window</td><td>Any window</td><td>Same tab</td></tr>
<tr>
<td>Expires</td><td>Manually set</td><td>Never</td><td>On tab close</td></tr>
<tr>
<td>Storage location</td><td>Browser and server</td><td>Browser only</td><td>Browser only</td></tr>
<tr>
<td>Sent with requests</td><td>Yes</td><td>No</td><td>No</td></tr>
</tbody>
</table>
</div><p>Based on: <a target="_blank" href="https://www.youtube.com/watch?v=AwicscsvGLg">cookies vs localStorage vs sessionStorage - Beau teaches JavaScript</a> (YouTube)</p>
<p>Cookies are a much older technology, and have a very limited capacity. Still, there's quite a bit you can do with them. And their small size makes it easy for the browser to send cookies with each request to the server.</p>
<p>It's also worth mentioning that browsers only allow cookies to work from one domain for security reasons.</p>
<p>So if you sign in to your bank at, say, ally.com, then cookies will only work within that domain and its subdomains. For example, your <code>ally.com</code> cookie will work on <code>ally.com</code>, <code>ally.com/about</code>, and the subdomain <code>www.ally.com</code>, but not <code>axos.com</code>.</p>
<p>This means that, even if you have accounts and are signed in at both <code>ally.com</code> and <code>axos.com</code>, those sites won't be able to read each other's cookies.</p>
<p>It's important to remember that your cookies are sent with every request you make in the browser. This is very convenient, but has some serious security implications we'll get into later.</p>
<p>Finally, if there's one thing you take away from this article, just remember that cookies are meant to be openly read and sent, so you should never store sensitive information like passwords in them.</p>
<h3 id="heading-how-to-set-a-cookie-in-javascript">How to set a cookie in JavaScript</h3>
<p>Cookies are really just strings with key / value pairs. Though you'll probably work with cookies more on the backend, there may be times you'll want to set a cookie on the client side.</p>
<p>Here's how to set a cookie in vanilla JavaScript:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true'</span>
</code></pre>
<p>Then when you open the developer console, click "Application" and then on the site under "Cookies", you'll see the cookie you just added:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-101.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you take a closer look at your cookie, you'll see that its expiration date is set to <code>Session</code>. That means the cookie will be destroyed when you close your tab / browser.</p>
<p>That might be the behavior you want, like for an online store with payment information.</p>
<p>But if you want your cookie to last longer, you'll need to set an expiration date.</p>
<h3 id="heading-how-to-set-an-expiration-date-on-a-cookie-in-javascript">How to set an expiration date on a cookie in JavaScript</h3>
<p>To set an expiration date, just set the value of your cookie, then add an <code>expires</code> attribute with a date set sometime in the future:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true; expires=Fri, 26 Feb 2021 00:00:00 GMT'</span> <span class="hljs-comment">// expires 1 week from now</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-102.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>JavaScript's <code>Date</code> object should make this much easier and more flexible. You can read more about the <code>Date</code> object <a target="_blank" href="https://www.freecodecamp.org/news/the-ultimate-guide-to-javascript-date-and-moment-js/">here</a>.</p>
<p>Or you could use the <code>max-age</code> attribute with the number of seconds you'd like your cookie to last:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true; max-age=604800'</span>; <span class="hljs-comment">// expires 1 week from now</span>
</code></pre>
<p>Then when that date rolls around, the browser will automatically remove your cookie.</p>
<h3 id="heading-how-to-update-a-cookie-in-javascript">How to update a cookie in JavaScript</h3>
<p>Whether or not your cookie has an expiration date, updating it is easy.</p>
<p>Just change the value for your cookie, and the browser will automatically pick it up:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">"dark_mode=false; max-age=604800"</span>; <span class="hljs-comment">// expires 1 week from now</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-105.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-set-the-path-for-a-cookie-in-javascript">How to set the path for a cookie in JavaScript</h3>
<p>Sometimes you'll only want your cookie to work with certain parts of your website. Depending on how your website is set up, one way to do this is with the <code>path</code> attribute.</p>
<p>Here's how to make it so a cookie only works on the about page at <code>/about</code>:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true; path=/about'</span>;
</code></pre>
<p>Now your cookie will only work on <code>/about</code> and other nested subdirectories like <code>/about/team</code>, but not on <code>/blog</code>.</p>
<p>Then when you visit the about page and check your cookies, you'll see it:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-103.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-delete-a-cookie-in-javascript">How to delete a cookie in JavaScript</h3>
<p>To delete a cookie in JavaScript, just set the <code>expires</code> attribute to a date that's already passed:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true; expires=Sun, 14 Feb 2021 00:00:00 GMT'</span>; <span class="hljs-comment">// 1 week earlier</span>
</code></pre>
<p>You could also use <code>max-age</code> and pass it a negative value:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=true; max-age=-60'</span>; <span class="hljs-comment">// 1 minute earlier</span>
</code></pre>
<p>Then when you check for your cookie, it'll be gone:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-104.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>And that should be everything you need to know about using cookies in vanilla JS.</p>
<p>Everything we covered will work in a pinch, but if you plan on working with cookies extensively, look into libraries like <a target="_blank" href="https://github.com/js-cookie/js-cookie">JavaScript Cookie</a> or <a target="_blank" href="https://github.com/expressjs/cookie-session">Cookie Parser</a>.</p>
<h2 id="heading-security-concerns-with-cookies">Security concerns with cookies</h2>
<p>In general, cookies are very secure when implemented correctly. Browsers have a lot of built-in limitations that we covered earlier, partly due to the age of the technology, but also to improve security.</p>
<p>Still, there are a few ways that a bad actor can steal your cookie and use it to wreak havoc.</p>
<p>We'll go over some common ways this can happen, and look at different ways to fix it. </p>
<p>Also, note that any code snippets will be in vanilla JavaScript. If you want to implement these fixes on the server, you'll need to look up the exact syntax for your language or framework.</p>
<h3 id="heading-man-in-the-middle-attacks">Man-in-the-middle attacks</h3>
<p>A man-in-the-middle (MitM) attack describes a broad category of attacks where an attacker sits between a client and a server and intercepts the data going between the two.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/man-in-the-middle-attack-how-avoid.png" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://www.netsparker.com/blog/web-security/man-in-the-middle-attack-how-avoid/">Man-in-the-Middle Attacks and How To Avoid Them</a></em></p>
<p>This can be done in a lot of ways: by gaining access to or listening in on an insecure website, mimicking a public WiFi router, DNS spoofing, or through malware / adware like <a target="_blank" href="https://en.wikipedia.org/wiki/Superfish">SuperFish</a>.</p>
<p>Here's a high-level overview of MitM attacks, and how websites can protect themselves and their users.</p>
<p>Warning: The beginning of the video talks about Mary, Queen of Scotts, and shows an animated depiction of her beheading. It's not overly gruesome, but if you'd like to avoid it, skip ahead to <a target="_blank" href="https://youtu.be/8OR2dDIaIDw?t=57">this timestamp</a>:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/8OR2dDIaIDw" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>As a developer, you can greatly reduce the chance of a MitM attack by ensuring that you enable HTTPS on your server, use an SSL certificate from a trusted certificate authority, and ensure your code uses HTTPS instead of the insecure HTTP.</p>
<p>In terms of cookies, you should add the <code>Secure</code> attribute to your cookies so they can only be sent over a secure HTTPS connection:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=false; Secure'</span>;
</code></pre>
<p>Just remember that the <code>Secure</code> attribute doesn't actually encrypt any data in your cookie – it just ensures that the cookie can't be sent over an HTTP connection.</p>
<p>However, a bad actor could still possibly intercept and manipulate the cookie. To prevent this from happening, you can also use the <code>HttpOnly</code> parameter:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=false; Secure; HttpOnly'</span>;
</code></pre>
<p>Cookies with <code>HttpOnly</code> can only be accessed by the server, and not by the browser's <code>Document.cookie</code> API. This is perfect for things like a login session, where only the server really needs to know if you're signed into a site, and you don't need that information client side.</p>
<h3 id="heading-xss-attacks">XSS attacks</h3>
<p>An XSS (cross-site scripting) attack describes a category of attacks when a bad actor injects unintended, potentially dangerous code into a website.</p>
<p>These attacks are very problematic because they could affect every person that visits the site.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/cross-site-scripting.svg" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://portswigger.net/web-security/cross-site-scripting">Cross-site scripting</a></em></p>
<p>For example, if a site has a comments section and someone is able to include malicious code as a comment, it's possible that every person who visits the site and reads that comment will be affected.</p>
<p>In terms of cookies, if a bad actor pulls off a successful XSS attack on a site, they could gain access to session cookies and access the site as another signed in user. From there, they may be able to access the other user's settings, buy things as that user and have it shipped to another address, and so on.</p>
<p>Here's a video that gives a high-level overview of the different types of XSS – Reflected, Stored, DOM-based, and Mutation:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/EoaDgUgS6QA" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>As a developer, you'll want to ensure that your server enforces the Same Origin Policy, and that any input you receive from people is properly sanitized.</p>
<p>And like with preventing MitM attacks, you should set the <code>Secure</code> and <code>HttpOnly</code> parameters with any cookies you use:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=false; Secure; HttpOnly'</span>;
</code></pre>
<h3 id="heading-csrf-attacks">CSRF attacks</h3>
<p>A CSRF (cross-site request forgery) attack is when a bad actor tricks a person into carrying out an unintended, potentially malicious action.</p>
<p>For example, if you're signed into a site and click on a link in a comment, if that link is part of a CSRF attack, it may lead to you unintentionally changing your sign in details, or even deleting your account.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/cross-site-request-forgery.svg" alt="Image" width="600" height="400" loading="lazy">
<em>Source: <a target="_blank" href="https://portswigger.net/web-security/csrf">Cross-site request forgery</a></em></p>
<p>While CSRF attacks are somewhat related to XSS attacks, specifically reflected XSS attacks where someone inserts malicious code into a site, each preys on a different type of trust.</p>
<p>According to <a target="_blank" href="https://en.wikipedia.org/wiki/Cross-site_request_forgery">Wikipedia</a>, while XSS "exploits the trust a user has for a particular site, CSRF exploits the trust that a site has in a user's browser."</p>
<p>Here's a video that explains the basics of CSRF, and gives some useful examples:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/eWEgUcHPle0" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>As for cookies, one way to prevent possible CSRF attacks is with the <code>SameSite</code> flag:</p>
<pre><code class="lang-js"><span class="hljs-built_in">document</span>.cookie = <span class="hljs-string">'dark_mode=false; Secure; HttpOnly; SameSite=Strict'</span>;
</code></pre>
<p>There are a few values you can set for <code>SameSite</code>: </p>
<ul>
<li><code>Lax</code>: Cookies are not sent for embedded content (images, iframes, etc.) but are sent when you click on a link or send a request to the origin the cookie is set for. For example, if you're on <code>testing.com</code> and you click on a link to go to <code>test.com/about</code>, your browser will send your cookie for <code>test.com</code> with that request</li>
<li><code>Strict</code>: Cookies are only sent when you click on a link or send a request from the origin the cookie is set for. For example, your <code>test.com</code> cookie will only be sent while you're in and around <code>test.com</code>, and not coming from other sites like <code>testing.com</code></li>
<li><code>None</code>: Cookies will be sent with every request, regardless of context. If you set <code>SameSite</code> to <code>None</code>, you must also add the <code>Secure</code> attribute. It's better to avoid this value if possible</li>
</ul>
<p>Major browsers handle <code>SameSite</code> a bit differently. For example, if <code>SameSite</code> isn't set on a cookie, Google Chrome sets it to <code>Lax</code> by default.</p>
<h2 id="heading-alternatives-to-cookies">Alternatives to cookies</h2>
<p>You might be wondering, if there are so many potential security flaws with cookies, why are we still using them? Surely there must be a better alternative.</p>
<p>These days, you can use either <code>sessionStorage</code> or <code>localStorage</code> to store information that originally used cookies. And for stateful sessions, there's token-based authentication with things like JWT (JSON Web Tokens).</p>
<p>While it may seem like you have to choose between cookie-based or token-based authentication, it's possible to use both. For example, you might want use cookie-based authentication when someone signs in through the browser, and token-based authentication when someone signs in through a phone app.</p>
<p>To muddy the waters a bit more, authentication-as-a-service providers like Auth0 allow you to do both types of authentication.</p>
<p>If you'd like to learn more about web tokens and token-based authentication, check out some of our articles <a target="_blank" href="https://www.freecodecamp.org/news/search/?query=web%20tokens">here</a>.</p>
<h2 id="heading-when-you-give-a-developer-a-cookie">When you give a developer a cookie</h2>
<p>That's it! That should be just about everything you need to know to get started with using cookies, and what to watch out for along the way.</p>
<p>Did you find this useful? How do you use cookies? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JSON Stringify Example – How to Parse a JSON Object with JS ]]>
                </title>
                <description>
                    <![CDATA[ JSON, or JavaScript Object Notation, is all around us. If you've ever used a web app, there's a very good chance that it used JSON to structure, store, and transmit data between its servers and your device. In this article, we'll briefly go over the ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/json-stringify-example-how-to-parse-a-json-object-with-javascript/</link>
                <guid isPermaLink="false">66ac881d0479cf0e155d2610</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ json ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Tue, 05 Jan 2021 15:11:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/06/602358380a2838549dcc2554.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>JSON, or JavaScript Object Notation, is all around us. If you've ever used a web app, there's a very good chance that it used JSON to structure, store, and transmit data between its servers and your device.</p>
<p>In this article, we'll briefly go over the differences between JSON and JavaScript, then jump into different ways to parse JSON with JavaScript in the browser and in Node.js projects.</p>
<h2 id="heading-differences-between-json-and-javascript">Differences between JSON and JavaScript</h2>
<p>While JSON looks like regular JavaScript, it's better to think of JSON as a data format, similar to a text file. It just so happens that JSON is inspired by JavaScript syntax, which is why they look so similar.</p>
<p>Let's take a look at JSON objects and JSON arrays and compare them to their JavaScript counterparts.</p>
<h3 id="heading-json-objects-vs-javascript-object-literals">JSON objects vs JavaScript Object Literals</h3>
<p>First, here's a JSON object:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Jane Doe"</span>,
  <span class="hljs-attr">"favorite-game"</span>: <span class="hljs-string">"Stardew Valley"</span>,
  <span class="hljs-attr">"subscriber"</span>: <span class="hljs-literal">false</span>
}
</code></pre>
<p>The main difference between a JSON object and a regular JavaScript object – also called an object literal – comes down to the quotation marks. All the keys and string type values in a JSON object have to be wrapped in double quotation marks (<code>"</code>).</p>
<p>JavaScript object literals are a bit more flexible. With object literals, you don't need to wrap keys and strings in double quotation marks. Instead, you could use single quotation marks (<code>'</code>), or not use any type of quotation mark for the keys.</p>
<p>Here's what the code above might look like as a JavaScript object literal:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> profile = {
  <span class="hljs-attr">name</span>: <span class="hljs-string">'Jane Doe'</span>,
  <span class="hljs-string">'favorite-game'</span>: <span class="hljs-string">'Stardew Valley'</span>,
  <span class="hljs-attr">subscriber</span>: <span class="hljs-literal">false</span>
}
</code></pre>
<p>Note that the key <code>'favorite-game'</code> is wrapped in single quotes. With object literals, you'll need to wrap keys where the words are separated by dashes (<code>-</code>) in quotes.</p>
<p>If you'd like to avoid quotation marks, you could rewrite the key to use camel case (<code>favoriteGame</code>) or separate the words with an underscore (<code>favorite_game</code>) instead.</p>
<h3 id="heading-json-arrays-vs-javascript-arrays">JSON arrays vs JavaScript arrays</h3>
<p>JSON arrays work pretty much the same way as arrays in JavaScript, and can contain strings, booleans, numbers, and other JSON objects. For example:</p>
<pre><code class="lang-json">[
  {
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Jane Doe"</span>,
    <span class="hljs-attr">"favorite-game"</span>: <span class="hljs-string">"Stardew Valley"</span>,
    <span class="hljs-attr">"subscriber"</span>: <span class="hljs-literal">false</span>
  },
  {
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"John Doe"</span>,
    <span class="hljs-attr">"favorite-game"</span>: <span class="hljs-string">"Dragon Quest XI"</span>,
    <span class="hljs-attr">"subscriber"</span>: <span class="hljs-literal">true</span>
  }
]
</code></pre>
<p>Here's what that might look like in plain JavaScript:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> profiles = [
  {
    <span class="hljs-attr">name</span>: <span class="hljs-string">'Jane Doe'</span>,
    <span class="hljs-string">'favorite-game'</span>: <span class="hljs-string">'Stardew Valley'</span>,
    <span class="hljs-attr">subscriber</span>: <span class="hljs-literal">false</span>
  },
  {
    <span class="hljs-attr">name</span>: <span class="hljs-string">'John Doe'</span>,
    <span class="hljs-string">'favorite-game'</span>: <span class="hljs-string">'Dragon Quest XI'</span>,
    <span class="hljs-attr">subscriber</span>: <span class="hljs-literal">true</span>
  }
];
</code></pre>
<h2 id="heading-json-as-a-string">JSON as a string</h2>
<p>You might be wondering, if there are JSON objects and arrays, couldn't you use it in your program like a regular JavaScript object literal or array?</p>
<p>The reason why you can't do this is that JSON is really just a string.</p>
<p>For example, when you write JSON in a separate file like with <code>jane-profile.json</code> or <code>profiles.json</code> above, that file actually contains text in the form of a JSON object or array, which happens to look like JavaScript.</p>
<p>And if you make a request to an API, it'll return something like this:</p>
<pre><code>{<span class="hljs-string">"name"</span>:<span class="hljs-string">"Jane Doe"</span>,<span class="hljs-string">"favorite-game"</span>:<span class="hljs-string">"Stardew Valley"</span>,<span class="hljs-string">"subscriber"</span>:<span class="hljs-literal">false</span>}
</code></pre><p>Just like with text files, if you want to use JSON in your project, you'll need to parse or change it into something your programming language can understand. For instance, parsing a JSON object in Python will create a dictionary.</p>
<p>With that understanding, let's look at different ways to parse JSON in JavaScript.</p>
<h2 id="heading-how-to-parse-json-in-the-browser">How to parse JSON in the browser</h2>
<p>If you're working with JSON in the browser, you're probably receiving or sending data through an API.</p>
<p>Let's take a look at a couple of examples.</p>
<h3 id="heading-how-to-parse-json-with-fetch">How to parse JSON with <code>fetch</code></h3>
<p>The easiest way to get data from an API is with <code>fetch</code>, which includes the <code>.json()</code> method to parse JSON responses into a usable JavaScript object literal or array automagically.</p>
<p>Here's some code that uses <code>fetch</code> to make a <code>GET</code> request for a developer-themed joke from the free <a target="_blank" href="https://api.chucknorris.io/">Chuck Norris Jokes API</a>:</p>
<pre><code class="lang-js">fetch(<span class="hljs-string">'https://api.chucknorris.io/jokes/random?category=dev'</span>)
  .then(<span class="hljs-function"><span class="hljs-params">res</span> =&gt;</span> res.json()) <span class="hljs-comment">// the .json() method parses the JSON response into a JS object literal</span>
  .then(<span class="hljs-function"><span class="hljs-params">data</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(data));
</code></pre>
<p>If you run that code in the browser, you'll see something like this logged to the console:</p>
<pre><code class="lang-js">{
    <span class="hljs-string">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-string">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-string">"id"</span>: <span class="hljs-string">"elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-string">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-string">"value"</span>: <span class="hljs-string">"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
}
</code></pre>
<p>While that looks like a JSON object, it's really a JavaScript object literal, and you can use it freely in your program.</p>
<h3 id="heading-how-to-stringify-json-with-jsonstringify">How to stringify JSON with <code>JSON.stringify()</code></h3>
<p>But what if you want to send data to an API?</p>
<p>For instance, say you'd like to send a Chuck Norris joke to the Chuck Norris Jokes API so other people can read it later.</p>
<p>First, you'd write your joke as a JS object literal:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> newJoke = {
  <span class="hljs-attr">categories</span>: [<span class="hljs-string">'dev'</span>],
  <span class="hljs-attr">value</span>: <span class="hljs-string">"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</span>
};
</code></pre>
<p>Then, since you're sending data to an API, you'd need to turn your <code>newJoke</code> object literal into a JSON string.</p>
<p>Fortunately, JavaScript includes a super helpful method to do just that – <code>JSON.stringify()</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> newJoke = {
  <span class="hljs-attr">categories</span>: [<span class="hljs-string">'dev'</span>],
  <span class="hljs-attr">value</span>: <span class="hljs-string">"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</span>
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">JSON</span>.stringify(newJoke)); <span class="hljs-comment">// {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."}</span>

<span class="hljs-built_in">console</span>.log(<span class="hljs-keyword">typeof</span> <span class="hljs-built_in">JSON</span>.stringify(newJoke)); <span class="hljs-comment">// string</span>
</code></pre>
<p>While we're converting an object literal into a JSON string in this example, <code>JSON.stringify()</code> also works with arrays.</p>
<p>Finally, you'd just need to send your JSON stringified joke back to the API with a <code>POST</code> request.</p>
<p>Note that the Chuck Norris Jokes API doesn't actually have this feature. But if it did, here's what the code might look like:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> newJoke = {
  <span class="hljs-attr">categories</span>: [<span class="hljs-string">'dev'</span>],
  <span class="hljs-attr">value</span>: <span class="hljs-string">"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</span>
};

fetch(<span class="hljs-string">'https://api.chucknorris.io/jokes/submit'</span>, { <span class="hljs-comment">// fake API endpoint</span>
  <span class="hljs-attr">method</span>: <span class="hljs-string">'POST'</span>,
  <span class="hljs-attr">headers</span>: {
    <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>,
  },
  <span class="hljs-attr">body</span>: <span class="hljs-built_in">JSON</span>.stringify(newJoke), <span class="hljs-comment">// turn the JS object literal into a JSON string</span>
})
  .then(<span class="hljs-function"><span class="hljs-params">res</span> =&gt;</span> res.json())
  .then(<span class="hljs-function"><span class="hljs-params">data</span> =&gt;</span> <span class="hljs-built_in">console</span>.log(data))
  .catch(<span class="hljs-function"><span class="hljs-params">err</span> =&gt;</span> {
    <span class="hljs-built_in">console</span>.error(err);
  });
</code></pre>
<p>And just like that, you've parsed incoming JSON with <code>fetch</code> and used <code>JSON.stringify()</code> to convert a JS object literal into a JSON string.</p>
<h3 id="heading-how-to-work-with-local-json-files-in-the-browser">How to work with local JSON files in the browser</h3>
<p>Unfortunately, it's not possible (or advisable) to load a local JSON file in the browser.</p>
<p><code>fetch</code> will throw an error if you try to load a local file. For example, say you have a JSON file with some jokes:</p>
<pre><code class="lang-json">[
  {
    <span class="hljs-attr">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-attr">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-attr">"id"</span>: <span class="hljs-string">"elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-attr">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-attr">"value"</span>: <span class="hljs-string">"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
  },
  {
    <span class="hljs-attr">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-attr">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-attr">"id"</span>: <span class="hljs-string">"ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-attr">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-attr">"value"</span>: <span class="hljs-string">"There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."</span>
  }
]
</code></pre>
<p>And you want to parse it and create a list of jokes on a simple HTML page.</p>
<p>If you create a page with the following and open it in your browser:</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge,chrome=1"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Fetch Local JSON<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    fetch(<span class="hljs-string">"./jokes.json"</span>, { <span class="hljs-attr">mode</span>: <span class="hljs-string">"no-cors"</span> }) <span class="hljs-comment">// disable CORS because path does not contain http(s)</span>
      .then(<span class="hljs-function">(<span class="hljs-params">res</span>) =&gt;</span> res.json())
      .then(<span class="hljs-function">(<span class="hljs-params">data</span>) =&gt;</span> <span class="hljs-built_in">console</span>.log(data));
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>You'll see this in the console:</p>
<pre><code>Fetch API cannot load file:<span class="hljs-comment">//&lt;path&gt;/jokes.json. URL scheme "file" is not supported</span>
</code></pre><p>By default, browsers don't allow access to local files for security reasons. This is a good thing, and you shouldn't try to work around this behavior.</p>
<p>Instead, the best thing to do is to convert the local JSON file into JavaScript. Fortunately, this is pretty easy since JSON syntax is so similar to JavaScript.</p>
<p>All you need to do is create a new file and declare your JSON as a variable:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> jokes = [
  {
    <span class="hljs-string">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-string">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-string">"id"</span>: <span class="hljs-string">"elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-string">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-string">"value"</span>: <span class="hljs-string">"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
  },
  {
    <span class="hljs-string">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-string">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-string">"id"</span>: <span class="hljs-string">"ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-string">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-string">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-string">"value"</span>: <span class="hljs-string">"There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."</span>
  }
]
</code></pre>
<p>And add it to your page as a separate script:</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"X-UA-Compatible"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"IE=edge,chrome=1"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Fetch Local JSON<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"jokes.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-built_in">console</span>.log(jokes);
  </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>You'll be able to use the <code>jokes</code> array freely in your code.</p>
<p>You could also use JavaScript <code>[modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules)</code> to do the same thing, but that's a bit outside the scope of this article.</p>
<p>But what if you want to work with local JSON files and have Node.js installed? Let's take a look at how to do that now.</p>
<h2 id="heading-how-to-parse-json-in-nodejs">How to parse JSON in Node.js</h2>
<p>Node.js is a JavaScript runtime that allows you to run JavaScript outside of the browser. You can read all about <a target="_blank" href="https://www.freecodecamp.org/news/the-definitive-node-js-handbook-6912378afc6e/">Node.js here</a>.</p>
<p>Whether you use Node.js to run code locally on your computer, or to run entire web applications on a server, it's good to know how to work with JSON.</p>
<p>For the following examples, we'll use the same <code>jokes.json</code> file:</p>
<pre><code class="lang-json">[
  {
    <span class="hljs-attr">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-attr">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-attr">"id"</span>: <span class="hljs-string">"elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-attr">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq"</span>,
    <span class="hljs-attr">"value"</span>: <span class="hljs-string">"Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
  },
  {
    <span class="hljs-attr">"categories"</span>: [<span class="hljs-string">"dev"</span>],
    <span class="hljs-attr">"created_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"icon_url"</span>: <span class="hljs-string">"https://assets.chucknorris.host/img/avatar/chuck-norris.png"</span>,
    <span class="hljs-attr">"id"</span>: <span class="hljs-string">"ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-attr">"updated_at"</span>: <span class="hljs-string">"2020-01-05 13:42:19.324003"</span>,
    <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw"</span>,
    <span class="hljs-attr">"value"</span>: <span class="hljs-string">"There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris."</span>
  }
]
</code></pre>
<h3 id="heading-how-to-parse-a-json-file-with-require">How to parse a JSON file with <code>require()</code></h3>
<p>Let's start with the easiest method.</p>
<p>If you have a local JSON file, all you need to do is use <code>require()</code> to load it like any other Node.js module:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> jokes = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./jokes.json'</span>);
</code></pre>
<p>The JSON file will be parsed for you automatically and you can start using it in your project:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> jokes = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./jokes.json'</span>);

<span class="hljs-built_in">console</span>.log(jokes[<span class="hljs-number">0</span>].value); <span class="hljs-comment">// "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
</code></pre>
<p>Note that this is synchronous, meaning that your program will stop until it parses the entire file before continuing. Really large JSON files can cause your program to slow down, so just be careful with that.</p>
<p>Also, because parsing JSON this way loads the entire thing into memory, it's better to use this method for static JSON files. If the JSON file changes while your program is running, you won't have access to those changes until you restart your program and parse the updated JSON file.</p>
<h3 id="heading-how-to-parse-a-json-file-with-fsreadfilesync-and-jsonparse">How to parse a JSON file with <code>fs.readFileSync(</code>) and <code>JSON.parse()</code></h3>
<p>This is the more traditional way (for lack of a better term) to parse JSON files in Node.js projects – read the file with <code>fs</code> (file system) module, then parse with <code>JSON.parse()</code>.</p>
<p>Let's see how to do this with the <code>fs.readFileSync()</code> method. First, add the <code>fs</code> module to your project:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
</code></pre>
<p>Then, create a new variable to store the output of the <code>jokes.json</code> file and set it equal to <code>fs.readFileSync()</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">const</span> jokesFile = fs.readFileSync();
</code></pre>
<p><code>fs.readFileSync()</code> takes a couple of arguments. The first is the path to the file you want to read:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">const</span> jokesFile = fs.readFileSync(<span class="hljs-string">'./jokes.json'</span>);
</code></pre>
<p>But if you log <code>jokesFile</code> to the console now, you'd see something like this:</p>
<pre><code>&lt;Buffer <span class="hljs-number">5</span>b <span class="hljs-number">0</span>a <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">7</span>b <span class="hljs-number">0</span>a <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">22</span> <span class="hljs-number">63</span> <span class="hljs-number">61</span> <span class="hljs-number">74</span> <span class="hljs-number">65</span> <span class="hljs-number">67</span> <span class="hljs-number">6</span>f <span class="hljs-number">72</span> <span class="hljs-number">69</span> <span class="hljs-number">65</span> <span class="hljs-number">73</span> <span class="hljs-number">22</span> <span class="hljs-number">3</span>a <span class="hljs-number">20</span> <span class="hljs-number">5</span>b <span class="hljs-number">22</span> <span class="hljs-number">64</span> <span class="hljs-number">65</span> <span class="hljs-number">76</span> <span class="hljs-number">22</span> <span class="hljs-number">5</span>d <span class="hljs-number">2</span>c <span class="hljs-number">0</span>a <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">20</span> <span class="hljs-number">22</span> <span class="hljs-number">63</span> <span class="hljs-number">72</span> <span class="hljs-number">65</span> <span class="hljs-number">61</span> <span class="hljs-number">74</span> <span class="hljs-number">65</span> <span class="hljs-number">64</span> <span class="hljs-number">5</span>f <span class="hljs-number">61</span> <span class="hljs-number">74</span> <span class="hljs-number">22</span> <span class="hljs-number">3</span>a ... <span class="hljs-number">788</span> more bytes&gt;
</code></pre><p>That just means that the <code>fs</code> module is reading the file, but it doesn't know the encoding or format the file is in. <code>fs</code> can be used to load pretty much any file, and not just text-based ones like JSON, so we need to tell it how the file is encoded.</p>
<p>For text-based files, the encoding is usually <code>utf8</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">const</span> jokesFile = fs.readFileSync(<span class="hljs-string">'./jokes.json'</span>, <span class="hljs-string">'utf8'</span>);
</code></pre>
<p>Now if you log <code>jokesFile</code> to the console, you'll see the contents of the file.</p>
<p>But so far we're just reading the file, and it's still a string. We'll need to use another method to parse <code>jokesFile</code> into a usable JavaScript object or array.</p>
<p>To do that, we'll use <code>JSON.parse()</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">const</span> jokesFile = fs.readFileSync(<span class="hljs-string">'./jokes.json'</span>, <span class="hljs-string">'utf8'</span>);
<span class="hljs-keyword">const</span> jokes = <span class="hljs-built_in">JSON</span>.parse(jokesFile);

<span class="hljs-built_in">console</span>.log(jokes[<span class="hljs-number">0</span>].value); <span class="hljs-comment">// "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>
</code></pre>
<p>As the name suggests, <code>JSON.parse()</code> takes a JSON string and parses it into a JavaScript object literal or array.</p>
<p>Like with the <code>require</code> method above, <code>fs.readFileSync()</code> is a synchronous method, meaning it could cause your program to slow down if it's reading a large file, JSON or otherwise.</p>
<p>Also, it only reads the file once and loads it into memory. If the file changes, you'll need to read the file again at some point. To make things easier, you might want to create a simple function to read files.</p>
<p>Here's what that might look like:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">const</span> readFile = <span class="hljs-function"><span class="hljs-params">path</span> =&gt;</span> fs.readFileSync(path, <span class="hljs-string">'utf8'</span>);

<span class="hljs-keyword">const</span> jokesFile1 = readFile(<span class="hljs-string">'./jokes.json'</span>);
<span class="hljs-keyword">const</span> jokes1 = <span class="hljs-built_in">JSON</span>.parse(jokesFile1);

<span class="hljs-built_in">console</span>.log(jokes1[<span class="hljs-number">0</span>].value); <span class="hljs-comment">// "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."</span>

<span class="hljs-comment">// the jokes.json file changes at some point</span>

<span class="hljs-keyword">const</span> jokesFile2 = readFile(<span class="hljs-string">'./jokes.json'</span>);
<span class="hljs-keyword">const</span> jokes2 = <span class="hljs-built_in">JSON</span>.parse(jokesFile2);

<span class="hljs-built_in">console</span>.log(jokes2[<span class="hljs-number">0</span>].value); <span class="hljs-comment">// "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</span>
</code></pre>
<h3 id="heading-how-to-parse-json-with-fsreadfile-and-jsonparse">How to parse JSON with <code>fs.readFile(</code>) and <code>JSON.parse()</code></h3>
<p>The <code>fs.readFile()</code> method is very similar to <code>fs.readFileSync()</code>, except that it works asynchronously. This is great if you have a large file to read and you don't want it to hold up the rest of your code.</p>
<p>Here's a basic example:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);

fs.readFile(<span class="hljs-string">'./jokes.json'</span>, <span class="hljs-string">'utf8'</span>);
</code></pre>
<p>So far this looks similar to what we did with <code>fs.readFileSync()</code>, except we're not assigning it to a variable like <code>jokesFile</code>. Because it's asynchronous, any code after <code>fs.readFile()</code> it will run before it's finished reading the file.</p>
<p>Instead, we'll use a callback function and parse the JSON inside it:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);

fs.readFile(<span class="hljs-string">'./jokes.json'</span>, <span class="hljs-string">'utf8'</span>, <span class="hljs-function">(<span class="hljs-params">err, data</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (err) <span class="hljs-built_in">console</span>.error(err);
  <span class="hljs-keyword">const</span> jokes = <span class="hljs-built_in">JSON</span>.parse(data);

  <span class="hljs-built_in">console</span>.log(jokes[<span class="hljs-number">0</span>].value);
});

<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"This will run first!"</span>);
</code></pre>
<p>Which prints the following to the console:</p>
<pre><code>This will run first!
Chuck Norris<span class="hljs-string">'s keyboard doesn'</span>t have a Ctrl key because nothing controls Chuck Norris.
</code></pre><p>Like with <code>fs.readFileSync()</code>, <code>fs.readFile()</code> loads the file into memory, meaning you'll need to read the file again if it changes.</p>
<p>Also, even though <code>fs.readFile()</code> is asynchronous, it eventually loads the entire file it's reading into memory. If you have a massive file, it may be better to look into <a target="_blank" href="https://www.freecodecamp.org/news/node-js-streams-everything-you-need-to-know-c9141306be93/">Node.js streams</a> instead.</p>
<h3 id="heading-how-to-stringify-json-with-jsonstringify-in-nodejs">How to stringify JSON with <code>JSON.stringify()</code> in Node.js</h3>
<p>Finally, if you're parsing JSON with Node.js, there's a good chance that you'll need to return JSON at some point, maybe as an API response.</p>
<p>Luckily, this works the same way as in the browser – just use <code>JSON.stringify()</code> to convert JavaScript object literals or arrays into a JSON string:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> newJoke = {
  <span class="hljs-attr">categories</span>: [<span class="hljs-string">'dev'</span>],
  <span class="hljs-attr">value</span>: <span class="hljs-string">"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."</span>
};

<span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">JSON</span>.stringify(newJoke)); <span class="hljs-comment">// {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."}</span>
</code></pre>
<p>And that's it! We've covered just about everything you need to know about working with JSON in the browser and in Node.js projects.</p>
<p>Now get out there and parse or stringify JSON to your heart's content.</p>
<p>Did I miss something? How do you parse JSON in your projects? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript Regex Match Example – How to Use JS Replace on a String ]]>
                </title>
                <description>
                    <![CDATA[ Regular expressions, abbreviated as regex, or sometimes regexp, are one of those concepts that you probably know is really powerful and useful. But they can be daunting, especially for beginning programmers. It doesn't have to be this way. JavaScript... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/javascript-regex-match-example-how-to-use-the-js-replace-method-on-a-string/</link>
                <guid isPermaLink="false">66ac881a0479cf0e155d260e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Regex ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Regular Expressions ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Mon, 04 Jan 2021 10:21:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/06/6020e04e0a2838549dcc0c26-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Regular expressions, abbreviated as regex, or sometimes regexp, are one of those concepts that you probably know is really powerful and useful. But they can be daunting, especially for beginning programmers.</p>
<p>It doesn't have to be this way. JavaScript includes several helpful methods that make using regular expressions much more manageable. Of the included methods, the <code>.match()</code>, <code>.matchAll()</code>, and <code>.replace()</code> methods are probably the ones you'll use most often.</p>
<p>In this tutorial, we'll go over the ins and outs of those methods, and look at some reasons why you might use them over the other included JS methods </p>
<h2 id="heading-a-quick-introduction-to-regular-expressions">A quick introduction to regular expressions</h2>
<p>According to MDN, regular expressions are "patterns used to match character combinations in strings".</p>
<p>These patterns can sometimes include special characters (<code>*</code>, <code>+</code>), assertions (<code>\W</code>, <code>^</code>), groups and ranges (<code>(abc)</code>, <code>[123]</code>), and other things that make regex so powerful but hard to grasp.</p>
<p>At its core, regex is all about finding patterns in strings – everything from testing a string for a single character to verifying that a telephone number is valid can be done with regular expressions.</p>
<p>If you're brand new to regex and would like some practice before reading on, check out our <a target="_blank" href="https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/regular-expressions/using-the-test-method">interactive coding challenges</a>.</p>
<h2 id="heading-how-to-use-the-match-method">How to use the <code>.match()</code> method</h2>
<p>So if regex is all about finding patterns in strings, you might be asking yourself what makes the <code>.match()</code> method so useful?</p>
<p>Unlike the <code>.test()</code> method which just returns <code>true</code> or <code>false</code>, <code>.match()</code> will actually return the match against the string you're testing. For example:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex1 = <span class="hljs-regexp">/are/</span>;
<span class="hljs-keyword">const</span> regex2 = <span class="hljs-regexp">/eat/</span>;

csLewisQuote.match(regex1); <span class="hljs-comment">// ["are", index: 3, input: "We are what we believe we are.", groups: undefined]</span>

csLewisQuote.match(regex2); <span class="hljs-comment">// null</span>
</code></pre>
<p>This can be really helpful for some projects, especially if you want to extract and manipulate the data that you're matching without changing the original string.</p>
<p>If all you want to know is if a search pattern is found or not, use the <code>.test()</code> method – it's much faster.</p>
<p>There are two main return values you can expect from the <code>.match()</code> method:</p>
<ol>
<li>If there's a match, the <code>.match()</code> method will return an array with the match. We'll go into more detail about this in a bit.</li>
<li>If there isn't a match, the <code>.match()</code> method will return <code>null</code>.</li>
</ol>
<p>Some of you might have already noticed this, but if you look at the example above, <code>.match()</code> is only matching the first occurrence of the word "are".</p>
<p>A lot of times you'll want to know how often a pattern is matched against the string you're testing, so let's take a look at how to do that with <code>.match()</code>.</p>
<h3 id="heading-different-matching-modes">Different matching modes</h3>
<p>If there's a match, the array that <code>.match()</code> returns had two different <em>modes</em>, for lack of a better term.</p>
<p>The first mode is when the global flag (<code>g</code>) isn't used, like in the example above:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex = <span class="hljs-regexp">/are/</span>;

csLewisQuote.match(regex); <span class="hljs-comment">// ["are", index: 3, input: "We are what we believe we are.", groups: undefined]</span>
</code></pre>
<p>In this case, we <code>.match()</code> an array with the first match along with the index of the match in the original string, the original string itself, and any matching groups that were used.</p>
<p>But say you want to see how many times the word "are" occurs in a string. To do that, just add the global search flag to your regular expression:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex = <span class="hljs-regexp">/are/g</span>;

csLewisQuote.match(regex); <span class="hljs-comment">// ["are", "are"]</span>
</code></pre>
<p>You won't get the other information included with the non-global mode, but you'll get an array with all the matches in the string you're testing.</p>
<h3 id="heading-case-sensitivity">Case sensitivity</h3>
<p>An important thing to remember is that regex is case sensitive. For example, say you wanted to see how many times the word "we" occurs in your string:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex = <span class="hljs-regexp">/we/g</span>;

csLewisQuote.match(regex); <span class="hljs-comment">// ["we", "we"]</span>
</code></pre>
<p>In this case, you're matching a lowercase "w" followed by a lowercase "e", which only occurs twice.</p>
<p>If you'd like all instances of the word "we" whether it's upper or lowercase, you have a couple of options.</p>
<p>First, you could use the <code>.toLowercase()</code> method on the string before testing it with the <code>.match()</code> method:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>.toLowerCase();
<span class="hljs-keyword">const</span> regex = <span class="hljs-regexp">/we/g</span>;

csLewisQuote.match(regex); <span class="hljs-comment">// ["we", "we", "we"]</span>
</code></pre>
<p>Or if you want to preserve the original case, you could add the case-insensitive search flag (<code>i</code>) to your regular expression:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex = <span class="hljs-regexp">/we/gi</span>;

csLewisQuote.match(regex); <span class="hljs-comment">// ["We", "we", "we"]</span>
</code></pre>
<h2 id="heading-the-new-matchall-method">The new <code>.matchAll()</code> method</h2>
<p>Now that you know all about the <code>.match()</code> method, it's worth pointing out that the <code>.matchAll()</code> method was recently introduced.</p>
<p>Unlike the <code>.match()</code> method which returns an array or <code>null</code>, <code>.matchAll()</code> requires the global search flag (<code>g</code>), and returns either an iterator or an empty array:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisQuote = <span class="hljs-string">'We are what we believe we are.'</span>;
<span class="hljs-keyword">const</span> regex1 = <span class="hljs-regexp">/we/gi</span>;
<span class="hljs-keyword">const</span> regex2 = <span class="hljs-regexp">/eat/gi</span>;

[...csLewisQuote.matchAll(regex1)]; 
<span class="hljs-comment">// [</span>
<span class="hljs-comment">//   ["We", index: 0, input: "We are what we believe we are.", groups: undefined],</span>
<span class="hljs-comment">//   ["we", index: 12, input: "We are what we believe we are.", groups: undefined]</span>
<span class="hljs-comment">//   ["we", index: 23, input: "We are what we believe we are.", groups: undefined]</span>
<span class="hljs-comment">// ]</span>

[...csLewisQuote.matchAll(regex2)]; <span class="hljs-comment">// []</span>
</code></pre>
<p>While it seems like just a more complicated <code>.match()</code> method, the main advantage that <code>.matchAll()</code> offers is that it works better with capture groups.</p>
<p>Here's a simple example:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisRepeat = <span class="hljs-string">"We We are are"</span>;
<span class="hljs-keyword">const</span> repeatRegex = <span class="hljs-regexp">/(\w+)\s\1/g</span>;

csLewisRepeat.match(repeatRegex); <span class="hljs-comment">// ["We We", "are are"]</span>
</code></pre>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> csLewisRepeat = <span class="hljs-string">"We We are are"</span>;
<span class="hljs-keyword">const</span> repeatRegex = <span class="hljs-regexp">/(\w+)\s\1/g</span>;

[...repeatStr.matchAll(repeatRegex)];

<span class="hljs-comment">// [</span>
<span class="hljs-comment">//   ["We We", "We", index: 0, input: "We We are are", groups: undefined],</span>
<span class="hljs-comment">//   ["are are", "are", index: 6, input: "We We are are", groups: undefined],</span>
<span class="hljs-comment">// ]</span>
</code></pre>
<p>While that just barely scratches the surface, keep in mind that it's probably better to use <code>.matchAll()</code> if you're using the <code>g</code> flag and want all the extra information that <code>.match()</code> provides for a single match (index, the original string, and so on).</p>
<h2 id="heading-how-to-use-the-replace-method">How to use the <code>.replace()</code> method</h2>
<p>So now that you know how to match patterns in strings, you'll probably want to do something useful with those matches.</p>
<p>One of the most common things you'll do once you find a matching pattern is replace that pattern with something else. For example, you might want to replace "paid" in "paidCodeCamp" with "free". Regex would be a good way to do that.</p>
<p>Since <code>.match()</code> and <code>.matchAll()</code> return information about the index for each matching pattern, depending on how you use it, you could use that to do some fancy string manipulation. But there's an easier way – by using the <code>.replace()</code> method.</p>
<p>With <code>.replace()</code>, all you need to do is pass it a string or regular expression you want to match as the first argument, and a string to replace that matched pattern with as the second argument:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> campString = <span class="hljs-string">'paidCodeCamp'</span>;
<span class="hljs-keyword">const</span> fCCString1 = campString.replace(<span class="hljs-string">'paid'</span>, <span class="hljs-string">'free'</span>);
<span class="hljs-keyword">const</span> fCCString2 = campString.replace(<span class="hljs-regexp">/paid/</span>, <span class="hljs-string">'free'</span>);

<span class="hljs-built_in">console</span>.log(campString); <span class="hljs-comment">// "paidCodeCamp"</span>
<span class="hljs-built_in">console</span>.log(fCCString1); <span class="hljs-comment">// "freeCodeCamp"</span>
<span class="hljs-built_in">console</span>.log(fCCString2); <span class="hljs-comment">// "freeCodeCamp"</span>
</code></pre>
<p>The best part is that <code>.replace()</code> returns a new string, and the original remains the same.</p>
<p>Similar to the <code>.match()</code> method, <code>.replace()</code> will only replace the first matched pattern it finds unless you use regex with the <code>g</code> flag:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> campString = <span class="hljs-string">'paidCodeCamp is awesome. You should check out paidCodeCamp.'</span>;
<span class="hljs-keyword">const</span> fCCString1 = campString.replace(<span class="hljs-string">'paid'</span>, <span class="hljs-string">'free'</span>);
<span class="hljs-keyword">const</span> fCCString2 = campString.replace(<span class="hljs-regexp">/paid/g</span>, <span class="hljs-string">'free'</span>);

<span class="hljs-built_in">console</span>.log(fCCString1); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out paidCodeCamp."</span>
<span class="hljs-built_in">console</span>.log(fCCString2); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out freeCodeCamp."</span>
</code></pre>
<p>And similar to before, whether you pass a string or a regular expression as the first argument, it's important to remember that the matching pattern is case sensitive:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> campString = <span class="hljs-string">'PaidCodeCamp is awesome. You should check out PaidCodeCamp.'</span>;
<span class="hljs-keyword">const</span> fCCString1 = campString.replace(<span class="hljs-string">'Paid'</span>, <span class="hljs-string">'free'</span>);
<span class="hljs-keyword">const</span> fCCString2 = campString.replace(<span class="hljs-regexp">/paid/gi</span>, <span class="hljs-string">'free'</span>);

<span class="hljs-built_in">console</span>.log(fCCString1); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out PaidCodeCamp."</span>
<span class="hljs-built_in">console</span>.log(fCCString2); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out freeCodeCamp."</span>
</code></pre>
<h2 id="heading-how-to-use-the-replaceall-method">How to use the <code>.replaceAll()</code> method</h2>
<p>Just like how <code>.match()</code> has a newer <code>.matchAll()</code> method, <code>.replace()</code> has a newer <code>.replaceAll()</code> method.</p>
<p>The only real difference between <code>.replace()</code> and <code>.replaceAll()</code> is that you need to use the global search flag if you use a regular expression with <code>.replaceAll()</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> campString = <span class="hljs-string">'paidCodeCamp is awesome. You should check out paidCodeCamp.'</span>;
<span class="hljs-keyword">const</span> fCCString1 = campString.replaceAll(<span class="hljs-string">'paid'</span>, <span class="hljs-string">'free'</span>);
<span class="hljs-keyword">const</span> fCCString2 = campString.replaceAll(<span class="hljs-regexp">/paid/g</span>, <span class="hljs-string">'free'</span>);

<span class="hljs-built_in">console</span>.log(fCCString1); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out freeCodeCamp."</span>
<span class="hljs-built_in">console</span>.log(fCCString2); <span class="hljs-comment">// "freeCodeCamp is awesome. You should check out freeCodeCamp."</span>
</code></pre>
<p>The real benefit with <code>.replaceAll()</code> is that it's a bit more readable, and replaces all matched patterns when you pass it a string as the first argument.</p>
<p>That's it! Now you know the basics of matching and replacing parts of strings with regex and some built-in JS methods. These were pretty simple examples, but I hope it still showed how powerful even a little bit of regex can be.</p>
<p>Was this helpful? How do you use the <code>.match()</code>, <code>.matchAll()</code>, <code>.replace()</code>, and <code>.replaceAll()</code> methods? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Find and Edit a Windows Hosts File ]]>
                </title>
                <description>
                    <![CDATA[ While the internet is only about 30 years old, in many ways the hosts file is a relic of its (not so ancient) past. In most cases you probably won't need to update your hosts file on Windows. But knowing where it is and how it works can be helpful ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-find-and-edit-a-windows-hosts-file/</link>
                <guid isPermaLink="false">66ac88022dd2c39dc134e0bc</guid>
                
                    <category>
                        <![CDATA[ Windows ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Wed, 18 Nov 2020 12:17:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5fd324f7e6787e098393d3ee.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>While the internet is only about 30 years old, in many ways the hosts file is a relic of its (not so ancient) past.</p>
<p>In most cases you probably won't need to update your hosts file on Windows. But knowing where it is and how it works can be helpful if:</p>
<ul>
<li>you're having trouble with local development</li>
<li>you suspect malware has tampered with the hosts file</li>
<li>you want a quick and simple way to block some websites</li>
<li>or if you want to set up some helpful shortcuts to internal IP addresses</li>
</ul>
<p>In this article we'll cover <a class="post-section-overview" href="#what-s-a-hosts-file-anyway">what a hosts file is</a>, <a class="post-section-overview" href="#how-to-edit-a-hosts-file-on-windows">how to edit it on Windows</a>, and we'll go over <a class="post-section-overview" href="#how-to-use-the-hosts-file-on-windows-10-to-block-websites">some neat tricks</a> you can do with it.</p>
<h2 id="heading-whats-a-hosts-file-anyway">What's a hosts file anyway?</h2>
<p>Back in the early days of the internet, before it was widespread, computers used a hosts file to map long, hard to remember IP addresses with much shorter, easier to remember hostnames.</p>
<p>For example, here's a line you'll find in many hosts files on Windows, Linux, and macOs:</p>
<pre><code><span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       localhost
</code></pre><p>That way, instead of having to remember a long IP address, all you had to do was visit localhost.</p>
<h3 id="heading-why-hosts-files-fell-out-of-favor">Why hosts files fell out of favor</h3>
<p>The hosts files system worked well for the early internet, but there were a few major problems.</p>
<p>As the internet grew, so did the length and complexity of the hosts files. Also, each hosts file only worked for the computer it was on, and keeping them in sync with the changes in hostnames and IP addresses became a huge pain.</p>
<p>For example, imagine that you have two computers, A and B. Their hosts files contain this mapping for google.com:</p>
<pre><code><span class="hljs-number">172.217</span><span class="hljs-number">.26</span><span class="hljs-number">.46</span>       google.com
</code></pre><p>But when Google updates their IP addresses, only computer A updates its hosts file to match:</p>
<pre><code><span class="hljs-number">172.217</span><span class="hljs-number">.175</span><span class="hljs-number">.78</span>       google.com
</code></pre><p>So everyone on computer B is stuck without Google until someone updates the hosts file. When that person does update the hosts file, they add another entry to handle Google with the www subdomain.</p>
<pre><code><span class="hljs-number">172.217</span><span class="hljs-number">.175</span><span class="hljs-number">.78</span>       google.com
<span class="hljs-number">172.217</span><span class="hljs-number">.175</span><span class="hljs-number">.78</span>       www.google.com
</code></pre><p>Now everyone on computer B is taken to the correct website whether they visit google.com or www.google.com.</p>
<p>And everyone on computer A can only visit google.com, not www.google.com, at least until its own hosts file is updated to match.</p>
<p>As you can imagine, hosts files would get complicated, fast.</p>
<h3 id="heading-the-solution">The solution</h3>
<p>If you're thinking that someone should have just made a central repository to map all IP addresses with all hostnames, that's exactly what happened.</p>
<p>Early on, a central hosts file was manually maintained and shared by the Stanford Research Institute. This system lead to the invention of domains and top level domains like .com and .edu, Whois, and it became increasingly automated.</p>
<p>In the end, the humble hosts file and innovators like <a target="_blank" href="https://en.wikipedia.org/wiki/Elizabeth_J._Feinler">Elizabeth J. Feinler</a> lead to the invention of the Domain Name System still in use today.</p>
<h2 id="heading-how-to-edit-a-hosts-file-on-windows">How to edit a hosts file on Windows</h2>
<p>To edit a hosts file on Windows 10, you'll need to open it as an administrator.</p>
<p>First, open Notepad as an administrator by pressing the Windows key, typing in "notepad", and clicking "Run as administrator":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image.png" alt="Image" width="600" height="400" loading="lazy">
<em>Note: You may need to click the arrow button to expand the dropdown to see the "Run as administrator" option</em></p>
<p>To open the hosts file in Notepad, click "File", "Open", and navigate to <code>C:\Windows\System32\drivers\etc</code>. </p>
<p>You won't be able to see any files in this directory because they aren't text documents. To change the file type, click on the dropdown in the bottom right of the Open menu and click on "All Files":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-1.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You'll see a file named <code>hosts</code>. Double click on that file to open it.</p>
<p>Then, you'll see a hosts file similar to this:</p>
<pre><code># Copyright (c) <span class="hljs-number">1993</span><span class="hljs-number">-2009</span> Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP <span class="hljs-keyword">for</span> Windows.
#
# This file contains the mappings <span class="hljs-keyword">of</span> IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed <span class="hljs-keyword">in</span> the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such <span class="hljs-keyword">as</span> these) may be inserted on individual
# lines or following the machine name denoted by a <span class="hljs-string">'#'</span> symbol.
#
# For example:
#
#      <span class="hljs-number">102.54</span><span class="hljs-number">.94</span><span class="hljs-number">.97</span>     rhino.acme.com          # source server
#       <span class="hljs-number">38.25</span><span class="hljs-number">.63</span><span class="hljs-number">.10</span>     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#    <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       localhost
#    ::<span class="hljs-number">1</span>             localhost
</code></pre><p>Note that everything is commented out with <code>#</code> characters, meaning that nothing is actually being read from the hosts file. Modern versions of Windows include a sort of DNS system already, so if you visit localhost it'll automatically redirect you to <code>127.0.0.1</code>.</p>
<p>With that out of the way, here are some things you can do with the hosts file.</p>
<h2 id="heading-how-to-update-the-hosts-file-on-windows-10-if-you-have-trouble-with-localhost">How to update the hosts file on Windows 10 if you have trouble with localhost</h2>
<p>If you're doing some local development and are having problems with localhost, you can just remove the comments from your hosts file:</p>
<pre><code>...
# localhost name resolution is handled within DNS itself.
<span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       localhost
::<span class="hljs-number">1</span>             localhost
</code></pre><p>After saving the hosts file, close Notepad.</p>
<p>Then, open PowerShell by pressing the Windows key, searching for "powershell", and clicking "Run as Administrator":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/powershell-run-as-administrator-1.jpg" alt="Screenshot showing how to open PowerShell as an administrator" width="600" height="400" loading="lazy"></p>
<p>In the PowerShell window, enter <code>ipconfig /flushdns</code> to flush the inbuilt Windows DNS:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-85.png" alt="Screenshot showing how to flush the Windows DNS with PowerShell" width="600" height="400" loading="lazy"></p>
<p>After that, you should be able to visit localhost in your browser and see whatever you're hacking on. If you're still having issues, try closing your browser completely, then open a new browser window and try again.</p>
<h2 id="heading-how-to-update-your-hosts-file-on-windows-10-if-you-think-its-been-tampered-with">How to update your hosts file on Windows 10 if you think it's been tampered with</h2>
<p>Even though hosts files have fallen out of favor with newer systems like DNS, they still work for legacy reasons. And hackers have definitely taken advantage of this in the past.</p>
<p>What they would do is point a common website like google.com towards an unsafe IP address. This IP address could serve a site that looks just like Google's, but is actually trying to steal your sensitive information.</p>
<p>While this was a problem in the past, most security software like the Windows Security Suite can recognize and fix problems with the hosts file automatically.</p>
<p>That said, if you open up your hosts file and see a lot of strange entries, then you may want to revert to the default Windows hosts file.</p>
<p>Just copy and paste the default hosts file from earlier in the article into your hosts file and save. Then, open PowerShell and use the <code>ipconfig /flushdns</code> command to flush the Windows DNS.</p>
<p>Note that some third-party security software uses the hosts file to block dangerous websites. If that's the case, no worries – your security software should add all those entries back to your hosts file. We'll go over how this works in the next section.</p>
<h2 id="heading-how-to-use-the-hosts-file-on-windows-10-to-block-websites">How to use the hosts file on Windows 10 to block websites</h2>
<p>Don't want friends or family to visit certain websites on your computer? Or are you like me and get distracted by all the cat photos on the internet?</p>
<p>If so, then you can use the hosts file to block websites entirely.</p>
<p>For example, if you want to block Reddit, just add this to the bottom of your hosts file:</p>
<pre><code><span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>     reddit.com
<span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>     www.reddit.com
</code></pre><p>Then, open PowerShell and run <code>ipconfig /flushdns</code> to flush the Windows 10 DNS. Also, close the browser windows that are open and reopen them.</p>
<p>After that, every time you try to visit Reddit, or click on a Reddit URL like <a target="_blank" href="https://www.reddit.com/r/FreeCodeCamp/">https://www.reddit.com/r/FreeCodeCamp/</a>, your browser will be redirected to <code>127.0.0.1</code>, or localhost.</p>
<p>Since there's no website there, your browser will show an error message:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-86.png" alt="Screenshot of error message after blocking reddit.com in the hosts file and visiting it in the browser" width="600" height="400" loading="lazy"></p>
<p>The one downside is that this only works on one device – you could just reach for your phone and browse Reddit on that instead. Still, it's a neat way to create some friction on your work computer.</p>
<p>This leads nicely into the last trick, which is to use the hosts file to make your life a little bit easier.</p>
<h2 id="heading-how-to-use-the-hosts-file-on-windows-10-to-set-up-helpful-shortcuts">How to use the hosts file on Windows 10 to set up helpful shortcuts</h2>
<p>If you spend a lot of time adjusting your router's settings, or you have a cool project running on a <a target="_blank" href="https://www.freecodecamp.org/news/build-a-personal-dev-server-on-a-5-dollar-raspberry-pi/">Raspberry Pi</a>, you'll know that typing in a long IP address is a drag.</p>
<p>Instead, you can use the hosts file to make connecting to other devices on your local network much faster.</p>
<p>For example, if your router is at <code>192.168. 0.1</code>, you can add the following to your hosts file:</p>
<pre><code><span class="hljs-number">192.168</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       my.router
</code></pre><p>Then, flush your Windows 10 DNS with <code>ipconfig /flushdns</code> and restart your browser.</p>
<p>And then any time you visit my.router, you should be redirected to <code>192.168.0.1</code>.</p>
<p>Just note that you may need to visit http://my.router, at least the first time. Otherwise your browser might not recognize .router as a valid top-level domain (TLD), and will try to search for the term my.router instead.</p>
<p>To get around this, you could use a hostname like this instead:</p>
<pre><code><span class="hljs-number">192.168</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       router.my
</code></pre><p>This should work right away because .my is the TLD for people and companies in Malaysia.</p>
<p>Fortunately there are a whole lot of valid TLDs nowadays. Here's a list of some of the most common TLDs out there: <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains">https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains</a></p>
<p>Again, the one downside to this method is that it only works on once device. You'd have to update the hosts files on your other devices to enable the same shortcuts.</p>
<p>And that should be just about everything you need to know about the hosts file on Windows 10. And a lot of this knowledge should carry over to Linux and macOS.</p>
<p>So get out there and customize your hosts file like the pioneers of the internet once did.</p>
<p>Did you find this helpful? Are there any other hosts file tricks you know? Let me know over on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
<p>Stay safe and happy hosts file editing!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Antimalware Service Executable: What is MsMpEng.exe and Why is it Running in Windows 10? ]]>
                </title>
                <description>
                    <![CDATA[ If you've ever checked the Windows Task Manager to see why your computer is running so slow, you might have noticed a process called Antimalware Service Executable using a lot of the available CPU or memory. The Antimalware Service Executable, or MsM... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/antimalware-service-executable-what-is-msmpeng-exe-and-why-is-it-running-in-windows-10/</link>
                <guid isPermaLink="false">66ac87e859c54e72c773090c</guid>
                
                    <category>
                        <![CDATA[ Security ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kristofer Koishigawa ]]>
                </dc:creator>
                <pubDate>Sun, 15 Nov 2020 07:45:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5fa4ff2649c47664ed81af1d.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you've ever checked the Windows Task Manager to see why your computer is running so slow, you might have noticed a process called Antimalware Service Executable using a lot of the available CPU or memory.</p>
<p>The Antimalware Service Executable, or MsMpEng.exe, is part of the Windows Security suite that ships with Windows 10. Windows Security includes everything from anti-malware tools, to a firewall, account management and protection services, and more.</p>
<p>Your computer might run slowly at certain times because Windows Security is doing an automated malware detection scan. Occasionally this scan might run into issues with certain files, folders, or software, even if they're secure.</p>
<p>In this article we'll go over a few things you can do to improve Windows Security's performance.</p>
<h2 id="heading-1-check-for-third-party-anti-malware-software">#1: Check for third-party anti-malware software</h2>
<p>It's generally recommended that you only run one anti-malware/anti-virus/anti-spyware software on your PC at a time. </p>
<p>Running Windows Security and third-party software like Malwarebytes together can cause issues where they both recognize each other as potential threats. This can lead to situations where neither works properly.</p>
<p>Windows Security is considered to be very secure, so it's safe to remove third-party security software. Simply uninstall the third party software and reboot your computer.</p>
<p>Then to check that Windows Security is running, press the Windows key, type in "windows security", and click on "Windows Security" to open the app:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/image-23.png" alt="How to open the Windows Security app in the Windows Start Menu" width="600" height="400" loading="lazy">
<em>Open the Windows Security app</em></p>
<p>Click on "Virus &amp; threat protection", and click "Manage settings" under "Virus &amp; threat protection settings":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/virus-protection-manage-settings.jpg" alt="Screenshot of the Virus &amp; threat protection menu" width="600" height="400" loading="lazy">
<em>The Virus &amp; threat protection menu</em></p>
<p>Once in the "Virus &amp; threat protection settings" menu, ensure that the "Real-time protection" toggle is on:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/real-time-protection-toggle.jpg" alt="Check that the &quot;Real-time&quot; protection toggle is on" width="600" height="400" loading="lazy"></p>
<p>Alternatively, if you'd like to use third-party security software, just install and configure that first. Then repeat the steps above and turn the "Real-time protection" toggle off. </p>
<p>This will prevent Windows Security from scanning and potentially flagging your third-party software as insecure.</p>
<h2 id="heading-2-prevent-windows-security-from-scanning-certain-files-and-folders">#2: Prevent Windows Security from scanning certain files and folders</h2>
<p>As mentioned earlier, Windows Security can sometimes run into issues while scanning certain files, folders, and executable programs.</p>
<p>Though you do want Windows Security to scan as much of your system as possible, there are some things you can safely exclude to reduce the amount of CPU and memory it uses.</p>
<h3 id="heading-prevent-windows-security-from-scanning-msmpengexe">Prevent Windows Security from scanning MsMpEng.exe</h3>
<p>The first thing you can try is to prevent the Antimalware Service Executable process from scanning itself.</p>
<p>Press the Windows key, type in "windows security", and click on "Windows Security" to open the Windows Security app.</p>
<p>Click on "Virus &amp; threat protection", and click on "Manage settings" under "Virus &amp; threat protection settings":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/virus-protection-manage-settings-1.jpg" alt="Screenshot of the &quot;Virus &amp; threat protection&quot; menu" width="600" height="400" loading="lazy">
<em>The "Virus &amp; threat protection" menu</em></p>
<p>In the "Virus &amp; threat protection settings" menu, scroll down to "Exclusions" and click on "Add or remove exclusions":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/add-or-remove-exclusions-button.jpg" alt="Screenshot of the &quot;Add or remove exclusions&quot; button" width="600" height="400" loading="lazy"></p>
<p>Then click the plus button with the text "Add an exclusion", and click "File":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/exclusions-file.jpg" alt="Screenshot of selecting &quot;File&quot; from the &quot;Exclusions&quot; menu" width="600" height="400" loading="lazy"></p>
<p>Then in the File Explorer window, select <code>C:\Program Files\Windows Defender\MsMpEng</code> and click "Open":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/select-msmpeng-1.jpg" alt="Screenshot selecting MsMpEng" width="600" height="400" loading="lazy"></p>
<p>Now Windows Security will skip over the Antimalware Service Executable/MsMpEng.exe file while scanning for malware, and should use less available CPU and memory than before.</p>
<h3 id="heading-prevent-windows-security-from-scanning-the-windows-defender-directory">Prevent Windows Security from scanning the Windows Defender directory</h3>
<p>Similar to the last method of skipping over the Antimalware Service Executable, it's possible to exclude the entire Windows Defender directory from anti-malware scans.</p>
<p>Follow the steps from the last method, but after clicking the "Add an exclusion" button, select "Folder" instead:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/exclusions-folder.jpg" alt="Screenshot of selecting &quot;Folder&quot; from the &quot;Exclusions&quot; menu" width="600" height="400" loading="lazy"></p>
<p>Then in the File Explorer window that pops up, select <code>C:\Program Files\Windows Defender</code> and click "Select Folder":</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/12/select-windows-defender-folder.jpg" alt="Screenshot selecting Windows Defender folder" width="600" height="400" loading="lazy"></p>
<p>And now Windows Security will skip over everything in the Windows Defender folder, including the MsMpEng.exe file itself.</p>
<h2 id="heading-3-consider-upgrading-your-pc">#3: Consider upgrading your PC</h2>
<p>If none of the other solutions work, it might be worth upgrading parts of your PC. As of 2020, new PCs are often configured with at least 8 GB of RAM and a solid-state drive (SSD) rather than an older hard disk drive (HDD). And increasingly, software is written with those minimum specs in mind.</p>
<p>If your computer is older and has less RAM and a slower HDD, consider adding more RAM and doing a clean install of Windows 10 on an SSD. </p>
<p>This won't solve the issue of the Antimalware Service Executable using 100% of the CPU, but more RAM and a faster SSD will ensure that anti-malware scans are completed much faster overall. Also, you'll find that everything from booting your computer to opening and saving files is much faster than before.</p>
<p>While PC upgrades are outside the scope of this tutorial, it's worth considering as an option – just a couple new (or used!) parts can make an older computer feel like an entirely different machine.</p>
<h2 id="heading-in-summary">In summary</h2>
<p>There are a bunch of reasons why the Antimalware Service Executable/MsMpEng.exe could cause a system to slow down. But usually it'll only use a lot of the available CPU and memory when it's scanning for malware. </p>
<p>So really the trick is to speed up the malware scan itself – check for conflicting security software, limit the files and folders it has to scan, or consider upgrading your PC's hardware.</p>
<p>Did any of these methods work for you? Or did you find something else that solved the issue? Either way, let me know on <a target="_blank" href="https://twitter.com/kriskoishigawa">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
