<?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>Forem: Capwell Murimi</title>
    <description>The latest articles on Forem by Capwell Murimi (@capwellmurimi).</description>
    <link>https://forem.com/capwellmurimi</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%2F1070105%2Fef2bb95c-3613-4c1f-8ab0-a8955b45f3a9.jpeg</url>
      <title>Forem: Capwell Murimi</title>
      <link>https://forem.com/capwellmurimi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/capwellmurimi"/>
    <language>en</language>
    <item>
      <title>🚚 One-Time MySQL to PostgreSQL Migration with pgloader + Docker (Windows-Friendly)</title>
      <dc:creator>Capwell Murimi</dc:creator>
      <pubDate>Thu, 24 Apr 2025 17:22:05 +0000</pubDate>
      <link>https://forem.com/capwellmurimi/one-time-mysql-to-postgresql-migration-with-pgloader-docker-windows-friendly-o23</link>
      <guid>https://forem.com/capwellmurimi/one-time-mysql-to-postgresql-migration-with-pgloader-docker-windows-friendly-o23</guid>
      <description>&lt;p&gt;Hey folks 👋 I’m Capwell, and I recently had to migrate a MySQL database to PostgreSQL. It wasn’t a continuous sync — just a one-time migration — so I needed a quick, clean way to do it.&lt;/p&gt;

&lt;p&gt;When you’re on Windows,You don’t want to install a bunch of tools, and just need something that works without drama, it can feel like a puzzle.&lt;/p&gt;

&lt;p&gt;That’s what led me to pgloader + Docker — the perfect combo for a painless one-time migration. No native installs, no environment weirdness. Just results.&lt;/p&gt;

&lt;p&gt;Here’s how I made it work&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Docker on Windows&lt;/strong&gt;&lt;br&gt;
If you’re using Windows (like I was), the easiest way to get started is by installing Docker Desktop. Here’s a quick walkthrough:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download Docker Desktop&lt;/strong&gt;&lt;br&gt;
👉 &lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run the Installer&lt;/strong&gt;&lt;br&gt;
Follow the setup wizard. You’ll need WSL enabled (Windows Subsystem for Linux), which Docker will guide you through if it’s not already installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Launch Docker&lt;/strong&gt;&lt;br&gt;
Once installed, launch Docker Desktop. You should see the Docker whale icon in your system tray.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why pgloader?&lt;/strong&gt;&lt;br&gt;
pgloader is an open-source tool that:&lt;/p&gt;

&lt;p&gt;✅ Migrates schema and data&lt;br&gt;
✅ Handles type conversions&lt;br&gt;
✅ Works with MySQL, SQLite, MS SQL&lt;br&gt;
✅ Supports load scripts for reusable, declarative migrations&lt;br&gt;
✅ Can be run with Docker — no need to install anything&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a pgloader Load Script&lt;/strong&gt;&lt;br&gt;
In the folder where you want to run the migration, create a file called mysql_to_pg.load with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOAD DATABASE
     FROM mysql://root:yourpass@host.docker.internal/source_db
     INTO postgresql://postgres:pgpass@host.docker.internal/target_db

WITH include drop, 
create tables, 
create indexes, 
reset sequences,
data only

SET work_mem to '16MB',
    maintenance_work_mem to '512 MB';

ALTER SCHEMA 'source_db' RENAME TO 'public';

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

&lt;/div&gt;



&lt;p&gt;🔁 Replace:&lt;/p&gt;

&lt;p&gt;yourpass → your MySQL root password&lt;/p&gt;

&lt;p&gt;pgpass → your PostgreSQL password&lt;/p&gt;

&lt;p&gt;source_db / target_db → your actual DB names&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Run pgloader with Docker&lt;/strong&gt;&lt;br&gt;
Make sure Docker is installed and both MySQL/PostgreSQL are up and running.&lt;/p&gt;

