<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Achal Tiwari</title>
    <description>The latest articles on DEV Community by Achal Tiwari (@achal_tiwari).</description>
    <link>https://dev.to/achal_tiwari</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1591815%2F38b2aaa5-cca4-4549-b562-1de4e59c313c.png</url>
      <title>DEV Community: Achal Tiwari</title>
      <link>https://dev.to/achal_tiwari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/achal_tiwari"/>
    <language>en</language>
    <item>
      <title>AI's Architecture: Infrastructure Realities Behind the Hype | Electricity or Bubble?</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Thu, 31 Jul 2025 05:04:10 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/ais-architecture-infrastructure-realities-behind-the-hype-electricity-or-bubble-9h7</link>
      <guid>https://dev.to/achal_tiwari/ais-architecture-infrastructure-realities-behind-the-hype-electricity-or-bubble-9h7</guid>
      <description>&lt;p&gt;The conversation around artificial intelligence often swings between two extremes: is it the new electricity, a utility that will redefine society, or the next dot-com bubble, a speculative frenzy destined for collapse? This binary view, however, misses the more crucial story. The real answer lies in the complex and fragile infrastructure upon which this revolution is being built.&lt;/p&gt;

&lt;p&gt;To truly understand AI's trajectory, we must look past the user-facing applications and analyze its underlying systems. Are we building a robust, scalable utility grid, or are we running a collection of brilliant but brittle prototypes?&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a Technology a Utility?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69jlgjxdbdwwat8u6r3l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69jlgjxdbdwwat8u6r3l.jpg" alt="AI Blueprint" width="720" height="403"&gt;&lt;/a&gt;&lt;br&gt;
The "new electricity" analogy is powerful, but it demands a precise understanding of what made electricity a true utility. It wasn't just a single discovery, but the maturation of a multi-layered system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standardized Generation&lt;/strong&gt;: The "war of the currents" between AC and DC was settled, leading to standardized, large-scale power generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Distribution&lt;/strong&gt;: A robust, interconnected grid was built to transmit power efficiently over long distances, managing loads and ensuring consistent availability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Universal Interface&lt;/strong&gt;: The simple wall socket provided a predictable, reliable interface for countless applications, abstracting away the grid's immense complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Judged by these criteria, AI is not yet electricity. It lacks a standardized generation method, a truly scalable distribution network, and a universally reliable interface. Its architecture reveals a system under immense strain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Pillars of AI's Architecture: A Foundation Under Stress
&lt;/h2&gt;

&lt;p&gt;The current AI boom rests on three critical—and precarious—pillars. Each carries systemic risks that are often ignored in the rush to deploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Hardware Stack: A Geopolitical Monolith
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.reuters.com%2Fresizer%2Fv2%2FV5U3EZCV5NNZXHTJZXCJ26EZOI.jpg%3Fauth%3D7888c5005171dac3fb066670451b1eb4f2486ed519181da6c1c20fdccc358979%26width%3D5300%26quality%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.reuters.com%2Fresizer%2Fv2%2FV5U3EZCV5NNZXHTJZXCJ26EZOI.jpg%3Fauth%3D7888c5005171dac3fb066670451b1eb4f2486ed519181da6c1c20fdccc358979%26width%3D5300%26quality%3D80" alt="TSMC" width="720" height="479"&gt;&lt;/a&gt;&lt;br&gt;
Modern AI is, for all practical purposes, synonymous with massively parallel processing on Graphics Processing Units (GPUs). This has created a hardware stack with an unprecedented level of concentration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The GPU Monopoly&lt;/strong&gt;: One company, NVIDIA, holds a commanding position, accounting for an estimated 98% of the data center GPU market as of late 2023, according to Jon Peddie Research. Its CUDA software ecosystem has created a deep, defensible moat, making it difficult for competitors to gain traction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Fabrication Bottleneck&lt;/strong&gt;: This dependency is magnified at the manufacturing level. NVIDIA, like most fabless chip designers, relies on TSMC in Taiwan to produce its most advanced chips. For the most advanced nodes (below 7nm), TSMC's market share consistently exceeds 90%, as reported by industry analysts like Counterpoint Research.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a systems perspective, this is a single point of failure of global significance. The entire AI ecosystem is built on a supply chain that is geographically concentrated and geopolitically fragile. This creates supply volatility, high costs, and a platform risk that is almost impossible to mitigate—the antithesis of a resilient, decentralized infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Energy Stack: A Crisis of Scale
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Famy9n5aazzfbp967w0qs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Famy9n5aazzfbp967w0qs.png" alt="Graph Showing AI Energy Consumption" width="800" height="488"&gt;&lt;/a&gt;&lt;br&gt;
The computational demands of the hardware stack create a secondary crisis: energy consumption.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unsustainable Growth&lt;/strong&gt;: A 2023 study published in the journal Joule estimated that if the current growth trajectory continues, the AI sector alone could consume between 85 and 134 terawatt-hours (TWh) of electricity annually by 2027. To put that in perspective, that's comparable to the annual electricity consumption of entire countries like Argentina or the Netherlands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Center Design Limits&lt;/strong&gt;: AI workloads challenge traditional data center design. The power density required by racks of modern GPUs exceeds the cooling and power delivery capabilities of many existing facilities. This is driving a costly new wave of data center construction specifically for AI, further increasing the barrier to entry and the environmental footprint.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Electricity became a utility by providing energy efficiently. AI, in its current form, consumes that energy at a rate that strains the very grid it seeks to emulate.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Algorithm Stack: The Brittle Logic of Static Models
&lt;/h3&gt;

&lt;p&gt;Perhaps the most misunderstood aspect of the AI stack is the nature of the models themselves. LLMs are not dynamic, learning entities. They are static, compiled artifacts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autoregressive Error&lt;/strong&gt;: Models like those in the GPT family are autoregressive; they predict the next word based on the sequence of words generated so far. This architecture has a critical flaw: errors compound. A small deviation early in a response can cascade into a completely fabricated output—a "hallucination." This is not a bug to be patched but a fundamental characteristic of the design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Certainty Problem&lt;/strong&gt;: Automation requires deterministic behavior within known constraints. The probabilistic nature of LLMs makes them unsuited for mission-critical tasks where certainty is non-negotiable. For systems that power finance, logistics, or medicine, "mostly right" is the same as "untrustworthy."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Flawed API: Integrating a Probabilistic System
&lt;/h2&gt;

&lt;p&gt;The final challenge lies at the integration layer. The current trend is to bolt AI onto existing products, treating it as a drop-in replacement for human-curated data or deterministic search. This is a profound architectural mistake.&lt;/p&gt;

&lt;p&gt;Google's AI Overviews are a case in point. By inserting a probabilistic, generative system into a workflow where users expect a deterministic list of links to source material, they broke the user's trust and intent. The user's query is an API call; the expected response was a set of reliable pointers, but the new system returns a sometimes-unreliable, synthesized summary with no clear provenance. This reveals a core crisis in how we design systems with AI. It is not an all-purpose tool. It is a specific type of engine with unique properties and failure modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: From Prototype to Utility—The Engineering Challenge Ahead
&lt;/h2&gt;

&lt;p&gt;The architecture of modern AI does not yet resemble a public utility. It looks like a brilliant, world-changing prototype: over-centralized, energy-inefficient, and built on brittle logic. But to dismiss it as a bubble is to miss the point. These are not dead ends; they are the next great engineering frontiers.&lt;/p&gt;

&lt;p&gt;The history of technology is the history of overcoming such obstacles. The early electrical grid faced its own immense challenges: warring AC/DC standards, immense capital costs, and public fears over safety. It matured from a novelty into a utility through relentless innovation.&lt;/p&gt;

&lt;p&gt;AI is on the same path. The challenges of today are seeding the innovations of tomorrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware Diversification&lt;/strong&gt;: The industry is aggressively pursuing alternatives to the current monoculture, from new chip architectures and optical computing to brain-inspired neuromorphic processors that promise orders-of-magnitude gains in efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Algorithmic Efficiency&lt;/strong&gt;: Researchers are developing more efficient models, like Mixture-of-Experts (MoE), and new techniques to ground models in verifiable facts, directly tackling the problems of cost and hallucination.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sustainable Infrastructure&lt;/strong&gt;: The energy crisis is driving innovation in everything from liquid cooling in data centers to intelligent workload management, forcing a necessary reckoning with efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transition from an experimental prototype to a foundational utility is never easy. It requires moving beyond the initial hype and engaging in the difficult, deliberate work of building robust, reliable, and sustainable systems. This is the defining engineering challenge of our time, and its solution will truly bring us into the age of AI.&lt;/p&gt;




&lt;p&gt;Thank you for reading. My own neural network runs on caffeine. If you found this deep dive valuable, you can help power the next one &lt;a href="https://buymeacoffee.com/vx6fid" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>systemsengineering</category>
      <category>gpu</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>How One Bad Packet Can Take Down the Internet: Welcome to BGP</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Sat, 14 Jun 2025 14:59:40 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/how-one-bad-packet-can-take-down-the-internet-welcome-to-bgp-38cd</link>
      <guid>https://dev.to/achal_tiwari/how-one-bad-packet-can-take-down-the-internet-welcome-to-bgp-38cd</guid>
      <description>&lt;p&gt;When you type “google.com” and hit enter, your computer doesn’t just talk to Google. It launches a journey through a chaotic web of networks—thousands of them, run by different companies, countries, and competitors. Somehow, your data weaves through all of them and ends up exactly where it’s supposed to.&lt;/p&gt;

&lt;p&gt;How?&lt;/p&gt;

&lt;p&gt;The short answer is a protocol called &lt;strong&gt;BGP&lt;/strong&gt;—Border Gateway Protocol. It’s the system that tells all these independent networks how to find each other. But calling BGP a “routing protocol” is like calling diplomacy just “talking.” It’s not just technical. It’s political, fragile, and surprisingly old.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Where BGP Came From (and Why That Matters)
&lt;/h4&gt;

&lt;p&gt;Back in the early days of the Internet—when it was basically just a U.S. research network—routing was easy. The whole thing was small, centralized, and trusted. The protocol at the time, &lt;strong&gt;EGP (Exterior Gateway Protocol)&lt;/strong&gt;, assumed that one central backbone would manage traffic for everyone else. It was top-down, like a tree. That made sense when the only people online were universities and government labs.&lt;/p&gt;

&lt;p&gt;Then the Internet exploded.&lt;/p&gt;

&lt;p&gt;Commercial ISPs came online. So did global telecoms, universities from around the world, private networks, military infrastructure—each with their own priorities. Suddenly, that neat hierarchy collapsed. Nobody wanted to be told how to route traffic. They wanted &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So in 1989, two engineers—Kirk Lougheed from Cisco and Yakov Rekhter from IBM—scribbled down a new idea at an IETF meeting on napkin. That sketch became BGP. Instead of assuming trust or central control, BGP let &lt;strong&gt;each network decide for itself&lt;/strong&gt; what routes to share, what routes to accept, and how to reach the rest of the Internet.&lt;/p&gt;

&lt;p&gt;In 1989, at an IETF meeting, two engineers—Kirk Lougheed (Cisco) and Yakov Rekhter (IBM)—sketched a new idea on a napkin. That sketch became BGP.&lt;/p&gt;

&lt;p&gt;Unlike its predecessors, BGP didn’t assume central control or mutual trust. Instead, it handed autonomy to each network: decide what to share, what to accept, and how to reach the rest of the internet—on your own terms.&lt;/p&gt;

&lt;p&gt;It wasn’t built for harmony. It was built for &lt;strong&gt;distrust&lt;/strong&gt;—and that’s exactly why it worked. &lt;em&gt;Below is the original BGP protocol sketched at an IETF meeting, 1989.&lt;/em&gt;&lt;/p&gt;

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

&lt;h4&gt;
  
  
  BGP Doesn’t Find the Best Path—It Finds an Acceptable One
&lt;/h4&gt;

&lt;p&gt;Most people assume that the Internet is optimized. That your traffic always takes the shortest or fastest route. That’s not how BGP works.&lt;/p&gt;

&lt;p&gt;Where traditional routing protocols like &lt;strong&gt;OSPF&lt;/strong&gt; or &lt;strong&gt;RIP&lt;/strong&gt; focus on efficiency—metrics like hop count, link speed, or latency—&lt;strong&gt;BGP is all about policy&lt;/strong&gt;. ISPs and network operators use it to make routing decisions based on &lt;strong&gt;business deals&lt;/strong&gt;, &lt;strong&gt;geopolitical constraints&lt;/strong&gt;, or &lt;strong&gt;technical limitations&lt;/strong&gt;. They might avoid a perfectly good path because it goes through a rival network. Or prefer a longer path because it’s cheaper.&lt;/p&gt;