&lt;p&gt;On Windows (PowerShell)&lt;br&gt;
powershell&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run --rm -v "folder where the file is":/mnt dimitri/pgloader pgloader /mnt/mysql_to_pg.load&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🛠 Common Pitfalls&lt;br&gt;
✅ Make sure MySQL and Postgres are running&lt;/p&gt;

&lt;p&gt;✅ Ensure firewall/ports aren’t blocking connections&lt;/p&gt;

&lt;p&gt;✅ For Dockerized MySQL/Postgres, use a shared network or proper host IPs&lt;/p&gt;

&lt;p&gt;💬 Final Thoughts&lt;br&gt;
This approach:&lt;/p&gt;

&lt;p&gt;✔️ Works on Windows (which I used)&lt;br&gt;
✔️ Doesn’t require any installs (thanks to Docker)&lt;br&gt;
✔️ Makes migrations repeatable with load scripts&lt;/p&gt;

&lt;p&gt;For a one-time migration, it's hard to beat.&lt;/p&gt;

&lt;p&gt;Got stuck?&lt;br&gt;
Drop a comment below or ping me on &lt;a href="https://x.com/CapwellMurimi" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>database</category>
      <category>mysql</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Navigating React's Seas of Data: The Enchantment of useContext - Part One</title>
      <dc:creator>Capwell Murimi</dc:creator>
      <pubDate>Thu, 01 Feb 2024 16:57:19 +0000</pubDate>
      <link>https://forem.com/capwellmurimi/navigating-reacts-seas-of-data-the-enchantment-of-usecontext-part-one-31d3</link>
      <guid>https://forem.com/capwellmurimi/navigating-reacts-seas-of-data-the-enchantment-of-usecontext-part-one-31d3</guid>
      <description>&lt;p&gt;In the vast ocean of React development, finding efficient ways to share and manage data across components is akin to discovering hidden treasures. In this captivating series, we set sail on a voyage through the waters of React Hooks, with Part One dedicated to unraveling the enchanting powers of useContext. Brace yourselves as we embark on a journey that promises to transform the way you handle state and context in your React applications.&lt;/p&gt;

&lt;p&gt;The Prelude to Context Magic:&lt;br&gt;
Before we dive into the wonders of useContext, let's set the stage with a glimpse into the challenges of sharing state between distant React components. In this chapter, we explore the complexities of prop drilling and discover why useContext emerges as the beacon of light in our quest for clean and maintainable code.&lt;/p&gt;

&lt;p&gt;Unveiling the Oracle - Creating React Context:&lt;br&gt;
The power of useContext lies in its connection to the mystical realms of React Context. Learn how to create a Context and establish a magical bond that transcends component hierarchies. As we unlock the secrets of this React Oracle, you'll witness the emergence of a shared space where data flows effortlessly, fostering a new era of component communication.&lt;/p&gt;

&lt;p&gt;The Dance of Providers and Consumers:&lt;br&gt;
In this chapter, we delve into the delicate dance between Providers and Consumers. Providers act as guardians of the sacred data, while Consumers, armed with useContext, tap into the wellspring of information. Witness the elegant choreography that unfolds as we orchestrate this dance, creating a harmonious symphony of components that seamlessly share their tales.&lt;/p&gt;

&lt;p&gt;Practical Sorcery - Real-world Applications of useContext:&lt;br&gt;
No journey is complete without practical applications. In this chapter, we apply the wisdom gained from the previous chapters to real-world scenarios. Discover how useContext can simplify the implementation of themes, authentication, and other shared states, transforming your codebase into a realm of clarity and elegance.&lt;/p&gt;

&lt;p&gt;As we wrap up Part One of our exploration, it feels like we're standing at the edge of this incredible sea called useContext in the React world. But hold on, the story has only just begun. The little marks we've made on the shore are like a teaser to the grand adventure that lies ahead.&lt;/p&gt;

&lt;p&gt;In the vast landscape of React, useContext has become our trusty guide, steering us through unknown territories where code becomes more efficient and expressive. Can you feel the excitement? Our sails are fluttering, and we're getting ready for the next part of this journey.&lt;/p&gt;

&lt;p&gt;The tales of useContext are not fading away anytime soon. In the next chapter, we're going to unfold the mysteries in Chapter One, going deeper into the secrets that React Hooks have in store for those who dare to take on this thrilling ride. The story unfolds, and the magic of useContext is still calling out to those brave souls ready to dive deeper into the wonders of React.&lt;/p&gt;

&lt;p&gt;So, dear adventurer, tighten your grip on your compass because the journey is far from over. The odyssey continues, and as we sail forward, new surprises and insights are just waiting to be discovered on the horizon. Get ready for the next wave of revelations! &lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>usecontext</category>
    </item>
    <item>
      <title>Unleashing the Power of useEffect</title>
      <dc:creator>Capwell Murimi</dc:creator>
      <pubDate>Sat, 05 Aug 2023 16:39:56 +0000</pubDate>
      <link>https://forem.com/capwellmurimi/unleashing-the-power-of-useeffect-3b2p</link>
      <guid>https://forem.com/capwellmurimi/unleashing-the-power-of-useeffect-3b2p</guid>
      <description>&lt;p&gt;Have you ever wanted to make your web page or app more interactive and fun? In the world of web development, we have a powerful tool called the useEffect hook that allows us to do just that. In this article, we'll explore how the useEffect hook works and how it can bring your web projects to life.&lt;/p&gt;

&lt;p&gt;Imagine you have a toy robot that can do different things. Sometimes, you want the robot to do something special when a certain condition is met. That's where the useEffect hook comes in.&lt;br&gt;
The useEffect hook is like a special command you give to the robot. You tell the robot, "Hey, whenever this condition is true, do this special action." The condition could be something like a button being clicked or a number changing.&lt;br&gt;
For example, let's say you have a button on a webpage. When you click the button, you want the robot to make a sound. You can use the useEffect hook to tell the robot, "Hey, whenever the button is clicked, make a sound."&lt;br&gt;
The useEffect hook works like this: you give it two things. First, you give it the special action you want the robot to do. In our case, it's making a sound. Second, you give it the condition that triggers the action. In our case, it's the button being clicked.&lt;br&gt;
The robot listens for the condition to happen. When it does, it performs the special action. In our example, when you click the button, the robot makes a sound.&lt;br&gt;
The useEffect hook is really helpful because it allows you to control when the robot should do something special. You can tell it to do the action only once, or every time the condition happens.&lt;br&gt;
It's important to remember that the robot can also clean up after itself. For example, if the robot creates some mess while making the sound, it can clean it up when it's done. This is called the clean-up function, and it's like the robot taking care of its mess.&lt;br&gt;
So, the useEffect hook is like giving instructions to a robot. You tell it what to do and when to do it. It's a way to make your web page or app more interactive and fun!&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sorting Simplified: The Quirky World of Selection Sort</title>
      <dc:creator>Capwell Murimi</dc:creator>
      <pubDate>Thu, 01 Jun 2023 13:45:30 +0000</pubDate>
      <link>https://forem.com/capwellmurimi/sorting-simplified-the-quirky-world-of-selection-sort-3a87</link>
      <guid>https://forem.com/capwellmurimi/sorting-simplified-the-quirky-world-of-selection-sort-3a87</guid>
      <description>&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%2Fcdn-images-1.medium.com%2Fmax%2F10368%2F0%2AKVMvByQuPBj7e1Yg" 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%2Fcdn-images-1.medium.com%2Fmax%2F10368%2F0%2AKVMvByQuPBj7e1Yg" alt="Photo by [Arnold Francisca](https://unsplash.com/pt-br/@clark_fransa?utm_source=medium&amp;amp;utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sorting can be a perplexing ordeal, like trying to find matching socks in a laundry basket. Fear not! We’re here to unravel the secrets of the selection sort algorithm, a peculiar creature that loves finding the most minor elements and putting them in their rightful places. Get ready to embark on a comical journey through the whimsical world of selection sort!&lt;/p&gt;