&lt;p&gt;This flexibility is why BGP became the backbone of the Internet. But it also means that routing decisions aren’t always rational—or even safe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; BGP doesn’t care about the “best” route. It cares about what networks are willing to accept.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That trade-off—flexibility over optimization—is why your traffic might go through five countries to reach a server across the street. It’s also why a mistake by one small ISP can knock YouTube offline for half the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  How BGP Picks a Path (and Why It’s Not the One You Expect)
&lt;/h3&gt;

&lt;p&gt;Let’s say your packet wants to get from Mumbai to London. There are a dozen possible routes it could take—some fast, some slow, some cheap, some political. So how does the Internet decide?&lt;/p&gt;

&lt;p&gt;It doesn’t. &lt;strong&gt;BGP does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But BGP doesn’t look for the shortest route. It doesn’t test for latency, bandwidth, or even congestion. Instead, it runs a &lt;strong&gt;path-selection process&lt;/strong&gt; based on what networks &lt;em&gt;want&lt;/em&gt; to happen. That’s because BGP isn’t just a routing protocol—it’s a &lt;strong&gt;policy engine disguised as infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  What BGP Really Does: Think Diplomacy, Not Math
&lt;/h4&gt;

&lt;p&gt;BGP is what’s called a &lt;strong&gt;path-vector protocol&lt;/strong&gt;. That means every route announcement includes a complete list of which networks (Autonomous Systems, or ASes) the traffic will pass through. This list is called the &lt;strong&gt;AS-PATH&lt;/strong&gt;, and it's central to how BGP prevents routing loops and evaluates options.&lt;/p&gt;

&lt;p&gt;Each BGP router builds a table of all the known paths to every reachable IP prefix—and then it runs a strict decision algorithm to pick just one "best" path. But “best” in BGP doesn’t mean “fastest” or “shortest.” It means &lt;strong&gt;most acceptable&lt;/strong&gt; under the local network’s policies.&lt;/p&gt;

&lt;p&gt;Here’s how the decision process works, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local Preference&lt;/strong&gt;: Set manually by the network operator. This overrides everything. If your ISP decides traffic to Google should go through France, that’s what happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AS-PATH Length&lt;/strong&gt;: Fewer AS hops are better—&lt;em&gt;if&lt;/em&gt; Local Preference doesn’t override it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Origin Type&lt;/strong&gt;: Prefer routes originated via IGP (interior) over those redistributed from EGP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MED (Multi-Exit Discriminator)&lt;/strong&gt;: If two routes come from the same neighbor, pick the one that prefers a specific link.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;eBGP Over iBGP&lt;/strong&gt;: External BGP routes are considered more trustworthy than internal ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Router ID&lt;/strong&gt;: A final tie-breaker based on the unique ID of the advertising router.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At a glance, it feels like a cascade of technical preferences. But step back, and it’s clear: the entire system is &lt;strong&gt;rigged for policy control&lt;/strong&gt;. The real authority sits at the top—Local Preference—a setting that network operators configure explicitly to enforce their business, legal, or geopolitical goals.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Local Preference Comes First (And What That Means for You)
&lt;/h4&gt;

&lt;p&gt;This is where BGP reveals its real nature. Performance? Efficiency? Not the priority. Instead, the protocol empowers every AS to shape routing based on &lt;strong&gt;who pays whom&lt;/strong&gt;, &lt;strong&gt;who trusts whom&lt;/strong&gt;, and &lt;strong&gt;who can’t legally send data where&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break that down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Peering vs. Transit&lt;/strong&gt;: A network might route traffic through a slower peering connection to avoid paying for transit. Even if the performance is worse, the cost savings win.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regulatory Compliance&lt;/strong&gt;: In countries with data sovereignty laws, ISPs are required to keep domestic traffic within national borders—even if the shortest path is international. So your data might take a detour just to stay legal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Political Tensions&lt;/strong&gt;: Some ASes intentionally avoid routes that pass through rivals or untrusted regions. If two countries are in conflict, their ISPs might refuse to peer directly, forcing traffic onto inefficient paths.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s not a bug. It’s how the protocol was designed to work. The idea was never to build a fast or elegant Internet—it was to let thousands of networks &lt;strong&gt;cooperate without giving up control&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Real-World Consequence: Strange Routes, Slow Latency, and Zero Transparency
&lt;/h4&gt;

&lt;p&gt;If you’ve ever wondered why your request to a nearby server takes a bizarre, international route before looping back—it’s probably BGP. The router didn’t pick the shortest option. It picked the one that matched business rules.&lt;/p&gt;

&lt;p&gt;And there’s no easy way to tell. BGP decisions are made behind closed doors, based on settings most users never see and deals that aren’t public. So while your browser waits, your data might be visiting Frankfurt, because someone somewhere prefers it that way.&lt;/p&gt;

&lt;h3&gt;
  
  
  BGP’s Fatal Flaw: It Assumes Trust (And That’s a Problem)
&lt;/h3&gt;

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

&lt;p&gt;BGP, for all its complexity, runs on a shockingly simple assumption: &lt;strong&gt;every network is honest&lt;/strong&gt;. That’s it. There’s no built-in authentication, no cryptographic checks, no enforcement. If a network claims to own an IP block, BGP believes it. If it says “send traffic here,” the rest of the Internet shrugs and obeys.&lt;/p&gt;

&lt;p&gt;This isn’t a design oversight—it’s how the protocol was built. In 1989, the architects of BGP weren’t trying to defend against adversarial states or profit-driven hijackers. They were trying to get Stanford, MIT, and the NSF backbone to talk to each other. Trust wasn’t just assumed—it was baked into the system.&lt;/p&gt;

&lt;p&gt;That trust still runs the global internet today. And sometimes, it breaks. Badly.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  The YouTube Blackhole: When a Country Took Down a Global Platform
&lt;/h4&gt;

&lt;p&gt;In 2008, Pakistan’s telecom regulator ordered ISPs to block YouTube nationwide. Instead of filtering it at the DNS level or using a firewall, Pakistan Telecom took a more blunt approach: it announced a &lt;strong&gt;more specific BGP route&lt;/strong&gt; to YouTube’s IP range, pointing the traffic to a null destination. A kind of digital sinkhole.&lt;/p&gt;

&lt;p&gt;Locally, this worked. Users in Pakistan trying to access YouTube got nothing. But here’s the catch: the route didn’t stay local.&lt;/p&gt;

&lt;p&gt;Due to a misconfiguration—or perhaps simply a failure to filter outbound announcements—the fake route propagated to Pakistan Telecom’s upstream provider. From there, it spread to the global internet.&lt;/p&gt;

&lt;p&gt;And because BGP always prefers &lt;strong&gt;more specific routes&lt;/strong&gt; (a /24 beats a /16), the forged announcement from Pakistan overrode YouTube’s legitimate one. For hours, much of the world’s YouTube traffic was rerouted into a black hole.&lt;/p&gt;

&lt;p&gt;There was no malicious hack. No zero-day exploit. Just a misstep—and a protocol that trusted what it shouldn’t.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why This Keeps Happening
&lt;/h4&gt;

&lt;p&gt;The YouTube hijack wasn’t a one-off glitch. BGP route leaks and hijacks are frequent, often accidental, and occasionally exploited for strategic or economic gain.&lt;/p&gt;

&lt;p&gt;Here’s why these failures are baked into the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Authentication&lt;/strong&gt;: BGP has no native way to check whether an AS actually owns or is authorized to announce a given IP prefix. It just takes the announcement at face value.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specificity Bias&lt;/strong&gt;: BGP always prefers the most specific prefix. That makes /24 hijacks easy and dangerous. Even if a legitimate network announces a /16, a rogue /24 will win.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global Scope&lt;/strong&gt;: A single bad announcement can propagate worldwide in seconds. And unless someone’s watching—and has the power to filter—it won’t stop.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A Pattern of High-Stakes Failures
&lt;/h4&gt;

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

&lt;p&gt;Here’s how that trust model has repeatedly collapsed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;What Happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;China Telecom Route Leak&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;37,000 prefixes—including U.S. government and military traffic—were briefly routed through China due to an accidental leak.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Russian ISP Hijack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A Russian provider announced routes belonging to financial services like Visa and Mastercard. Traffic detoured through Russia for over an hour.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Facebook BGP Withdrawal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facebook’s own routers mistakenly withdrew their prefixes. Without BGP routes, Facebook, WhatsApp, and Instagram effectively vanished from the internet.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice the variety here: not all were malicious. Some were misconfigurations. But the outcome is the same—&lt;strong&gt;global disruption triggered by a local decision&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trust Without Verification Is Fragile
&lt;/h4&gt;

&lt;p&gt;The internet, despite its reputation for being robust and decentralized, hinges on a protocol that has no way to verify claims. And while proposals like RPKI (Resource Public Key Infrastructure) aim to fix this, adoption remains incomplete. Many networks still run wide open—able to be spoofed, hijacked, or leaked.&lt;/p&gt;

&lt;p&gt;So when someone asks, “How can one small ISP cause a global outage?” the real answer is: &lt;strong&gt;because BGP lets them&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why BGP Is So Hard to Fix: Securing a Protocol That Assumes Trust
&lt;/h3&gt;

&lt;p&gt;BGP’s security flaws aren’t news. Engineers have known for decades that &lt;strong&gt;any network can claim any IP prefix&lt;/strong&gt;, and most of the internet will accept it. The real question is: &lt;strong&gt;why hasn’t this been fixed?&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The Fixes Exist—They Just Don’t Scale
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RPKI&lt;/strong&gt; cryptographically verifies route ownership. But adoption is low (~40%) and misconfigurations can cause valid routes to be dropped. Few networks want to risk breaking reachability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BGPsec&lt;/strong&gt; validates every hop in the AS path using cryptographic signatures. It solves path spoofing—but is &lt;strong&gt;too heavy to deploy&lt;/strong&gt; at internet scale. Routers aren’t built for it, and nobody wants the overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual filtering&lt;/strong&gt; (ISPs hand-picking acceptable routes) is still common. But it’s tedious, error-prone, and doesn’t scale to 70,000+ networks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why This Isn’t Fixed Already
&lt;/h4&gt;

&lt;p&gt;BGP has no central authority. Unlike HTTPS—where browsers enforce standards—&lt;strong&gt;no one can compel ISPs to secure their routing&lt;/strong&gt;. The incentives are misaligned: the benefits of securing BGP are global, but the costs are local. Most networks don’t see a direct return on securing routes for others.&lt;/p&gt;

&lt;p&gt;Worse, new defenses carry risk. Misconfigured RPKI can cause legitimate outages. So many networks choose reliability over security. It’s a rational response to a fragile system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Beyond Tech: BGP Is Political
&lt;/h4&gt;

&lt;p&gt;Routing isn’t just technical—it’s geopolitical. Countries like &lt;strong&gt;China and Russia use BGP to enforce domestic control&lt;/strong&gt;, routing traffic through national infrastructure. Meanwhile, big content providers bypass traditional ISPs using &lt;strong&gt;private interconnects&lt;/strong&gt;, reshaping who controls traffic flow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Built-In Trade-Off: Stability Over Speed
&lt;/h4&gt;

&lt;p&gt;BGP is slow to converge by design. That’s what keeps the internet stable—but it also means hijacks and outages can persist for minutes or hours. It resists change for the same reason it resists collapse: conservatism is a survival strategy.&lt;/p&gt;

&lt;p&gt;BGP’s problems aren’t a secret. They’re just embedded in the architecture, incentives, and power structures that define the internet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts: The Internet Runs on Trust, Not Design
&lt;/h3&gt;

&lt;p&gt;BGP wasn’t built for scale or security—it was built for trust. And that trust is wearing thin.&lt;/p&gt;

&lt;p&gt;Its flaws are obvious: no authentication, policy over performance, and fragile convergence. But that’s also what makes it work. Not because it’s well-designed, but because every player has just enough incentive not to break it.&lt;/p&gt;

&lt;p&gt;The next time your traffic takes a weird route, remember: it’s not a bug. It’s BGP doing what it was never meant to do—and somehow still holding the internet together.&lt;/p&gt;




&lt;p&gt;Like this BGP deep dive? ☕ &lt;a href="//coff.ee/vx6fid"&gt;Fuel more tech rants&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Warning: May induce involuntary networking lectures at family dinners.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Peering agreement optional)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>routing</category>
      <category>bgp</category>
      <category>webcomponents</category>
    </item>
    <item>
      <title>Bloom Filters: The Smartest Lie Your System Can Tell</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Fri, 13 Jun 2025 11:39:33 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/bloom-filters-the-smartest-lie-your-system-can-tell-5aa1</link>
      <guid>https://dev.to/achal_tiwari/bloom-filters-the-smartest-lie-your-system-can-tell-5aa1</guid>
      <description>&lt;p&gt;Ever wonder how Google avoids crawling the same page twice across billions of URLs? Or how your browser blocks phishing links &lt;em&gt;instantly&lt;/em&gt; without downloading a blacklist the size of a dictionary? Or how spam filters flag dodgy senders before the email even loads?&lt;/p&gt;

&lt;p&gt;Behind all these real-time decisions is one quiet principle: systems need to ask, &lt;em&gt;“Have I seen this before?”&lt;/em&gt; But at scale, that’s not a simple yes/no question. And answering it wrong — or slowly — can cost millions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Cost of "Remembering"
&lt;/h2&gt;

&lt;p&gt;At small scale, you can use a hash set or a map to keep track. These give you lightning-fast lookups. But try storing a billion SHA-256 hashes — that's 32GB of raw memory. And that’s just the hashes, not the metadata, not the index, not the structure.&lt;/p&gt;

&lt;p&gt;Want to ship that to every mobile browser? Or store it in L1 cache on your server? Good luck.&lt;/p&gt;

&lt;p&gt;So big systems flip the question. Instead of asking,&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Is this in the set?”&lt;/strong&gt;,&lt;/p&gt;

&lt;p&gt;they ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Can I say for sure this is &lt;em&gt;not&lt;/em&gt; in the set?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This small shift leads us to a powerful, counterintuitive tool: the &lt;strong&gt;Bloom Filter&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let Me Introduce You to the Maybe-Machine
&lt;/h2&gt;

&lt;p&gt;Bloom Filters don’t aim for perfect accuracy. Instead, they give you a fast, memory-efficient answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If something &lt;em&gt;isn’t&lt;/em&gt; in the set → they’ll say so with complete certainty.&lt;/li&gt;
&lt;li&gt;If something &lt;em&gt;might&lt;/em&gt; be in the set → they say “maybe.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That tradeoff is deliberate. It's what makes Bloom Filters ridiculously cheap, fast, and useful.&lt;/p&gt;

&lt;p&gt;Imagine a bouncer who isn’t checking names, just checking &lt;em&gt;definitely not names&lt;/em&gt;. Anyone who fails the test gets turned away. Everyone else gets passed to a more serious security check — your database, your backend, your full set.&lt;/p&gt;

&lt;h2&gt;
  
  
  How They Actually Work
&lt;/h2&gt;

&lt;p&gt;Let’s walk through this. Suppose you’re Instagram and want to check if a user has seen a particular reel before. Storing every reel ID per user is a memory nightmare. So instead, you use a Bloom Filter.&lt;/p&gt;

&lt;p&gt;It’s just two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bit array of size &lt;code&gt;m&lt;/code&gt; (all zero at the start)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k&lt;/code&gt; independent hash functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To insert a reel ID &lt;code&gt;X&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You run &lt;code&gt;X&lt;/code&gt; through all &lt;code&gt;k&lt;/code&gt; hash functions:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;   &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="err"&gt;₁&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="err"&gt;₁&lt;/span&gt;  
   &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="err"&gt;₂&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nb"&gt;index&lt;/span&gt;&lt;span class="err"&gt;₂&lt;/span&gt;  
   &lt;span class="o"&gt;...&lt;/span&gt;  
   &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="err"&gt;ₖ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="err"&gt;ₖ&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Each gives you a position in the bit array, and you set those positions to &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To check if another reel &lt;code&gt;Y&lt;/code&gt; has been seen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hash it again using the same &lt;code&gt;k&lt;/code&gt; functions.&lt;/li&gt;
&lt;li&gt;Check those bit positions:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If &lt;em&gt;any&lt;/em&gt; bit is 0 → &lt;code&gt;Y&lt;/code&gt; is definitely new.&lt;/li&gt;
&lt;li&gt;If &lt;em&gt;all&lt;/em&gt; bits are 1 → maybe seen, maybe not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s it. There’s no list of IDs. No map. No real identity. Just a pattern of flipped bits.&lt;/p&gt;
&lt;h3&gt;
  
  
  Think About It Like This
&lt;/h3&gt;

&lt;p&gt;Imagine a long row of switches (bits), all off.&lt;/p&gt;

&lt;p&gt;Each new item you insert flips a few switches to "on," chosen by hashing. When checking later, if your item’s switches are all on, it might have been there before — or maybe someone else flipped those same switches.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Happens If Two Items Hash to the Same Positions?
&lt;/h3&gt;

&lt;p&gt;Then you’ve got a collision. But that’s not a bug — that’s inevitable. You're compressing a huge space (like all URLs) into a fixed-size array. By the &lt;strong&gt;Pigeonhole Principle&lt;/strong&gt;, collisions &lt;em&gt;must&lt;/em&gt; happen.&lt;/p&gt;

&lt;p&gt;This is where false positives come from. If item A and item B flip the same &lt;code&gt;k&lt;/code&gt; bits, the filter can’t tell them apart anymore. Identity gets blurred. That’s the cost of compression — and it’s baked into the model.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once a bit is shared, it’s communal. You don’t know who flipped it anymore.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the tradeoff is worth it — you get blazing-fast queries in a tiny amount of memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bullwg54p0h9fjgxgb8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bullwg54p0h9fjgxgb8.jpg" alt="Alpha Pigeon"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Okay, But How Likely Are False Positives?
&lt;/h2&gt;

&lt;p&gt;Let’s do some math. Say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bit array size &lt;code&gt;m = 10,000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You insert &lt;code&gt;n = 1,000&lt;/code&gt; items&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;k = 7&lt;/code&gt; hash functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The formula for false positive probability is:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;(1 − e−knm)k
\left(1 - e^{-\frac{kn}{m}}\right)^k
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;1 &lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt; &lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen nulldelimiter sizing reset-size3 size6"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;kn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter sizing reset-size3 size6"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;Plugging in:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f≈(1−e−0.7)⁷≈(1–0.496)⁷≈(0.5034)⁷≈0.00819
f ≈ \left(1 - e^{-0.7}\right)⁷ ≈ (1–0.496)⁷ ≈ (0.5034)⁷ ≈ 0.00819
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size1"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;0.7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;⁷&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1–0.496&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;⁷&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;0.5034&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;⁷&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.00819&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;So about a &lt;strong&gt;0.82%&lt;/strong&gt; chance of false positive — using just 1.25KB of memory.&lt;/p&gt;

&lt;p&gt;That’s insanely efficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tuning Matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add more items → more bits flip → more false positives.&lt;/li&gt;
&lt;li&gt;Flip too many bits → everything looks like a “maybe” → filter gets saturated.&lt;/li&gt;
&lt;li&gt;Use too few hash functions → less precision.&lt;/li&gt;
&lt;li&gt;Use too many → wasteful and overlapping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s even an optimal value for &lt;code&gt;k&lt;/code&gt;:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;(1 − e−knm)k
\left(1 - e^{-\frac{kn}{m}}\right)^k
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;1 &lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt; &lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen nulldelimiter sizing reset-size3 size6"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;kn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter sizing reset-size3 size6"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Tune it based on how many items you expect to store and how much space you can spare.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Sharp Edges
&lt;/h2&gt;

&lt;p&gt;You can’t delete from a basic Bloom Filter. If item A and item B both flipped the same bits, and you try to “unflip” those bits after deleting A — you might accidentally delete B’s trace too.&lt;/p&gt;

&lt;p&gt;That’s why deletion is &lt;strong&gt;impossible&lt;/strong&gt; in standard Bloom Filters.&lt;/p&gt;

&lt;p&gt;If you really need deletion, you’ll need a &lt;strong&gt;Counting Bloom Filter&lt;/strong&gt; — where instead of a bit, each position stores a counter. But you lose the original simplicity and memory efficiency.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Also: Bloom Filters aren’t cryptographically secure. In adversarial settings (e.g., BitTorrent), attackers have faked presence by spoofing bit patterns — leading to denial-of-service style distractions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  So Why Did Redis Ditch Them?
&lt;/h2&gt;

&lt;p&gt;Redis once had Bloom Filters in its core, but later removed them — not because they’re useless, but because they’re specialized. Instead, they moved it into a module: &lt;code&gt;RedisBloom&lt;/code&gt;. This lets power users access not just Bloom Filters, but more advanced probabilistic structures — Cuckoo Filters, Count-Min Sketch, Top-K, etc.&lt;/p&gt;

&lt;p&gt;It’s a reminder: Bloom Filters aren’t silver bullets. They’re sharp tools — if you know when to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Bloom Filters aren't trying to be accurate — they’re trying to be &lt;strong&gt;fast and cheap&lt;/strong&gt;. They let you say “no” with confidence, and “maybe” with grace. They compress identity into rough patterns. They don’t track, they approximate. And that’s exactly why they work at scale.&lt;/p&gt;

&lt;p&gt;So next time you build something that needs to track millions of things with limited memory — ask yourself if a perfect answer is worth the price. Because sometimes, “probably” is good enough to be &lt;em&gt;brilliant&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;☕️ If this post helped Bloom Filters bloom in your brain — or just made you whisper “nerdy but nice” — consider &lt;a href="//coff.ee/vx6fid"&gt;buying me a coffee&lt;/a&gt;. Unlike a Bloom Filter, I won't forget you. Unless you hash to the same index as someone else. Then... we’ll never know 🤷‍♂️.&lt;/p&gt;

</description>
      <category>bloomfilters</category>
      <category>systemdesign</category>
      <category>distributedsystems</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Understanding the Backend Behind LLMs(No Headaches Involved)</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Tue, 20 May 2025 14:37:29 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/understanding-the-backend-behind-llmsno-headaches-involved-12ne</link>
      <guid>https://dev.to/achal_tiwari/understanding-the-backend-behind-llmsno-headaches-involved-12ne</guid>
      <description>&lt;p&gt;After reading this blog post, any fears you have about LLMs will be put to rest. All you need is a curious mind and a bit of focus—no advanced knowledge of machine learning or AI is required! In this article, we’ll break down the concepts behind Large Language Models in a straightforward way and even explore how they are built from the ground up. Let's start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are LLMs
&lt;/h2&gt;

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

&lt;p&gt;Simply put, Large Language Models—LLMs—are smart AI systems that can read, understand, and even write text like a human. They learn from vast amounts of data using a type of technology called neural networks.&lt;/p&gt;

&lt;p&gt;The soul of LLMs are neural networks, which are computer systems inspired by the way our brains work. Think of a neural network as a series of interconnected layers, where each layer consists of small units called neurons. These neurons work together to process information.&lt;/p&gt;

&lt;p&gt;When you input data, like text or images, each neuron takes that information, applies some importance (or weight) to it, and sends it to the next layer. As the data moves through the layers, the network learns to recognize patterns and make decisions. This whole process gets trained through a feedback loop—by showing the model correct answers and adjusting weights to reduce errors. That's gradient descent, and it's how the magic happens. In simple terms, neural networks are like a team of problem solvers that work together to understand and generate information.&lt;/p&gt;

&lt;p&gt;Think of it like teaching a child to recognize words and sentences by showing them countless examples. Over time, the child learns to understand context, grammar, and even nuances in meaning. Similarly, LLMs become more proficient at language tasks as they are exposed to more data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplus.unsplash.com%2Fpremium_photo-1700483344376-a36e2afca858%3Fq%3D80%26w%3D1974%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplus.unsplash.com%2Fpremium_photo-1700483344376-a36e2afca858%3Fq%3D80%26w%3D1974%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" alt="Transformers" width="1974" height="1481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may have experimented with a basic AI, like a simple neural network that predicts the next letter or word. But how do we go from that to ChatGPT, or Claude, or Bard—models that can write essays, answer questions, debug your code, and sound eerily human?&lt;/p&gt;

&lt;p&gt;The answer is: &lt;strong&gt;Transformers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a basic neural network is like a pocket calculator—taking small inputs and spitting out answers—a &lt;strong&gt;Transformer&lt;/strong&gt; is like a souped-up spreadsheet loaded with advanced formulas, macros, and automation. It doesn’t just crunch numbers—it understands context, sequence, and relationships in a way no earlier model could.&lt;/p&gt;

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

&lt;p&gt;Let’s explore the secret sauce that makes Transformers so powerful. And don’t worry—we’ll decode the fancy stuff and tie it all back to everyday intuition.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Power of Focus: Self-Attention
&lt;/h3&gt;