&lt;p&gt;Once upon a time, in the kingdom of Arraysville, there lived an algorithm called selection sort. This quirky algorithm had a unique way of sorting arrays by repeatedly seeking out the tiniest elements and swapping them with the lucky residents of the sorted kingdom. Let’s delve into the peculiar steps of this delightful dance!&lt;/p&gt;

&lt;p&gt;Step-by-Step Adventure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Our adventure begins with a disorderly array. It’s like a group of mischievous cats, each vying for attention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The sorted kingdom starts at the beginning of the array, sipping tea and waiting for the festivities to commence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With a swish of its magical wand, selection sort starts iterating through the array, examining each cat — I mean, element — one by one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In each encounter, selection sort identifies a potential candidate for the coveted “tiniest element” title. It has an eye for spotting those fluffy little integers!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Like a game show host, selection sort challenges the remaining elements, asking, “Are you smaller than our esteemed candidate? Show me what you’ve got!”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Whenever a smaller element is found, selection sort joyfully adjusts its candidate, eager to crown the new winner. Talk about a competitive spirit!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After thoroughly inspecting the contestants, selection sort confidently swaps the newly crowned tiniest element with the resident at the front of the sorted kingdom. It’s like sending a champion to reign in the right place!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With every successful swap, the sorted kingdom expands, and the boundary moves forward, leaving behind a trail of harmonious integers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selection sort waves its wand again, ready for the next round of the “find the tiniest” game. It repeats steps 3 to 8 until the entire array is sorted, leaving no feline — I mean, element — behind.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, let’s address the elephant in the room — time complexity. Brace yourself! Selection sort has a bit of a dramatic side. It performs a linear search in each iteration, like a lost traveler searching for the perfect souvenir. As a result, the time required to sort grows exponentially with the array’s size, just like a magician pulling rabbits out of a hat. It’s a bit slow for large arrays, but perfect for a leisurely stroll with smaller datasets.🕰️🐇&lt;/p&gt;

&lt;p&gt;Selection sort might not be the fastest horse in the race, but it has its moments of glory. It shines when the array is partially sorted or when you’re feeling nostalgic for the good ol’ days of sorting. It’s like the reliable grandparent who tells stories of simpler times. However, for larger arrays, consider enlisting the help of more efficient algorithms like merge sort or quicksort, the speedsters of the sorting world.🏎️💨&lt;/p&gt;

&lt;p&gt;In the wacky realm of sorting algorithms, selection sort stands as an endearing character, tirelessly searching for the tiniest elements and placing them in their rightful positions. Although its time complexity might raise a few eyebrows, it’s a lovable choice for smaller arrays and a delightful introduction to the enchanting world of sorting. So, grab your popcorn and witness the whimsical dance of selection sort — the sorting algorithm that proves even the quirkiest creatures can bring order to chaos!✨🎩🎶&lt;/p&gt;

&lt;p&gt;Remember, sorting algorithms are like a circus of techniques, each with its own charm and peculiarities. Exploring the colorful world of sorting is not only educational but also an opportunity to embrace the humor and imagination that algorithms can inspire. Happy sorting! 🎪🤹&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>algorithms</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How to Validate Credit Card Numbers Using the Luhn Algorithm in C</title>
      <dc:creator>Capwell Murimi</dc:creator>
      <pubDate>Tue, 16 May 2023 20:42:34 +0000</pubDate>
      <link>https://forem.com/capwellmurimi/how-to-validate-credit-card-numbers-using-the-luhn-algorithm-in-c-4fc0</link>
      <guid>https://forem.com/capwellmurimi/how-to-validate-credit-card-numbers-using-the-luhn-algorithm-in-c-4fc0</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