&lt;p&gt;Imagine you’re reading this sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The girl gave her dog a treat."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you get to the word &lt;em&gt;"her"&lt;/em&gt;, your brain automatically links it back to &lt;em&gt;"girl"&lt;/em&gt;. You didn’t even think about it. That’s what we call &lt;strong&gt;contextual understanding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Transformers try to do something very similar. They look at &lt;strong&gt;all the words&lt;/strong&gt; in a sentence and decide which ones are most important &lt;strong&gt;to understand the current word&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s say the model is trying to figure out what &lt;em&gt;"her"&lt;/em&gt; refers to. It “pays attention” to other words in the sentence—especially &lt;em&gt;"girl"&lt;/em&gt;. Words that matter more get higher attention; others, like &lt;em&gt;"a"&lt;/em&gt; or &lt;em&gt;"the"&lt;/em&gt;, are gently ignored.&lt;/p&gt;

&lt;p&gt;This ability to scan the whole sentence and decide what's relevant is called &lt;strong&gt;self-attention&lt;/strong&gt;—but honestly, you can just think of it as &lt;strong&gt;focused reading&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Think Fast: Parallel Processing
&lt;/h3&gt;

&lt;p&gt;Remember those old AI models that read text one word at a time, like a super-slow typewriter? They were called RNNs, and while they worked, they were painfully slow and forgetful.&lt;/p&gt;

&lt;p&gt;Transformers said, “Why read word-by-word when you can read the whole sentence at once?”&lt;/p&gt;

&lt;p&gt;So instead of slowly crawling through text, Transformers gobble it all up at the same time—kind of like how your brain can scan a whole paragraph and get the gist instantly.&lt;/p&gt;

&lt;p&gt;This ability to look at everything together is what makes Transformers &lt;strong&gt;fast&lt;/strong&gt;, &lt;strong&gt;efficient&lt;/strong&gt;, and perfect for modern hardware like GPUs. You don’t need to remember the term &lt;em&gt;parallel processing&lt;/em&gt;—just know that it’s like reading with both eyes open instead of peeking one word at a time.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Speaking the Model’s Language: Tokenizers and Embeddings
&lt;/h3&gt;

&lt;p&gt;Here's the catch: Transformers don’t understand text. Not even a little.&lt;/p&gt;

&lt;p&gt;They only speak numbers. So how do we teach them words?&lt;/p&gt;

&lt;p&gt;First, we &lt;strong&gt;break words into smaller parts&lt;/strong&gt;, called &lt;strong&gt;tokens&lt;/strong&gt;. These might be entire words, chunks of words, or even just letters—whatever makes the most sense.&lt;/p&gt;

&lt;p&gt;Then, we &lt;strong&gt;translate each token into a list of numbers&lt;/strong&gt;. This list represents what that token means, kind of like a unique fingerprint for the word &lt;em&gt;“cat”&lt;/em&gt;, or &lt;em&gt;“run”&lt;/em&gt;, or even &lt;em&gt;“xyz”&lt;/em&gt;. These fingerprints are called &lt;strong&gt;embeddings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when you feed the model the word &lt;em&gt;“apple”&lt;/em&gt;, what it actually sees is a row of numbers, like &lt;code&gt;[0.2, -0.5, 1.3, …]&lt;/code&gt;. And every word or token gets its own unique row.&lt;/p&gt;

&lt;p&gt;All this magic of converting text to numbers? That’s just &lt;strong&gt;turning words into something the model can understand&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Building the Brain: Layers on Layers
&lt;/h3&gt;

&lt;p&gt;Now comes the cool part.&lt;/p&gt;

&lt;p&gt;Once your text is turned into numbers, the Transformer starts processing it through &lt;strong&gt;layers&lt;/strong&gt;—lots and lots of layers. Each layer has a job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One layer might &lt;strong&gt;focus attention&lt;/strong&gt; to understand what matters in the sentence&lt;/li&gt;
&lt;li&gt;Another might &lt;strong&gt;clean up the information&lt;/strong&gt; so it’s easier to work with (we call this normalization)&lt;/li&gt;
&lt;li&gt;A third might &lt;strong&gt;add the original info back in&lt;/strong&gt; to prevent it from being lost along the way (called residual connections)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then it repeats.&lt;/p&gt;

&lt;p&gt;The model keeps passing information through layer after layer, getting smarter at every step—like a person reading a sentence again and again, each time catching more nuance.&lt;/p&gt;

&lt;p&gt;By the end of this process, the model isn’t just looking at the word &lt;em&gt;“apple”&lt;/em&gt;—it knows whether you meant the fruit, the company, or the color of your phone.&lt;/p&gt;




&lt;h3&gt;
  
  
  So What’s a Transformer, Really?
&lt;/h3&gt;

&lt;p&gt;Let’s put it all together, without the tech-speak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;reads everything at once&lt;/strong&gt;, not word by word&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;focuses on the most important parts&lt;/strong&gt; of a sentence&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;understands the meaning behind words&lt;/strong&gt;, not just the words themselves&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;builds up its understanding in layers&lt;/strong&gt;, getting better as it goes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s really what makes Transformers so special.&lt;/p&gt;

&lt;p&gt;If you ever hear someone say &lt;em&gt;"self-attention"&lt;/em&gt; or &lt;em&gt;"positional encoding"&lt;/em&gt; or &lt;em&gt;"multi-head architecture"&lt;/em&gt;, just remember this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ah yes, that’s the simple trick the model uses to figure out what matters, where things are, and how to make sense of it all."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Build Phase: Engineering Your Transformer
&lt;/h2&gt;

&lt;p&gt;Imagine your Transformer as a chef in the kitchen. Just like your mom takes raw ingredients (like text) and skillfully transforms them into delicious meals, a Transformer processes information in clever ways to create something meaningful—whether it’s a complete sentence, a piece of code, or even a beautiful poem.&lt;br&gt;
Here's what each component does in simple terms:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tokenizer: Slicing Language into Bite-Sized Chunks
&lt;/h3&gt;

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

&lt;p&gt;Before the model can "think" about a sentence, it has to break it down into parts it can understand. That’s the tokenizer’s job.&lt;br&gt;
Instead of feeding it entire words or letters, we break text into &lt;strong&gt;subword pieces&lt;/strong&gt;—tiny fragments like “trans,” “form,” and “ers.” Why? Because this helps the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand unknown words by their parts (like figuring out "transformer" even if it’s never seen it)&lt;/li&gt;
&lt;li&gt;Keep its vocabulary manageable (no need to memorize every word in the English language)
You give the model:
&amp;gt; &lt;em&gt;“I’m learning transformers.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it might break that down into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[“I”, “’m”, “learn”, “ing”, “transform”, “ers”, “.”]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This step is just chopping your ingredients before cooking. In tech speak, we call this &lt;em&gt;tokenization.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Embedding Layer: Turning Words Into Numbers
&lt;/h3&gt;

&lt;p&gt;Now that we’ve got our token pieces, we need to turn them into something the model can actually compute: numbers.&lt;/p&gt;

&lt;p&gt;The embedding layer assigns &lt;strong&gt;each token a unique fingerprint&lt;/strong&gt;, made up of dozens (or hundreds) of numbers. These aren’t just random values—they capture subtle features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What a word means&lt;/li&gt;
&lt;li&gt;How it’s used&lt;/li&gt;
&lt;li&gt;How it relates to other words&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the word &lt;em&gt;“king”&lt;/em&gt; and &lt;em&gt;“queen”&lt;/em&gt; might have very similar embeddings, just slightly adjusted for gender. It's the model’s way of “understanding” meaning without using actual definitions.&lt;/p&gt;

&lt;p&gt;In plain terms: this is how we translate human language into something math can handle.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Positional Encoding: Remembering Word Order
&lt;/h3&gt;

&lt;p&gt;Here’s a weird thing: transformers don’t naturally know the order of your words.&lt;/p&gt;

&lt;p&gt;If you give it &lt;em&gt;“The cat sat on the mat”&lt;/em&gt;, it might just see a bag of words: [cat, mat, the, sat, on, the]. That’s a problem. The position of each word matters!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Positional encoding&lt;/strong&gt; solves this by adding a little flavor to each token's embedding—like tagging it with its position in the sentence. It’s like saying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;first&lt;/strong&gt; word&lt;/li&gt;
&lt;li&gt;This is the &lt;strong&gt;second&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This one came &lt;strong&gt;last&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, the model knows that &lt;em&gt;“cat sat on mat”&lt;/em&gt; is different from &lt;em&gt;“mat sat on cat”&lt;/em&gt; (which would be a very different kind of story!).&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Multi-Head Self-Attention: Laser-Focused Thinking
&lt;/h3&gt;

&lt;p&gt;This is the Transformer’s superpower. When trying to understand a word, the model doesn’t just look at it in isolation. It looks &lt;strong&gt;at every other word in the sentence&lt;/strong&gt; to decide what matters most.&lt;/p&gt;

&lt;p&gt;Say you’re processing this sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The dog barked because it was hungry.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does &lt;em&gt;“it”&lt;/em&gt; refer to? The model needs to look back at &lt;em&gt;“dog”&lt;/em&gt; and realize that’s the star of the sentence.&lt;/p&gt;

&lt;p&gt;Self-attention is like giving the model a pair of high-powered goggles—it can zoom in on important words, even if they’re far away in the sentence.&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;multi-head&lt;/strong&gt; just means the model wears &lt;em&gt;multiple goggles at once&lt;/em&gt;, each focusing on a different thing: subject, tone, grammar, etc.&lt;/p&gt;

&lt;p&gt;You don’t have to memorize the term &lt;em&gt;multi-head self-attention&lt;/em&gt;. Just think of it as &lt;strong&gt;the model’s way of deciding what to pay attention to when reading&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Feed-Forward Network: Deeper Thinking Happens Here
&lt;/h3&gt;

&lt;p&gt;After attention decides what to focus on, the model runs that info through a tiny brain—a simple set of calculations that mix, transform, and refine the meaning.&lt;/p&gt;

&lt;p&gt;This is where the model learns things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“cat” and “kitten” are related&lt;/li&gt;
&lt;li&gt;“bark” can mean sound or tree (depending on context)&lt;/li&gt;
&lt;li&gt;“run code” is very different from “go for a run”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This layer adds complexity and depth to the model’s understanding. In technical terms, we call this a &lt;strong&gt;feed-forward network&lt;/strong&gt;, but you can think of it as &lt;strong&gt;the deeper reasoning stage&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Layer Normalization + Residual Connections: Keeping It All Balanced
&lt;/h3&gt;

&lt;p&gt;When you’re cooking something complex, you need to &lt;strong&gt;stir often and taste as you go&lt;/strong&gt;, or the flavors might get lost, or worse—burn!&lt;/p&gt;

&lt;p&gt;That’s what these two components do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Residual connections&lt;/strong&gt; take the original ingredients and mix them back in, so the model doesn’t forget what it started with&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalization&lt;/strong&gt; makes sure the numbers don’t get too big, too small, or too weird to process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helps the model learn better, stay stable, and &lt;strong&gt;not forget the big picture&lt;/strong&gt;. You can just think of it as &lt;strong&gt;keeping everything balanced and smooth&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Decoder (For Generating Output)
&lt;/h3&gt;

&lt;p&gt;Now that the model has processed your input, we want it to say something back.&lt;/p&gt;

&lt;p&gt;This is where the &lt;strong&gt;decoder&lt;/strong&gt; comes in. It takes all the model’s internal thoughts and generates the &lt;strong&gt;next token&lt;/strong&gt;, one piece at a time, until it forms a full sentence.&lt;/p&gt;

&lt;p&gt;For Example, give it the phrase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Once upon a”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it might complete:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“time, there was a dragon…”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does this by predicting the most likely next token, then the one after that, and so on.&lt;/p&gt;

&lt;p&gt;That’s what we call &lt;strong&gt;language generation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  You Don’t Have to Build Everything From Scratch
&lt;/h3&gt;

&lt;p&gt;The good news? You don’t need to code all these parts by hand.&lt;/p&gt;

&lt;p&gt;Libraries like &lt;strong&gt;PyTorch&lt;/strong&gt; and &lt;strong&gt;TensorFlow&lt;/strong&gt; come with plug-and-play versions of each of these blocks. It's like building with LEGO instead of carving blocks from stone.&lt;/p&gt;

&lt;p&gt;You just need to know &lt;strong&gt;what each piece does&lt;/strong&gt;, how to plug them together, and how to train the whole setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feeding the LLM: Data Curation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1741795746404-41018f3f7327%3Ffm%3Djpg%26q%3D60%26w%3D3000%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1741795746404-41018f3f7327%3Ffm%3Djpg%26q%3D60%26w%3D3000%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" alt="Data Collection" width="760" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a reality check:&lt;br&gt;
No matter how fancy your model is, it won’t say anything smart unless it’s seen something smart.&lt;/p&gt;

&lt;p&gt;Think of your large language model (LLM) like a student. A very, very eager one. It doesn’t come with built-in knowledge—it learns entirely from what you show it. So if you train it on trash, it’ll spit out trash. If you train it on gold, well… then you get magic.&lt;/p&gt;

&lt;p&gt;This makes data curation arguably the most important part of building an LLM.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Kind of Data Does It Need?
&lt;/h3&gt;

&lt;p&gt;To talk like a human, your model has to read like a human. That means it needs to devour massive amounts of written material—anything that reflects how we use language in the real world.&lt;/p&gt;

&lt;p&gt;We’re talking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Books – Fiction, non-fiction, classics, obscure indie novels—it’s all valuable&lt;/li&gt;
&lt;li&gt;Wikipedia – General knowledge, well-structured&lt;/li&gt;
&lt;li&gt;Academic Papers – For formal tone and complex ideas&lt;/li&gt;
&lt;li&gt;Conversations – Dialogue helps the model understand how people actually talk&lt;/li&gt;
&lt;li&gt;Code – Yes, even programming languages are part of the diet!&lt;/li&gt;
&lt;li&gt;Articles and Blogs – Diverse opinions, tones, and writing styles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is to give the model a buffet of human language so it can learn not just vocabulary, but grammar, nuance, emotion, context, and logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  But Don’t Just Feed It Anything...
&lt;/h3&gt;

&lt;p&gt;Just as you wouldn’t let a child play with a box of mismatched puzzle pieces and expect them to complete a beautiful picture, you shouldn’t provide your model with a jumble of unfiltered internet content. Just like a complete puzzle requires the right pieces to fit together, your model needs high-quality, relevant data to create coherent and meaningful outputs.&lt;/p&gt;

&lt;p&gt;Here are the key steps for cleaning your data in concise points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy&lt;/strong&gt;: Verify factual correctness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatting&lt;/strong&gt;: Remove unusual symbols and typos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bias and Harmful Speech&lt;/strong&gt;: Eliminate offensive or misleading content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication&lt;/strong&gt;: Remove duplicate entries to avoid bias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Redaction&lt;/strong&gt;: Exclude sensitive information like personal identifiers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How Much Data Are We Talking?&lt;br&gt;
Let’s put things into perspective.&lt;/p&gt;

&lt;p&gt;Model   Number of Parameters    Training Data (Tokens)&lt;br&gt;
GPT-3   175 billion ~0.5 trillion tokens&lt;br&gt;
LLaMA 2 70 billion  ~2 trillion tokens&lt;br&gt;
Falcon  180 billion ~3.5 trillion tokens&lt;/p&gt;

&lt;p&gt;Reminder:&lt;br&gt;
1 token ≈ ¾ of a word&lt;br&gt;
100,000 tokens ≈ one full novel&lt;/p&gt;

&lt;p&gt;So GPT-3 read the equivalent of 5 million novels during training.&lt;/p&gt;

&lt;p&gt;But don’t panic—you don’t have to start that big. You can absolutely build a smaller model with fewer parameters and a modest amount of data. Think of it like training a student for a local competition instead of the Olympics.&lt;/p&gt;

&lt;p&gt;Start small. Learn fast. Scale wisely.&lt;/p&gt;

&lt;p&gt;When you're gathering all this data, set aside a chunk of it for evaluation—a final exam for your model.&lt;/p&gt;

&lt;p&gt;If you test the model on the same stuff you trained it on, it’s like checking answers by looking at the key. To really know if it's learning, you need to test it on new, unseen examples. That’s how you know it can generalize, not just memorize.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR – The Golden Rules of Data Curation
&lt;/h3&gt;

&lt;p&gt;Quality &amp;gt; Quantity (but yes, quantity matters too)&lt;/p&gt;

&lt;p&gt;Variety is king: include different tones, styles, domains&lt;/p&gt;

&lt;p&gt;Clean your data like you’re prepping ingredients for a gourmet meal&lt;/p&gt;

&lt;p&gt;Save some for testing so you can measure real progress&lt;/p&gt;

&lt;p&gt;Start small if needed—scale when ready&lt;/p&gt;

&lt;p&gt;And that’s how you feed your language model. It’s not glamorous work, but it’s the foundation for everything that comes next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Training: Where the Magic Gets Expensive
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplus.unsplash.com%2Fpremium_photo-1680700308598-d7a669a4c3ae%3Fq%3D80%26w%3D1974%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplus.unsplash.com%2Fpremium_photo-1680700308598-d7a669a4c3ae%3Fq%3D80%26w%3D1974%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.1.0%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" alt="Training Machine" width="1974" height="1481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, you've built your Transformer. It's sleek, it's complex, it's hungry for knowledge. Now comes the part where it &lt;em&gt;actually learns&lt;/em&gt;—and spoiler alert: this is where things get intense.&lt;/p&gt;

&lt;p&gt;Training an LLM is like sending your model to school… except the classes never stop, the exams are brutal, and the tuition fees are paid in &lt;strong&gt;GPU hours and electricity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Two-Part Learning Cycle
&lt;/h3&gt;

&lt;p&gt;Training a model boils down to two big steps, repeated over and over:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Forward Pass&lt;/strong&gt; – Making a Guess
&lt;/h3&gt;

&lt;p&gt;The model takes in some data—say a sentence like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The sun rises in the...”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It then tries to guess the next word. Maybe it says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“carrot”&lt;/em&gt; 🙃&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okay, not great. But that's okay—it’s still learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Backward Pass&lt;/strong&gt; – Learning From Mistakes
&lt;/h3&gt;

&lt;p&gt;Here’s where the real growth happens.&lt;br&gt;
The model compares its guess ("carrot") with the correct answer ("east"), and calculates &lt;strong&gt;how wrong&lt;/strong&gt; it was. This gap is called &lt;strong&gt;loss&lt;/strong&gt;.&lt;br&gt;
Then, it works backward through its own logic, adjusting millions (or billions) of little dials—called &lt;strong&gt;parameters&lt;/strong&gt;—to make a better guess next time.&lt;/p&gt;

&lt;p&gt;This back-and-forth continues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over &lt;strong&gt;batches&lt;/strong&gt; (small groups of data)&lt;/li&gt;
&lt;li&gt;Through &lt;strong&gt;epochs&lt;/strong&gt; (full passes through the dataset)&lt;/li&gt;
&lt;li&gt;And across &lt;strong&gt;iterations&lt;/strong&gt; (every single training step)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like the world’s most dedicated student doing flashcards at lightning speed—millions of times.&lt;/p&gt;

&lt;h3&gt;
  
  
  But This Isn’t Cheap
&lt;/h3&gt;

&lt;p&gt;Training modern LLMs isn’t just mentally taxing for the model—it’s a resource monster. You’ll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-end GPUs&lt;/strong&gt; (preferably more than one)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tons of memory&lt;/strong&gt; (RAM, VRAM, and fast storage)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patience&lt;/strong&gt; (unless you’re burning cloud credits)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So how do people manage this at scale? Smart techniques:&lt;/p&gt;

&lt;h3&gt;
  
  
  Efficiency Boosters
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Parallelization&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Break the training task into chunks and run them on multiple GPUs at the same time. It’s like building a house with a team instead of doing it solo.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Gradient Checkpointing&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Instead of remembering everything during training (which eats memory), the model saves “checkpoints” and recalculates just the necessary parts later. It’s a clever trade-off: &lt;strong&gt;less memory&lt;/strong&gt;, a bit &lt;strong&gt;more computation&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Hyperparameter Tuning&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;These are the settings that guide how the model learns. Think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch size&lt;/strong&gt; – How many examples to learn from at once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning rate&lt;/strong&gt; – How aggressively to update its knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropout rate&lt;/strong&gt; – How often to forget things to avoid overfitting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get these settings right, and training becomes faster, cheaper, and more effective. Get them wrong, and your model might either learn nothing—or memorize your dataset like a parrot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t Stop at Training: Fine-Tune for Your Domain
&lt;/h2&gt;

&lt;p&gt;Once your model speaks fluent “general English” (or whatever language you trained it on), it’s time to &lt;strong&gt;give it a specialty&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;fine-tuning&lt;/strong&gt;, and it’s how you turn a generalist into an expert.&lt;br&gt;
Let’s say you’ve trained a model to understand basic language, but you want it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answer legal questions&lt;/li&gt;
&lt;li&gt;Write SQL queries&lt;/li&gt;
&lt;li&gt;Diagnose medical symptoms&lt;/li&gt;
&lt;li&gt;Handle customer service chats&lt;/li&gt;
&lt;li&gt;Generate code in a specific language
You &lt;strong&gt;don’t&lt;/strong&gt; need to start from scratch again. You just &lt;strong&gt;fine-tune&lt;/strong&gt; it—feed it examples from your niche and let it re-learn with a focused lens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model already knows &lt;em&gt;how&lt;/em&gt; to read, write, and reason. Now, you’re just teaching it &lt;strong&gt;what matters&lt;/strong&gt; in your domain.&lt;/p&gt;

&lt;p&gt;It’s like hiring a smart intern and giving them a few weeks of on-the-job training. Soon, they’re speaking your language, using your terms, and handling tasks like a pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR – What to Remember
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Training&lt;/strong&gt; is the phase where the model learns from scratch. It’s expensive, slow, and compute-heavy—but essential.&lt;/li&gt;
&lt;li&gt;You repeat a &lt;strong&gt;forward pass&lt;/strong&gt; (guessing) and &lt;strong&gt;backward pass&lt;/strong&gt; (learning) until your model gets good.&lt;/li&gt;
&lt;li&gt;Use smart tools like &lt;strong&gt;parallelization&lt;/strong&gt;, &lt;strong&gt;gradient checkpointing&lt;/strong&gt;, and &lt;strong&gt;hyperparameter tuning&lt;/strong&gt; to manage costs and complexity.&lt;/li&gt;
&lt;li&gt;Once trained, don’t stop—&lt;strong&gt;fine-tune&lt;/strong&gt; your model to specialize it for your actual needs.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Absolutely! Here's a revised, polished, and human-friendly version of the &lt;strong&gt;Closing Thoughts&lt;/strong&gt;, expanded to include &lt;em&gt;realistic advice&lt;/em&gt; for those with limited resources. It gives an honest perspective while keeping the spirit of encouragement alive—plus it includes a practical “minimum setup” for getting started with smaller models like &lt;code&gt;minGPT&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Building a Large Language Model (LLM) from scratch is a bold move.&lt;/p&gt;

&lt;p&gt;It’s like building a car engine from raw metal. You don’t &lt;em&gt;need&lt;/em&gt; to do it—plenty of great engines already exist—but if you do, you’ll know &lt;em&gt;exactly&lt;/em&gt; how it works, piece by piece. And that kind of knowledge? It’s powerful.&lt;/p&gt;

&lt;p&gt;Whether you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A student learning AI by doing (and not just watching tutorials)&lt;/li&gt;
&lt;li&gt;A startup looking to build a private, domain-specific model&lt;/li&gt;
&lt;li&gt;Or just a curious mind who loves digging deep into how things tick&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...building your own LLM is &lt;strong&gt;more possible now than ever before&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Excited to dive in?
&lt;/h2&gt;

&lt;p&gt;If you're aiming to build even a basic LLM from scratch, here’s your “starter pack”:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Core Skills&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt;: The language of choice for almost all ML projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NumPy&lt;/strong&gt;: For working with arrays and matrices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyTorch or TensorFlow&lt;/strong&gt;: To build and train neural networks&lt;/li&gt;
&lt;li&gt;Basic understanding of:

&lt;ul&gt;
&lt;li&gt;Vectors, matrices, gradients (middle school math + intuition!)&lt;/li&gt;
&lt;li&gt;How neural networks work&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tools &amp;amp; Resources&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;tokenizer&lt;/strong&gt; (like Byte-Pair Encoding or SentencePiece)&lt;/li&gt;
&lt;li&gt;A small, clean &lt;strong&gt;dataset&lt;/strong&gt; (you don’t need 2 trillion tokens to start)&lt;/li&gt;
&lt;li&gt;Basic compute: access to a &lt;strong&gt;single GPU&lt;/strong&gt; (NVIDIA GTX 1660+, or any cloud GPU like Google Colab or Lambda Labs)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Mindset&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Patience&lt;/strong&gt;: Training even small models takes time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curiosity&lt;/strong&gt;: You’ll hit confusing bugs—embrace them as learning moments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: You &lt;em&gt;will&lt;/em&gt; want to give up. Don’t.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Looking to Keep Costs Low?
&lt;/h2&gt;