Credit card validation is an important part of e-commerce and online transactions. In order to prevent fraud and ensure that transactions are secure, it's essential to verify that the credit card number entered by the user is valid. In this article, we'll explore how to validate credit card numbers using the Luhn algorithm in C.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is the Luhn Algorithm?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Luhn algorithm, also known as the "modulus 10" algorithm, is a simple checksum formula used to validate a variety of identification numbers, including credit card numbers. The algorithm works by summing up the digits of the number, starting from the rightmost digit and moving left. If the sum is divisible by 10, then the number is considered valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How does it work ?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Multiply every other digit by 2, starting with the number’s second-to-last digit, and then add those products’ digits together.&lt;/li&gt;
&lt;li&gt;Add the sum to the sum of the digits that weren’t multiplied by 2.&lt;/li&gt;
&lt;li&gt;If the total’s last digit is 0 (or, put more formally, if the total modulo 10 is congruent to 0), the number is valid!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;An example;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For the sake of discussion, let’s first underline every other digit, starting with the number’s second-to-last digit:

4003600000000014

Okay, let’s multiply each of the underlined digits by 2:

1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2

That gives us:

2 + 0 + 0 + 0 + 0 + 12 + 0 + 8

Now let’s add those products’ digits (i.e., not the products themselves) together:

2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13

Now let’s add that sum (13) to the sum of the digits that weren’t multiplied by 2 (starting from the end):

13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20

Yup, the last digit in that sum (20) is a 0, so David’s card is legit!

So, validating credit card numbers isn’t hard, but it does get a bit tedious by hand. Let’s write a program.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The Code&lt;br&gt;
Let's take a look at the code for validating credit card numbers using the Luhn algorithm in C:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pseudocode:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Prompt the user to enter a credit card number
2. Read the credit card number from the user
3. Check if the credit card number is valid (greater than 0)
4. If the credit card number is not valid, go back to step 1
5. Extract the first few digits of the credit card number to determine the type of card
6. Initialize a variable to store the sum of the digits
7. While the credit card number is greater than 0:
   a. Get the last digit of the credit card number using the modulus operator
   b. Remove the last digit from the credit card number using integer division
   c. Increment a counter to keep track of the number of digits
   d. If the current digit is even (based on the counter):
      i. Double the digit
      ii. If the result is greater than 9, subtract 9 from it
   e. Add the current digit (or the doubled digit) to the sum
8. Check if the sum is divisible by 10
9. If the sum is divisible by 10:
   a. Check the first few digits of the credit card number to determine the type of card
   b. Print the name of the card (AMEX, MASTERCARD, VISA) or "INVALID"
10. If the sum is not divisible by 10, print "INVALID"
11. Terminate the program
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The actual code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The code starts by asking the user to enter a credit card number. It then uses a do-while loop to ensure that the user enters a positive number.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next, the code extracts the first few digits of the credit card number to determine the type of card. For example, American Express cards typically start with the digits 34 or 37, so the code divides the credit card number by 10^13 and stores the result in the amex variable. Similarly, Mastercard cards typically start with the digits 51, 52, 53, 54, or 55, so the code divides the credit card number by 10^14 and stores the result in the master variable. Visa cards can start with the digit 4, so the code divides the credit card number by 10^12 and 10^15 and stores the results in the visa array.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The code then applies the Luhn algorithm to the credit card number to calculate a checksum. The algorithm works by iterating over the digits of the number, starting from the rightmost digit and moving left. If the current digit is even, the code doubles it and subtracts 9 if the result is greater than 9. The code then adds the current digit (or the doubled digit) to a running sum.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, the code checks if the checksum is valid by checking if the sum is divisible by 10. If the checksum is valid, the code checks the first few digits of the credit card number to determine the type of card. If the card is a valid American Express, Mastercard, or Visa card, the code prints the name of the card. Otherwise, the code prints "INVALID".&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;br&gt;
In this article, we've explored how to validate credit card numbers using the Luhn algorithm in C. We've seen how the algorithm works, and how to implement it in code using loops, conditionals, and arrays. We've also discussed how to extract the first few digits of a credit card number to determine the type of card. By following these steps, you can ensure that your e-commerce and online transactions are secure and free from fraud.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>c</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