&lt;p&gt;You don’t need a supercomputer to start your LLM journey.&lt;/p&gt;

&lt;p&gt;Many beginners use &lt;strong&gt;tiny transformer models&lt;/strong&gt; to learn the fundamentals—models you can train on a laptop or free-tier cloud GPU.&lt;/p&gt;

&lt;p&gt;Here’s a great starting point:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 &lt;a href="https://github.com/karpathy/minGPT" rel="noopener noreferrer"&gt;&lt;code&gt;minGPT&lt;/code&gt;&lt;/a&gt; by Andrej Karpathy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A minimal, educational reimplementation of GPT&lt;/li&gt;
&lt;li&gt;Written in clean, simple PyTorch&lt;/li&gt;
&lt;li&gt;You can train it on &lt;strong&gt;tiny datasets&lt;/strong&gt; like &lt;em&gt;Shakespeare&lt;/em&gt; or &lt;em&gt;Python code snippets&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Can run on &lt;strong&gt;a single GPU&lt;/strong&gt; with 4–8 GB VRAM&lt;/li&gt;
&lt;li&gt;Helps you understand tokenization, attention, embeddings, loss functions, and training loops—without the complexity of billion-scale models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Recommended system for minGPT:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU: Any modern multi-core CPU (i5/i7 or Ryzen 5/7)&lt;/li&gt;
&lt;li&gt;RAM: At least 8–16 GB&lt;/li&gt;
&lt;li&gt;GPU: GTX 1660 Ti, RTX 3060, or better — OR Google Colab with a free Tesla T4 (or paid tier for faster A100/V100)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other starter models to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nanoGPT&lt;/strong&gt; – Modern rewrite of minGPT with PyTorch Lightning and better training loops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TinyStories&lt;/strong&gt; – Small LLMs trained on child-friendly stories, designed to run on a single GPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;distilGPT&lt;/strong&gt; or &lt;strong&gt;GPT-Neo Mini&lt;/strong&gt; – Pretrained small models you can fine-tune cheaply&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So... Is It Worth It?
&lt;/h2&gt;

&lt;p&gt;If you're after raw performance or commercial-scale apps, you're probably better off &lt;strong&gt;fine-tuning an existing model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But if your goal is &lt;strong&gt;understanding&lt;/strong&gt;, &lt;strong&gt;learning&lt;/strong&gt;, &lt;strong&gt;privacy&lt;/strong&gt;, or &lt;strong&gt;customization&lt;/strong&gt;, then yes—&lt;strong&gt;it's absolutely worth it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll not only gain insights into one of the most transformative technologies of our time, but you’ll also empower yourself to innovate, adapt, and even challenge what’s already out there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;don’t need a data center&lt;/strong&gt; to get started&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;don’t need a PhD&lt;/strong&gt; to understand how this works&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;just need curiosity, a decent GPU, and the willingness to learn&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Are you ready to build your own brain?&lt;br&gt;
Because now... you actually can.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>beginners</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Building an Authentication System with MERN</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Fri, 09 Aug 2024 07:57:49 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/building-an-authentication-system-with-mern-ln</link>
      <guid>https://dev.to/achal_tiwari/building-an-authentication-system-with-mern-ln</guid>
      <description>&lt;p&gt;Authentication is a crucial aspect of web development, especially when dealing with user data. If you're looking to deepen your understanding of how to securely handle user passwords, I highly recommend reading my article on &lt;a href="https://dev.to/achal_tiwari/how-to-store-user-passwords-securely-116c"&gt;how to store user passwords securely&lt;/a&gt;. This current guide builds on that foundation and will walk you through setting up a basic authentication system within the MERN stack (MongoDB, Express, React, Node.js). If you're already familiar with password security and bcrypt, you can jump right into this article without needing to read the previous one. In this tutorial, we'll use Express for the backend, MongoDB for storing user data, and JSON Web Tokens (JWT) to secure the authentication process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure of JWT:
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  1. Setting Up the Express Server
&lt;/h3&gt;

&lt;p&gt;First, let's create an Express server. We'll start by initializing a new Node.js project and installing the necessary dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;auth-system
&lt;span class="nb"&gt;cd &lt;/span&gt;auth-system
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express mongoose bcrypt jsonwebtoken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create an index.js file in the root directory to set up the Express server and connect to MongoDB.&lt;br&gt;
Let’s retrieve our connection string:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a MongoDB Atlas account&lt;/strong&gt; and set up a cluster (this may take a few minutes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Network Access&lt;/strong&gt; from the sidebar, edit the IP Whitelist entry, and select "Allow Access from Anywhere."&lt;/li&gt;
&lt;li&gt;Click on "Connect" and choose "Drivers".&lt;/li&gt;
&lt;li&gt;Select "Mongoose" as the driver, and then copy the provided connection string.&lt;/li&gt;
&lt;li&gt;Replace the placeholder for the password in the connection string with your actual password.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./routes/auth.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;protectedRoute&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./routes/protectedRoute.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongoURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-mongodb-connection-string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authRoutes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/protected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;protectedRoute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// We'll only start our server once we have successfully connected to the database.&lt;/span&gt;
&lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mongoURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Database Connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In this code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We import necessary modules like express, mongoose, and our route files.&lt;/li&gt;
&lt;li&gt;The MongoDB connection string is specified in the mongoURL.&lt;/li&gt;
&lt;li&gt;We set up the Express server to use JSON and link it to our authentication and protected routes.&lt;/li&gt;
&lt;li&gt;We connect to the MongoDB database using Mongoose.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2. Creating the User Model
&lt;/h4&gt;

&lt;p&gt;Create a models folder, and within it, a &lt;strong&gt;User.js&lt;/strong&gt; file. This file will define the Mongoose schema for storing user data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we define a simple schema with two fields: username and password. The username is unique to prevent duplicate users, and both fields are required.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Implementing Authentication Routes
&lt;/h4&gt;

&lt;p&gt;Next, create a routes folder with two files: auth.js and protectedRoute.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;auth.js&lt;/strong&gt; will handle user registration and login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../models/User.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bcrypt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Registration&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/register&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User registered successfully&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Registration Failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// User Login&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Not Found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;passMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;passMatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wrong Password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_id&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secretKey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;expiresIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1h&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Concepts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Registration&lt;/em&gt;: We hash the password using bcrypt before storing it in the database.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Login&lt;/em&gt;: We compare the hashed password with the stored one, and if they match, we generate a JWT token that the user can use for accessing protected routes.
#### 4. Creating a Protected Route
Now, let's create a route that is accessible only to authenticated users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;protectedRoute.js:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;verifyToken&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../middleware/authMiddleware.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Protected route accessed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;authMiddleware.js:&lt;/strong&gt;&lt;br&gt;
In the middleware folder, create an authMiddleware.js file to verify the JWT token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secretKey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Concepts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;JWT Verification&lt;/em&gt;: We verify the token sent in the request header. If the token is valid, the request is allowed to proceed; otherwise, an error is returned.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Testing the System
&lt;/h4&gt;

&lt;p&gt;To test the system, you can use tools like Postman or cURL. Postman is particularly user-friendly and straightforward for testing.&lt;/p&gt;

</description>
      <category>security</category>
      <category>mern</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>JavaScript on the Server: Node.js</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Sun, 28 Jul 2024 16:14:32 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/javascript-on-the-server-nodejs-3lhg</link>
      <guid>https://dev.to/achal_tiwari/javascript-on-the-server-nodejs-3lhg</guid>
      <description>&lt;h1&gt;
  
  
  What is Node.js?
&lt;/h1&gt;

&lt;p&gt;Let's dive into Node.js! This article covers many concepts, so grab your favorite coffee or tea, sit back, and let's get started. If you're in a rush, feel free to bookmark it for later. Let's begin!&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Introduction to Node.js
&lt;/h1&gt;

&lt;p&gt;Node.js is an open-source, cross-platform JavaScript runtime environment that lets you run JavaScript code on the server side. Here’s why it’s important and how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js is an open-source server environment&lt;/li&gt;
&lt;li&gt;An open source server environment is a computer system that processes requests via HTTP&lt;/li&gt;
&lt;li&gt;Node.js is a cross-platform, open-source JavaScript runtime environment
To understand the magic of Node.js, let's compare it with PHP or ASP in handling file requests:&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Traditional PHP or ASP Approach:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Sends the task to the computer's file system.&lt;/li&gt;
&lt;li&gt;Waits while the file system opens and reads the file.&lt;/li&gt;
&lt;li&gt;Returns the content to the client.&lt;/li&gt;
&lt;li&gt;Ready to handle the next request.
##### Node.js Approach:&lt;/li&gt;
&lt;li&gt;Sends the task to the computer's file system.&lt;/li&gt;
&lt;li&gt;Ready to handle the next request.&lt;/li&gt;
&lt;li&gt;When the file system has opened and read the file, the server returns the content to the client.
It runs on a single thread using non-blocking, asynchronous programming, which makes it very memory-efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understanding Node.js Modules
&lt;/h3&gt;

&lt;p&gt;Modules in Node.js are like libraries in JavaScript. Here are the types of modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core Modules: Built into Node.js and available without any additional installation.&lt;/li&gt;
&lt;li&gt;Local Modules: Created within your project.&lt;/li&gt;
&lt;li&gt;Third-Party Modules: Available through the npm registry and can be installed using npm.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Core Modules
&lt;/h4&gt;

&lt;p&gt;Core modules are part of the Node.js framework. Some examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fs&lt;/code&gt;: File System module for interacting with the file system.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;http&lt;/code&gt;: HTTP module for creating web servers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;path&lt;/code&gt;: Path module for handling and transforming file paths.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;os&lt;/code&gt;: Operating System module for fetching OS-related information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Example: Using the fs Module
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Reading a file&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Local Modules
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;They can be a single file or a collection of files organized in a directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Example: Creating and Using a Local Module
&lt;/h6&gt;

&lt;p&gt;Create a Local Module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// maths.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subtract&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Use the Local Module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;math&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./math&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 8&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Third-Party Modules
&lt;/h4&gt;

&lt;h6&gt;
  
  
  Example: Installing and Using a Third-Party Module
&lt;/h6&gt;

&lt;p&gt;Install the Module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;lodash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the Installed Module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reversedArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reversedArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: [5, 4, 3, 2, 1]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Module Caching
&lt;/h3&gt;

&lt;p&gt;Node.js caches modules after they are loaded for the first time. &lt;br&gt;
This means that subsequent &lt;code&gt;require&lt;/code&gt; calls for the same module will return the cached version.&lt;/p&gt;
&lt;h2&gt;
  
  
  Node.js HTTP Module
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;http&lt;/code&gt; module in Node.js is a &lt;u&gt;core module&lt;/u&gt; that provides functionality to &lt;u&gt;create web servers and handle HTTP requests and responses&lt;/u&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Using the `http.createServer()` method to create an HTTP server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// a callback function to handle incoming requests and send responses.&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// HTTP status code&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Set response headers&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Send response&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Make the server listen on port 3000&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running at http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Handling Different Request Methods
&lt;/h4&gt;

&lt;p&gt;HTTP servers can handle different types of requests, such as GET, POST, PUT, and DELETE.&lt;br&gt;
Important Methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;request.on(event, callback)&lt;/code&gt;: 

&lt;ul&gt;
&lt;li&gt;This method is used to &lt;strong&gt;set up event listeners for various events&lt;/strong&gt; that may occur during an HTTP request. &lt;/li&gt;
&lt;li&gt;The &lt;code&gt;event&lt;/code&gt; parameter specifies the event to listen for, such as &lt;code&gt;'data'&lt;/code&gt; for when a chunk of data is received, or &lt;code&gt;'end'&lt;/code&gt; for when the entire response has been received. &lt;/li&gt;
&lt;li&gt;The &lt;code&gt;callback&lt;/code&gt; function is called when the specified event occurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;request.end([data], [encoding], [callback])&lt;/code&gt;: 

&lt;ul&gt;
&lt;li&gt;This method is used to send the request to the server. &lt;/li&gt;
&lt;li&gt;It finalizes the request, so no more data can be written to the request. &lt;/li&gt;
&lt;li&gt;Optionally, you can pass &lt;code&gt;data&lt;/code&gt; to be sent in the request body, &lt;code&gt;encoding&lt;/code&gt; to specify the encoding of the data, and a &lt;code&gt;callback&lt;/code&gt; function that will be called when the request has been sent.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Received a GET request&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// chunk will be a buffer like &amp;lt;Buffer 6d 65 73 ... &amp;gt;, &lt;/span&gt;
    &lt;span class="c1"&gt;// therefore we convered it to String&lt;/span&gt;
      &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Convert Buffer to string&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Received a POST request with body: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Method Not Allowed&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Method Not Allowed&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen on port 3000&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running at http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use test this code by the use of curl command, to send a post request to our page.&lt;/p&gt;

&lt;h4&gt;
  
  
  Events
&lt;/h4&gt;

&lt;h6&gt;
  
  
  Key Concepts
&lt;/h6&gt;

&lt;ol&gt;
&lt;li&gt;EventEmitter:

&lt;ul&gt;
&lt;li&gt;Core of Node asynchronous event-driven architecture&lt;/li&gt;
&lt;li&gt;It is a module that facilitates communication/interaction between objects in Node.&lt;/li&gt;
&lt;li&gt;Emitter objects emit named events that cause previously registered listeners to be called. &lt;/li&gt;
&lt;li&gt;So, an emitter object basically has two main features:

&lt;ul&gt;
&lt;li&gt;Emitting name events.&lt;/li&gt;
&lt;li&gt;Registering and unregistering listener functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h6&gt;
  
  
  Creating an event
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Creating an event&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myEmitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Define an event listener&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greetListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;greetListener&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Emit the event, this will emit the event named 'greet'&lt;/span&gt;
&lt;span class="c1"&gt;// passing 'World' as an argument&lt;/span&gt;
&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listenerCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;

&lt;span class="c1"&gt;// Removing the listener&lt;/span&gt;
&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;greetListener&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Now, even if you emit the event, nothing will happen&lt;/span&gt;
&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listenerCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 0&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myEmitter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rawListeners&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;greet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// []&lt;/span&gt;

&lt;span class="c1"&gt;//-----------Output----------&lt;/span&gt;
&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;World&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;greetListener&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Built-in Events
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, World!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Request received: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server listening on port 3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Serving Static Files
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;This code will display your &lt;code&gt;image1.png&lt;/code&gt;  when at &lt;code&gt;localhost:3000/&lt;/code&gt; or &lt;code&gt;127.0.0.1:3000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create the server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Set content type based on file extension&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/javascript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Read and serve the file&lt;/span&gt;
  &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENOENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// File not found&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;404 Not Found&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Server error&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;500 Server Error&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Serve the file&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen on port 3000&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running at http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  URL Module
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;adr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/default.htm?year=2017&amp;amp;month=february&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//returns 'localhost:8080'  &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//returns '/default.htm'  &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//returns '?year=2017&amp;amp;month=february'  &lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="nx"&gt;qdata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//returns an object: { year: 2017, month: 'february' }  &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;qdata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;month&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//returns 'february'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Query using  URL Parameters
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Parse the URL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsedUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Extract the pathname (e.g., '/filename.ext')&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parsedUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// Extract the filename from the pathname&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lastIndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Correctly display the filename with spaces and other special characters&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decodedFilename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 

  &lt;span class="c1"&gt;// Set the response header and status code&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Send the response&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;h1&amp;gt;Filename: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;decodedFilename&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen on port 3000&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server is running at http://127.0.0.1:3000/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open your web browser and navigate to &lt;a href="http://127.0.0.1:3000/filename.ext" rel="noopener noreferrer"&gt;http://127.0.0.1:3000/filename.ext&lt;/a&gt; (replace filename.ext with any filename you want to test). The server will display the filename extracted from the URL on the webpage.&lt;/p&gt;

&lt;p&gt;Thank you for sticking through this long read. If you have any questions or need further clarification, feel free to reach out in the comments. Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>ShellCode 1.0</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Mon, 22 Jul 2024 09:08:23 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/shellcode-10-1eco</link>
      <guid>https://dev.to/achal_tiwari/shellcode-10-1eco</guid>
      <description>&lt;h1&gt;
  
  
  Shellcode
&lt;/h1&gt;

&lt;p&gt;Hey there! Today, we're diving into the fascinating and somewhat intimidating world of shellcode. If you've ever wondered how hackers manage to take control of a compromised machine, shellcode is often a big part of the answer. Let's break it down together.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What is Shellcode?
&lt;/h2&gt;

&lt;p&gt;Shellcode is essentially a piece of code used as a payload in the exploitation of software vulnerabilities. Its primary job is to take control of or further exploit a compromised machine. The term "shellcode" comes from its initial use case, which was to spawn a command shell (think of a command-line interface). But don’t be fooled—it can do a lot more than just that!&lt;/p&gt;

&lt;h4&gt;
  
  
  Common Goals of Shellcode
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installing a Rootkit or Trojan Horse&lt;/strong&gt;: These are sneaky programs that either hide the attacker’s presence or give them remote access to your system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stopping Antimalware Programs&lt;/strong&gt;: This makes sure the attack goes undetected for as long as possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obtaining Sensitive Data&lt;/strong&gt;: Passwords, financial information, or personal data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downloading More Malicious Files&lt;/strong&gt;: This helps further compromise the targeted device.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Does Shellcode Work?
&lt;/h2&gt;

&lt;p&gt;Shellcodes are injected directly into the computer's memory. They are generally written in &lt;strong&gt;assembly language&lt;/strong&gt;, which makes them really good at sneaking past antivirus and Endpoint Detection and Response (EDR) systems. However, plain shellcode can be spotted by antivirus software since these programs have databases full of known malicious code. To stay hidden, shellcode often gets encrypted using various cryptographic techniques.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaking Down a Shellcode Exploit
&lt;/h3&gt;

&lt;p&gt;A shellcode exploit has two main parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exploitation Technique&lt;/strong&gt;: This is how the attacker inserts the shellcode and makes sure the vulnerable program runs it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload&lt;/strong&gt;: This is the part that actually executes the attacker's malicious code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: Buffer Overflow
&lt;/h3&gt;

&lt;p&gt;Let’s go through a classic example of how shellcode is used: a buffer overflow.&lt;/p&gt;

&lt;h5&gt;
  
  
  Step-by-Step: Buffer Overflow
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Buffer Overflow&lt;/strong&gt;: Imagine an attacker sends more data than a buffer can handle. This excess data spills over into adjacent memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overwrite Return Address&lt;/strong&gt;: Eventually, this overflow reaches and overwrites the return address on the stack—the place where the program knows where to go next after finishing the current function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injected Shellcode&lt;/strong&gt;: The attacker’s shellcode is part of the overflow data, positioned at a specific memory location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell Execution&lt;/strong&gt;: When the program tries to return from the function, it jumps to the shellcode instead, executing the attacker's malicious actions.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h5&gt;
  
  
  Types of Buffer Overflows
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stack-Based&lt;/strong&gt;: Exploits the application's stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heap-Based&lt;/strong&gt;: Targets the application’s heap memory space.
###### Crafting a Successful Exploit
Writing the shellcode is usually the easier part. The real challenge is figuring out where the shellcode is in memory and controlling the Extended Instruction Pointer (EIP) register to make sure the shellcode runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Writing Shellcode
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shellcode Writing&lt;/strong&gt;: This is the actual malicious code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finding Shellcode Address&lt;/strong&gt;: Knowing where in memory the shellcode resides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EIP Control&lt;/strong&gt;: Exploiting a vulnerability to overwrite the EIP with the shellcode’s address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt;: Redirecting execution to the shellcode.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h4&gt;
  
  
  Different Types of Shellcode Exploits
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Local vs. Remote Shellcode
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Shellcode&lt;/strong&gt;: Used when the attacker has physical access to the machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Shellcode&lt;/strong&gt;: Targets a process on another machine over a network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes, there's limited space in the buffer to inject the entire payload. Here are some techniques to get around this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Staged Shellcode&lt;/strong&gt;: The first stage is small and simple, just enough to download and execute the larger second stage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egg Hunter Shellcode&lt;/strong&gt;: A tiny "hunter" piece of code searches for the larger "egg" shellcode in memory and executes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Omelette Egg Hunter Shellcode&lt;/strong&gt;: Finds multiple small "eggs" and rebuilds them into a single executable block.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download and Execute&lt;/strong&gt;: Instructs the target to download and run a malicious file from the internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding shellcode is crucial whether you're a security professional or a developer. It helps you protect systems against these sophisticated attacks. By recognizing the techniques attackers use, you can better defend your digital environment.&lt;/p&gt;

&lt;p&gt;I hope this provided you with a clear understanding of what shellcode is and how it operates. In our next article, we'll dive into writing shellcode and exploring related concepts in greater detail. Happy coding!&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>beginners</category>
      <category>assembly</category>
    </item>
    <item>
      <title>How to Store User Passwords Securely</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Mon, 22 Jul 2024 06:58:11 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/how-to-store-user-passwords-securely-116c</link>
      <guid>https://dev.to/achal_tiwari/how-to-store-user-passwords-securely-116c</guid>
      <description>&lt;p&gt;Storing passwords securely is crucial for maintaining user privacy and data integrity. So, how should you store a password if you were asked to do so? The simplest way might seem to store it in plain text, but we all know that is not secure. Should we use encryption or hashing? Let's explore these methods together in our article today.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazhwh0tg3kxa2i0clv1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazhwh0tg3kxa2i0clv1f.png" alt="Image description" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Plain Text Passwords
&lt;/h2&gt;

&lt;p&gt;Alright, let's start with the most basic approach: plain text. Imagine you just write down all the passwords exactly as users enter them. It's simple, right? But here's the problem: if anyone gets access to this list, they can see all the passwords right away. It’s like leaving the keys to your house under the doormat. Not a good idea!&lt;/p&gt;
&lt;h2&gt;
  
  
  Encryption
&lt;/h2&gt;

&lt;p&gt;Next, let's talk about encryption. Encryption is a process where we take a password and transform it into a different format using an algorithm. Think of it as a secret code. But here's the catch: encryption is reversible. If someone figures out the code (or gets the key, which you have to store somewhere), they can decrypt the password.&lt;/p&gt;

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

&lt;p&gt;Imagine we use something simple like ROT13, which just shifts each letter by 13 places in the alphabet. "password" becomes "cnffjbeq". But if someone knows we used ROT13, they can easily reverse it. Even with more complex encryption, if an attacker gets the key, they can decrypt all the passwords. So, reversible encryption isn't ideal for password storage.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hash Functions
&lt;/h2&gt;

&lt;p&gt;Now, let's move on to hash functions. Hashing takes a password and transforms it into a fixed-size string of characters, which looks nothing like the original password. The key here is that hashing is one-way: you can't easily reverse it to get the original password.&lt;/p&gt;

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

&lt;p&gt;Let's try using a simple hash function like SHA-256. Here's a quick example in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;hash_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;hashed_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashed_password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get a long, unique string. But even with secure hashes like SHA-256, there's a problem: &lt;strong&gt;they are very fast to compute&lt;/strong&gt;. An attacker can try billions of passwords per second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhancing Security with Salt, Pepper, and Iteration
&lt;/h2&gt;

&lt;p&gt;To make things harder for attackers, we can add some extra layers of security: salt, pepper, and iteration.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Salt
&lt;/h3&gt;

&lt;p&gt;A salt is a unique random value added to each password before hashing. This ensures that even if two users have the same password, their hashed passwords will be different.&lt;/p&gt;

&lt;h4&gt;
  
  
  Experiment: Adding Salt
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urandom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Generate a random salt
&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;hash_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;hashed_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashed_password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, each time you run this, you'll get a different result because the salt is random. This makes it much harder for attackers to use precomputed hash tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pepper
&lt;/h3&gt;

&lt;p&gt;A pepper is a common secret value added to all passwords. Unlike salt, the pepper is stored separately from the database. This adds an extra layer of security because an attacker would need both the database and the pepper to crack the passwords.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iteration
&lt;/h3&gt;

&lt;p&gt;Iteration means hashing the password multiple times. This makes each hash calculation slower, which significantly increases the time required for attackers to crack passwords.&lt;/p&gt;

&lt;h4&gt;
  
  
  Experiment: Adding Iteration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By increasing the number of iterations, you make it more computationally expensive for an attacker to guess passwords.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Specific Functions
&lt;/h2&gt;

&lt;p&gt;Instead of creating our own hashing algorithms, we can use established functions designed specifically for password storage, like bcrypt, scrypt, and Argon2. These functions already incorporate salt, iteration, and other security measures to resist attacks effectively.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Bcrypt
&lt;/h2&gt;

&lt;p&gt;Let's dive into bcrypt, one of the most popular password hashing functions. Bcrypt is based on the Blowfish cipher and is designed to be slow to compute, making it harder for attackers to crack passwords.&lt;/p&gt;

&lt;h4&gt;
  
  
  Experiment: Using Bcrypt
&lt;/h4&gt;

&lt;p&gt;Here's how you can use bcrypt in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;bcrypt&lt;/span&gt;

&lt;span class="c1"&gt;# Generate a salt and hash a password
&lt;/span&gt;&lt;span class="n"&gt;salt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gensalt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;hashed_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hashpw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password123&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashed_password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Verify a password
&lt;/span&gt;&lt;span class="n"&gt;is_correct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkpw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password123&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashed_password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_correct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With bcrypt, each hash includes a unique salt, and you can adjust the "work factor" to make the hashing process slower, enhancing security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Bcrypt is Effective
&lt;/h3&gt;

&lt;p&gt;Bcrypt’s strength lies in its ability to adjust the cost factor, which means you can make the hashing process more computationally intensive as hardware improves. This future-proofs your password security, making it more resistant to attacks over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Famous Cases of Hash Cracking
&lt;/h2&gt;

&lt;p&gt;To understand why all this matters, let's look at some real-world examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn (2012)&lt;/strong&gt;: LinkedIn used SHA-1 without salt, leading to the recovery of 90% of the leaked passwords in just three days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adobe (2013)&lt;/strong&gt;: Encrypted passwords without proper hashing led to a massive breach affecting 38 million users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySpace (2016)&lt;/strong&gt;: Use of unsalted SHA-1 hashes resulted in the compromise of 360 million accounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this hands-on exploration helped you understand why and how to store passwords securely. Happy Coding!&lt;/p&gt;

</description>
      <category>security</category>
      <category>database</category>
      <category>tutorial</category>
      <category>interview</category>
    </item>
    <item>
      <title>Redux : State Management Tool</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Sun, 07 Jul 2024 09:48:11 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/redux-state-management-tool-4242</link>
      <guid>https://dev.to/achal_tiwari/redux-state-management-tool-4242</guid>
      <description>&lt;p&gt;Hello! Today, we are going to explore how to manage state in production-ready projects using Redux. For those who aren't familiar with state management, let's break it down.&lt;/p&gt;

&lt;h5&gt;
  
  
  What is State Management?
&lt;/h5&gt;

&lt;p&gt;State management is about handling the state of various user interface elements, such as text fields, buttons, and other interactive components in a graphical user interface. To get a clearer understanding of state management and React, check out the Context API. You can read the official docs or my &lt;a href="https://achaltiwari.hashnode.dev/context-api" rel="noopener noreferrer"&gt;article&lt;/a&gt; on it.&lt;/p&gt;

&lt;h5&gt;
  
  
  What is Redux?
&lt;/h5&gt;

&lt;p&gt;Redux is a pattern and library for managing and updating application state, using events called "actions".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It serves as a centralized store for state that needs to be used across your entire application, with rules ensuring that the state can only be updated in a predictable fashion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Key Concepts of Redux
&lt;/h6&gt;

&lt;p&gt;Store: The store holds the &lt;a href="https://react.dev/learn/state-a-components-memory" rel="noopener noreferrer"&gt;state&lt;/a&gt; of your application.&lt;br&gt;
Actions: Actions are plain JavaScript objects that describe what happened.&lt;br&gt;
Reducers: Reducers specify how the application's state changes in response to actions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73ccxkj8ng2o3k7kpaht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73ccxkj8ng2o3k7kpaht.png" alt="Image description" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Setting Up Redux in a React App
&lt;/h4&gt;

&lt;p&gt;Let's start by setting up Redux in a simple React app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app my-redux-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-redux-app
npm &lt;span class="nb"&gt;install &lt;/span&gt;redux react-redux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Set Up the Redux Store
&lt;/h4&gt;

&lt;p&gt;Create a store.js file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Initial state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// Reducer&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DECREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Create store&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Provide the Store to Your App
&lt;/h4&gt;

&lt;p&gt;Wrap your app with the Provider component from react-redux in index.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;// this wrap helps all your components to get access of your store&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Connect Components to Redux
&lt;/h4&gt;

&lt;p&gt;Create a Counter.js component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//Selector helps you to get access of data based on provided state&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// useDispatch allows React components to dispatch actions to the // Redux store.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="c1"&gt;// we have made switch cases based on action type, therefore we &lt;/span&gt;
&lt;span class="c1"&gt;// need to pass type along with dispatch&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INCREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DECREMENT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Decrement&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the Counter component to your App.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, this approach is a bit complex, but it's essential to understand the fundamentals of Redux and how it works. In the second part, we'll simplify things by using redux-toolkit. Let's dive into the easier way of managing state with Redux Toolkit!&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Install Redux Toolkit
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @reduxjs/toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Set up the store with Redux Toolkit
&lt;/h4&gt;

&lt;p&gt;Update your store.js file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createSlice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//A slice is a collection of actions and reducer logic for a single feature in an app&lt;/span&gt;

&lt;span class="c1"&gt;// Create a slice&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counterSlice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Export actions&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;counterSlice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Create store&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;counterSlice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Update the Component
&lt;/h4&gt;

&lt;p&gt;Update the Counter.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decrement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Decrement&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is it, you are done, now go and make real world application to have practice with redux. Happy Coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>redux</category>
      <category>beginners</category>
      <category>react</category>
    </item>
    <item>
      <title>Context API</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Thu, 04 Jul 2024 09:28:03 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/context-api-1ao3</link>
      <guid>https://dev.to/achal_tiwari/context-api-1ao3</guid>
      <description>&lt;h2&gt;
  
  
  What is Context API?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29i2iz7zkjrx6xdufyov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29i2iz7zkjrx6xdufyov.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;br&gt;
The Context API is a React feature that &lt;em&gt;allows you to share state across multiple components without having to pass props down manually at every level&lt;/em&gt;. It’s like a global variable that all components in a tree can access but in a more efficient and easy way.&lt;/p&gt;

&lt;p&gt;Let's first understand the key terms before moving on to the example. If you don't fully grasp the concepts right away, don't worry. Proceeding to the example will help clarify how everything works together.&lt;/p&gt;
&lt;h4&gt;
  
  
  Key Concepts of the Context API
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Context Creation&lt;/strong&gt;: Using &lt;code&gt;createContext&lt;/code&gt; to create a context object.&lt;br&gt;
&lt;strong&gt;Provider&lt;/strong&gt;: Using &lt;code&gt;Context.Provider&lt;/code&gt; to pass the state to child components.&lt;br&gt;
&lt;strong&gt;Consumer&lt;/strong&gt;: Using &lt;code&gt;useContext&lt;/code&gt; to access the state in any component.&lt;/p&gt;

&lt;p&gt;To help you understand the Context API in a practical way, we'll build a very basic login page. In this example, when you type your name and submit it, you'll be greeted with your name. This simple example focuses on the Context API without the complexity of a larger application. I have also explained the code lines in the comments.&lt;/p&gt;

&lt;p&gt;I will provide the names of all the files to make it easy for you to follow along. You can create these files in your src directory and check the functionality yourself.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up the Context
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;UserContext.js&lt;/code&gt;&lt;br&gt;
First, we create a context. This context will hold the user data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;UserContextProvider.jsx&lt;/code&gt;&lt;br&gt;
Next, we create a provider component. This component will wrap around parts of our app that need access to the user data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserContext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserContextProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="c1"&gt;// whatever values you will give below,&lt;/span&gt;
  &lt;span class="c1"&gt;//will be shared to anyone who will call them using useContext()&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/UserContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserContextProvider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using the Context in Our App
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;App.jsx&lt;/code&gt;&lt;br&gt;
In our main App component, we wrap the relevant parts of our app with the UserContextProvider.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserContextProvider&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserContextProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Login&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Login.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Profile&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Profile.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;// This wrapping let's every children compenent to have the access&lt;/span&gt;
&lt;span class="c1"&gt;// to values using the useContext hook&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserContextProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Context&lt;/span&gt; &lt;span class="nx"&gt;Tutorial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/UserContextProvider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Login.jsx&lt;/code&gt;&lt;br&gt;
In the Login component, we use the useContext hook to access and update the user data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserContext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsername&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Here, we extract the setUser function from the UserContext using the useContext hook.&lt;/span&gt;
  &lt;span class="c1"&gt;// Remember, we passed the user and setUser values in the UserContext.Provider:&lt;/span&gt;
  &lt;span class="c1"&gt;// &amp;lt;UserContext.Provider value={{ user, setUser }}&amp;gt;, which makes them accessible to any component &lt;/span&gt;
  &lt;span class="c1"&gt;// that uses the useContext hook with UserContext.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; 
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; 
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; 
        &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Submit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Profile.jsx&lt;/code&gt;&lt;br&gt;
In the Profile component, we use the useContext hook to access the user data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserContext&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt; &lt;span class="nx"&gt;above&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="nx"&gt;here&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see this interface when you run your React App using the above files.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03qczkm0xrhiyzjj63z4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03qczkm0xrhiyzjj63z4.png" alt="Image description" width="577" height="433"&gt;&lt;/a&gt;&lt;br&gt;
After you enter a username and password(anything as there are no checks), this page will greet you with that username.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws1e1cp9772s3m5xxisd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws1e1cp9772s3m5xxisd.png" alt="Image description" width="516" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Here is the Summary of Context API
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr7sm6e2cin4896vg3bm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr7sm6e2cin4896vg3bm.png" alt="Image description" width="800" height="441"&gt;&lt;/a&gt;&lt;br&gt;
This image and the one at the very top is form a &lt;a href="https://www.youtube.com/watch?v=wIyHSOugGGw" rel="noopener noreferrer"&gt;youtube video&lt;/a&gt; by Code Bootcamp.Feel free to ask questions in the comments. I'll be happy to answer them. Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>React 101</title>
      <dc:creator>Achal Tiwari</dc:creator>
      <pubDate>Wed, 03 Jul 2024 13:36:40 +0000</pubDate>
      <link>https://dev.to/achal_tiwari/react-101-kei</link>
      <guid>https://dev.to/achal_tiwari/react-101-kei</guid>
      <description>&lt;p&gt;This article assumes familiarity with React coding, particularly in using states and other essential features.&lt;/p&gt;

&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;State&lt;/em&gt;: &lt;em&gt;Component-specific memory&lt;/em&gt; in React used to track and manage dynamic data within a component.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Dynamic Interaction&lt;/em&gt;: State allows components to change what’s displayed on the screen based on user interactions or other events.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Use Cases
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Form Inputs&lt;/strong&gt;: State is used to remember and update the current value of an input field as a user types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Carousels&lt;/strong&gt;: State tracks the currently displayed image and updates it when the user clicks “next” or “previous”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shopping Carts&lt;/strong&gt;: State manages the items in the shopping cart, adding new products when the user clicks “buy”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;React batches state updates. It updates the screen &lt;strong&gt;after all the event handlers have run&lt;/strong&gt; and have called their &lt;code&gt;set&lt;/code&gt; functions. This prevents multiple re-renders during a single event. In the rare case that you need to force React to update the screen earlier use &lt;code&gt;flushSync&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Queuing a Series of State Updates
&lt;/h2&gt;

&lt;p&gt;Setting a state variable will queue another render. But sometimes you might want to perform multiple operations on the value before queuing the next render&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is a general Interview question&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// M-1&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c1"&gt;// M-2&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;setNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I want you to think about how will M-1 and M-2 perform.&lt;/p&gt;

&lt;h4&gt;
  
  
  M-1 code will only increment the number by 1
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Why?
&lt;/h5&gt;

&lt;p&gt;Each render’s state values are fixed, so the value of number inside the first render’s event handler is always 0, no matter how many times you call setNumber(1):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React waits until all code in the event handlers has run before processing your state updates.&lt;/strong&gt; This is why the re-render only happens &lt;em&gt;after&lt;/em&gt; all these &lt;code&gt;setNumber()&lt;/code&gt; calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  But M-2 code can do the increment by 3
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Why?
&lt;/h5&gt;

&lt;p&gt;Here, &lt;code&gt;n =&amp;gt; n + 1&lt;/code&gt; is called an &lt;strong&gt;updater function&lt;/strong&gt;. When you pass it to a state setter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;React queues this function to be processed after all the other code in the event handler has run.&lt;/li&gt;
&lt;li&gt;During the next render, React goes through the queue and gives you the final updated state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the first part of my &lt;strong&gt;React series&lt;/strong&gt;, covering some basics. Follow me for more upcoming parts! If you have any queries, drop a comment—I'll do my best to provide answers.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
