<?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: Kpeale Legbara</title>
    <description>The latest articles on DEV Community by Kpeale Legbara (@kpeale).</description>
    <link>https://dev.to/kpeale</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%2F471420%2F40002ca1-3813-4e64-a632-13885342a8b9.jpeg</url>
      <title>DEV Community: Kpeale Legbara</title>
      <link>https://dev.to/kpeale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kpeale"/>
    <language>en</language>
    <item>
      <title>How to make your first open source contribution</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Fri, 14 Nov 2025 11:25:14 +0000</pubDate>
      <link>https://dev.to/kpeale/how-to-make-your-first-open-source-contribution-3328</link>
      <guid>https://dev.to/kpeale/how-to-make-your-first-open-source-contribution-3328</guid>
      <description>&lt;p&gt;&lt;em&gt;I Just Made My First Open Source Contribution — And Honestly, I Don’t Know How to Feel 😂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To be sincere, I actually feel very happy, and I’ve realized it’s not as complicated as I thought.&lt;/p&gt;

&lt;p&gt;Contributing to open source &lt;em&gt;can&lt;/em&gt; feel overwhelming. Yesterday, I had tons of tabs open on my browser because I was trying to understand how to contribute, but I was still confused and frustrated. I even watched several YouTube videos, yet nothing clicked. I eventually closed all my tabs and decided to try again this morning… and guess what? I made my first open source contribution.&lt;/p&gt;

&lt;p&gt;I’m writing this article so that anyone who feels lost like I did can learn from my mistakes and finally make their first open source contribution too.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Make Your First Open Source Contribution
&lt;/h2&gt;

&lt;p&gt;I know there are websites that help you find projects to contribute to, but honestly, I think you should avoid relying on them at first. Most of these platforms recommend very big projects with strict contribution rules, or inactive projects that haven’t been updated in months (or even years). Neither of those is what you want for your first contribution.&lt;/p&gt;

&lt;p&gt;Instead, go to your GitHub search bar and type this query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;is: issue is: open "good first issue" language: JavaScript stars:&amp;lt;200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OR&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;is:public stars:&amp;lt;150 "help wanted" language:TypeScript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query tells GitHub to show repositories that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have open issues&lt;/li&gt;
&lt;li&gt; Have a “good first issue” label&lt;/li&gt;
&lt;li&gt; Use JavaScript (feel free to change the language, I primarily write JavaScript, which is why I used JavaScript there).&lt;/li&gt;
&lt;li&gt; Have less than 200 stars (because smaller repositories are usually easier to contribute to)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The search results will look something like this:&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%2Fdkx3skyt6ifu21khakfv.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%2Fdkx3skyt6ifu21khakfv.PNG" alt="Results for the search query" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Issues&lt;/strong&gt; tab to see more projects, then check the repositories one by one and pick the one that aligns with your values and skills — and one you can actually solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Check Before Contributing
&lt;/h2&gt;

&lt;p&gt;Before you start working on any repository, make sure it checks these boxes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;A license file:&lt;/strong&gt; This confirms the project is open to contributions.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;A CONTRIBUTING.md or guidelines file:&lt;/strong&gt; Most maintainers outline how they want contributions to be made.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Active maintainers:&lt;/strong&gt; Check the issues tab to see if maintainers reply quickly, give feedback, or appreciate contributors. You don’t want to contribute to a repo where nobody responds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the repository ticks all the boxes, go through the issues and find one that is unassigned or not actively being worked on. Leave a comment showing interest.&lt;/p&gt;

&lt;p&gt;For my first open source contribution, I contributed to a Python project by updating their README file. I left a comment, and the maintainer replied almost immediately.&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%2Fwhbeu7t5szb59s7fmvxj.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%2Fwhbeu7t5szb59s7fmvxj.PNG" alt="comment on issues" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Forking the Project
&lt;/h2&gt;

&lt;p&gt;Once you’re ready, &lt;strong&gt;fork the repository&lt;/strong&gt; so it becomes your personal copy.&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%2Fs8fnze8dbbitwg9l3yg9.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%2Fs8fnze8dbbitwg9l3yg9.PNG" alt="fork repo button" width="800" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then open Git Bash or Command Prompt on your machine and clone your fork:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/YOUR-USERNAME/REPO-NAME.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create a new branch — this is good practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b update-readme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the folder in your IDE and make the changes you want. After you’re done, commit your changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add README.md
git commit -m "Improve README documentation"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Change the commit message to match what you actually did.)&lt;/p&gt;

&lt;p&gt;Then push the changes to your fork:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin update-readme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Making the Pull Request
&lt;/h2&gt;

&lt;p&gt;Congratulations! You just made your first open source contribution. 🎉&lt;/p&gt;

&lt;p&gt;Now it’s time to submit your pull request.&lt;/p&gt;

&lt;p&gt;Go back to the original repository on GitHub (the one you forked). You’ll see a button saying &lt;strong&gt;“Compare &amp;amp; pull request.”&lt;/strong&gt; Click it, write a short message explaining what you improved, and submit your PR.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;You’re officially an open source contributor. 🚀&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>developer</category>
      <category>womenintech</category>
    </item>
    <item>
      <title>Understanding APIs: Basics, Types, and Architectures Explained Simply</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Fri, 03 Oct 2025 19:46:57 +0000</pubDate>
      <link>https://dev.to/kpeale/understanding-apis-basics-types-and-architectures-explained-simply-38i7</link>
      <guid>https://dev.to/kpeale/understanding-apis-basics-types-and-architectures-explained-simply-38i7</guid>
      <description>&lt;p&gt;Human beings are not the only ones who have communication. Do you know that websites also talk to each other? Yes, they communicate with each other through an API.&lt;/p&gt;

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

&lt;p&gt;API is an acronym that stands for Application Programming Interface. API is a set of rules that allow software applications to communicate to each other. APIs are used in our everyday life even without us knowing. Most of our applications on our phones utilize APIs, from the smallest app to the largest app. &lt;/p&gt;

&lt;h2&gt;
  
  
  Simple Analogy Of How Websites Talk:
&lt;/h2&gt;

&lt;p&gt;When you walk into a restaurant, whether a fine dining or a casual dining . You are greeted by the waiter and handed the menu. You never get to speak to the chef yourself. All communications are handled by the chef till you are served your food. &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%2Fx9wxrc58j96dbz08n74f.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%2Fx9wxrc58j96dbz08n74f.jpg" alt="Waiter serving food in a restaurant" width="263" height="192"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In the same way, when two applications are talking to themselves they do it through a third person, which is the API. &lt;br&gt;
Every single Application we use, makes use of API. From the weather forecast application to the movies applications on your phone. They are communicating to a server through the API which makes information available to be used on these platforms. &lt;/p&gt;

&lt;h2&gt;
  
  
  What API allows us to do?
&lt;/h2&gt;

&lt;p&gt;APIs allow us to do so many things without even realizing it. When you open your weather app and it shows you the current temperature in your location, that’s an API working behind the scenes. When you book a ride with Bolt or order food with Jumia Food, APIs are involved in fetching real-time prices, delivery times, and more. That is when your data is turned off, you cannot use the services of these applications.&lt;/p&gt;

&lt;p&gt;As frontend developers, APIs allow us to request data from a backend server and display it beautifully on the frontend. As technical writers, understanding what APIs can do helps us explain how different parts of a system talk to each other, and how users can integrate or use those features.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do APIs Work?
&lt;/h2&gt;

&lt;p&gt;Let’s break it down with a real-world perspective.&lt;/p&gt;

&lt;p&gt;When you open your favorite e-commerce website and search for “wireless headphones,” here's what happens behind the scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your search query is sent to the server via an API.&lt;/li&gt;
&lt;li&gt;The API receives your request, processes it, and sends it to the right place in the backend system.&lt;/li&gt;
&lt;li&gt;The backend retrieves a list of products, wraps that data, and sends it back via the API.&lt;/li&gt;
&lt;li&gt;Your browser then receives that data and displays the results on the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So essentially, the API acts as a messenger between your frontend and backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common API Request Methods
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GET – to retrieve data (e.g., get a list of blog posts)&lt;/li&gt;
&lt;li&gt;POST – to send new data (e.g., create a new user)&lt;/li&gt;
&lt;li&gt;PUT – to update existing data&lt;/li&gt;
&lt;li&gt;DELETE – to remove data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These methods follow the HTTP protocol, which is the same language your browser uses to access web pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of APIs
&lt;/h2&gt;

&lt;p&gt;APIs come in different flavors depending on how they’re used and who has access to them:&lt;/p&gt;

&lt;p&gt;A. Open/Public APIs&lt;br&gt;
These are available to anyone. Companies like Twitter, GitHub, and Spotify offer public APIs so developers can build apps that interact with their platforms.&lt;/p&gt;

&lt;p&gt;Example: You can build an app that fetches tweets based on a hashtag using the Twitter API.&lt;/p&gt;

&lt;p&gt;B. Private APIs&lt;br&gt;
Used internally within a company. These APIs are not exposed to the public and are used to connect different internal services.&lt;/p&gt;

&lt;p&gt;Example: A bank might use private APIs to connect its mobile app to the database that holds user account info.&lt;/p&gt;

&lt;p&gt;C. Partner APIs&lt;br&gt;
These are shared with specific business partners. They're not public, but they're not completely private either — they're accessible to selected users who have been granted permission.&lt;/p&gt;

&lt;p&gt;Example: An airline might offer a partner API to travel agencies to book tickets directly.&lt;/p&gt;

&lt;p&gt;D. Composite APIs&lt;br&gt;
These combine multiple APIs into one call. Instead of sending multiple requests, a composite API allows you to bundle them.&lt;/p&gt;

&lt;p&gt;Example: A dashboard that shows user details, recent orders, and notifications might use a composite API to get all that info in one go.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Architectures
&lt;/h2&gt;

&lt;p&gt;Different APIs are designed using different architectures. The most common ones include:&lt;/p&gt;

&lt;p&gt;A. REST (Representational State Transfer)&lt;br&gt;
REST is the most popular architecture. It’s simple, stateless, and works well with HTTP methods like GET and POST. It uses URLs to identify resources. Data is usually exchanged in JSON format. It’s stateless, meaning each request stands alone.&lt;/p&gt;

&lt;p&gt;Example: GET &lt;a href="https://api.example.com/users/123" rel="noopener noreferrer"&gt;https://api.example.com/users/123&lt;/a&gt; fetches data about user 123.&lt;/p&gt;

&lt;p&gt;B. SOAP (Simple Object Access Protocol)&lt;br&gt;
SOAP is older and more strict. It uses XML instead of JSON and has strict messaging rules. More secure than REST in some cases. Still used in industries like banking and government. Think of SOAP as the “corporate” version of REST — formal and detailed.&lt;/p&gt;

&lt;p&gt;C. GraphQL&lt;br&gt;
GraphQL is newer and more flexible. Instead of getting too much or too little data, you can request exactly what you need. Created by Facebook. It reduces over-fetching or under-fetching of data. It uses a single endpoint for all queries&lt;/p&gt;

&lt;p&gt;Example: You can ask for a user’s name and email in one query — and that’s all you’ll get back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools That Help You Work with APIs
&lt;/h2&gt;

&lt;p&gt;Learning about APIs is one thing, but knowing how to work with them is where the fun begins. Here are some tools you'll come across often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman: This is your best friend for testing and exploring APIs. You can send different kinds of requests, view responses, and even write simple tests.&lt;/li&gt;
&lt;li&gt;Swagger / OpenAPI: These help developers document APIs properly. They create readable, interactive docs based on your API’s code.&lt;/li&gt;
&lt;li&gt;Curl: A command-line tool for sending HTTP requests. Useful for quick testing if you're comfortable with the terminal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;APIs are the invisible glue holding the internet together. They make our apps smarter, our websites more dynamic, and our digital experiences smoother. Whether you're a developer building interfaces or a technical writer documenting how things work, understanding APIs is no longer optional — it’s essential.&lt;/p&gt;

&lt;p&gt;So the next time you open your favorite app and it “magically” shows you new data, just know: it’s not magic. It’s an API, doing its job in the background.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>womenintech</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to Add Authentication to Your Next.js App with Auth.js</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Sat, 19 Jul 2025 08:44:04 +0000</pubDate>
      <link>https://dev.to/kpeale/how-to-add-authentication-to-your-nextjs-app-with-authjs-2j20</link>
      <guid>https://dev.to/kpeale/how-to-add-authentication-to-your-nextjs-app-with-authjs-2j20</guid>
      <description>&lt;p&gt;Have you ever wanted to add authentication to your Next.js app but didn’t know where to start?&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk you through how to add authentication to your Next.js application using Auth.js, formerly known as NextAuth.&lt;/p&gt;

&lt;p&gt;By the end of this tutorial, you’ll be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand Authentication using Auth.js in Next.js&lt;/li&gt;
&lt;li&gt;Sign in with your Google account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication is very common in almost all the applications we use on our mobile phones or laptops. Most users rarely create a new profile in any app when they can sign-up using their Google account or Github account. In this article, we will be looking at how to grant authentication to a user using Auth.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Auth.js?
&lt;/h2&gt;

&lt;p&gt;Auth.js is a complete open-source authentication solution for JavaScript applications. It's flexible and supports multiple providers, including Google, GitHub, Discord, and more..&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Auth.js in a Next.js application?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Easy and simple to use: One main reason developers go for Auth.js is how simple the process of authentication is with Auth.js.&lt;/li&gt;
&lt;li&gt;Secure Session Management: Auth.js handles secure session management, including the use of encrypted cookies or JSON Web Tokens (JWTs) to maintain user state across requests.&lt;/li&gt;
&lt;li&gt;Customization and Flexibility: Auth.js allows for significant customization this means developers can tailor login pages and sign-out processes to match their application's design and requirements.&lt;/li&gt;
&lt;li&gt;Built-in Security Features: Auth.js incorporates security best practices, such as handling sensitive data securely.&lt;/li&gt;
&lt;li&gt;Ease of Integration with Next.js: Auth.js offers seamless compatibility with Next.js features like the App Router and Pages Router.&lt;/li&gt;
&lt;li&gt;Open-Source and Community Support:Auth.js is an open-source project. It has a large and active community, providing extensive documentation, tutorials, and support for developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To follow along, you should have a basic understanding of React and Next.js. You should also have a Next.js project set up. If you don’t, you can quickly create one using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the prompts to install Next.js in your project.For this tutorial, I’ll be using the App Router (introduced in Next.js 13+). Auth.js supports both the App Router and Pages Router, but in this guide, we’ll use the App Router. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Installing and Setting Up Auth.js
&lt;/h2&gt;

&lt;p&gt;After installing Next.js in your project. The next thing is to install Auth.js. Run this command to install the Auth.js dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install next-auth@beta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Set Up Environment
&lt;/h2&gt;

&lt;p&gt;The only environment variable that is mandatory is the AUTH_SECRET. This is a random value used by the library to encrypt tokens and email verification hashes. You can generate one by running the command below in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx auth secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the command, a file with the name env.local will be created for you. Inside the env.local, you will see the AUTH_secret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Set Up the Auth Route
&lt;/h2&gt;

&lt;p&gt;A. Begin by creating a new auth.ts file at your project's root with the following content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;NextAuth&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;next-auth&lt;/span&gt;&lt;span class="dl"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NextAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providers&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;B. The next step is to add a Route Handler. We'll do this by creating an api folder inside the app folder. Then, create another folder named auth inside the api folder. Within the auth folder, create a folder called [...nextauth]. Inside [...nextauth], add a file named route.ts. Insert the following code into route.ts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;handlers&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;@/auth&lt;/span&gt;&lt;span class="dl"&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C. The final step in this setup is to add an optional Middleware to keep the session alive, which will refresh the session expiry each time it is called. To do this, create a middleware.ts file at the root and include the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;middleware&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;@/auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have finished the basic authentication setup! Now, we will go to setup the authentication methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Authentication Methods
&lt;/h2&gt;

&lt;p&gt;Auth.js comes with over 80 providers preconfigured. You can choose any provider in their documentation &lt;a href="https://authjs.dev/getting-started/authentication/oauth" rel="noopener noreferrer"&gt;here&lt;/a&gt; to get a walk-through, but for the purpose of this article, we will use Google.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Register OAuth App in Google's dashboard: First, we will set up an OAuth application on the Google Developers Dashboard. Click on this &lt;a href="https://console.developers.google.com" rel="noopener noreferrer"&gt;link&lt;/a&gt; to take you to Google Developers Dashboard. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an account if you do not have a Google account. if you have one, then sign-in. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Create a new project. Fill in a project name and click Create. Go to library on the left menu and search for "Google + API. If you cannot find it then click on this  &lt;a href="https://console.cloud.google.com/apis/credentials" rel="noopener noreferrer"&gt;link&lt;/a&gt;, it will direct you to where you will create the OAuth for Google. On the left menu, click on "consent screen" . You will be asked some basic information, fill it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now the consent screen is up, click on credentials so we can add the credentials created to our Next.js app. Click on create credentials and also click on create OAUTH client id. The fill the following questions with the answers below: &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Application type: Web application&lt;/li&gt;
&lt;li&gt;Name: (anything like NextAuth App)&lt;/li&gt;
&lt;li&gt;Authorized redirect URI: &lt;a href="http://localhost:3000/api/auth/callback/google" rel="noopener noreferrer"&gt;http://localhost:3000/api/auth/callback/google&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click on Create. A pop up will come up showing you the client id and client secrete. Copy the details and add them to env.local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_CLIENT_ID=your-client-id
GOOGLE_CLIENT_SECRET=your-client-secret
NEXTAUTH_SECRET=your-random-secret

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

&lt;/div&gt;



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

&lt;p&gt;A. Let’s enable Google as a sign in option in our Auth.js configuration. You’ll have to import the Google provider from the package and pass it to the providers array we setup earlier in the Auth.js config file. Copy the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import NextAuth from 'next-auth';
import Google from 'next-auth/providers/google';

export const { handlers, signIn, signOut, auth } = NextAuth({
  providers: [
    Google({
      clientId: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
    }),
  ],
});

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

&lt;/div&gt;



&lt;p&gt;B. Add the handlers which NextAuth returns to your api/auth/[...nextauth]/route.ts file so that Auth.js can run on any incoming request. Copy the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { handlers } from "@/auth"
export const { GET, POST } = handlers

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add Signin Button
&lt;/h2&gt;

&lt;p&gt;Next, we will add a sign-in button somewhere in our application so it will trigger Auth.js sign- in when clicked. You can now use the Sign-in from auth.js in your button like the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
'use client';
import { NavLinks } from '@/constant/constant';
import Link from 'next/link';
import { HiBars3BottomRight } from 'react-icons/hi2';
import { LuNetwork } from 'react-icons/lu';
import { signIn } from 'next-auth/react'

const Nav = () =&amp;gt; {

  return (
    &amp;lt;div
      className={transition-all ${
        navBg ? 'bg-white dark:bg-gray-900 shadow-md' : 'fixed'
      } duration-200 h-[12vh] z-[10000]  fixed w-full}
    &amp;gt;
      &amp;lt;div className='flex items-center h-full justify-between w-[92%] mx-auto'&amp;gt;
        &amp;lt;div className='flex items-center sm:space-x-20'&amp;gt;
          {/* logo */}
          &amp;lt;div className='flex items-center space-x-2'&amp;gt;
            &amp;lt;div className='w-10 h-10 bg-cyan-800 dark:bg-white  rounded-full flex items-center justify-center flex-col'&amp;gt;
              &amp;lt;LuNetwork className='w-5 h-5 text-white dark:text-black' /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;h1 className='text-xl hidden sm:block md:text-2xl text-cyan-800 dark:text-white font-bold'&amp;gt;
              Devhire
            &amp;lt;/h1&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div className='hidden lg:flex items-center space-x-10'&amp;gt;
            {NavLinks.map((link) =&amp;gt; (
              &amp;lt;Link
                href={link.url}
                key={link.id}
                className='text-base hover:text-cyan-700 dark:hover:text-cyan-200 font-medium transition-all duration-200'
              &amp;gt;
                &amp;lt;p&amp;gt;{link.label}&amp;lt;/p&amp;gt;
              &amp;lt;/Link&amp;gt;
            ))}
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div className='flex items-center space-x-4'&amp;gt;

            &amp;lt;button
              className='px-8 py-2.5 text-xs sm:text-sm rounded-lg cursor-pointer bg-gray-100 hover:bg-gray-300 transition-all duration-300  dark:bg:gray-700 dark:hover:bg-gray-900 '
              type='submit'
              onClick={() =&amp;gt; signIn('google')}
            &amp;gt;
              Login / Register
            &amp;lt;/button&amp;gt;
            &amp;lt;button className='px-8 py-2.5 text-xs sm:text-sm hidden sm:block rounded-lg cursor-pointer bg-cyan-700 hover:bg-cyan-900 transition-all duration-300'&amp;gt;
              Job Post
            &amp;lt;/button&amp;gt;

          &amp;lt;HiBars3BottomRight
            className='w-8 h-8 cursor-pointer text-black lg:hidden dark:text-white'

          /&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Nav;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, I created a nav component and added the sign-in from Auth.js.&lt;/p&gt;

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

&lt;p&gt;Auth.js is very easy to use and I am sure you can say the same after reading this article and following the steps outlined in the article. If you have any questions, please ask them in the comments section below. You should also check out their documentation, by clicking on this &lt;a href="https://authjs.dev/getting-started/installation?framework=Next.js" rel="noopener noreferrer"&gt;link&lt;/a&gt;.      &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>frontend</category>
      <category>programming</category>
    </item>
    <item>
      <title>REACTJS VS VUEJS</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Thu, 27 Jun 2024 20:46:17 +0000</pubDate>
      <link>https://dev.to/kpeale/reactjs-vs-vuejs-41cp</link>
      <guid>https://dev.to/kpeale/reactjs-vs-vuejs-41cp</guid>
      <description>&lt;p&gt;After I started learning Javascript, React framework was the next thing I knew and I have not looked back since. React framework to me was everything, I literally loved everything about it until I started using VUE JS. In this article, I am going to be talking about the differences between React and Vue JS. Although, there is something I want you to have in mind that there is no better framework, yes you heard me right.   These two frameworks were built to solve problems so comparing them will defeat the purpose.&lt;/p&gt;

&lt;p&gt;The first major difference between React JS and VUE JS is that React JS is a javascript Open Source library and was developed by Facebook. At the same time, VUE JS is a javascript framework and was developed by Evan You. &lt;/p&gt;

&lt;p&gt;Before I continue talking about the differences between React JS and VUE JS. I just want to let you know I currently started an internship under HOTELS.NG and it is commonly known as HNG. I am excited and curious  for all the cool projects I will build in the next couple of weeks, please wish me luck in the comment section. If you want to learn more about this internship, click on any of the links below: &lt;br&gt;
&lt;a href="https://hng.tech/internship"&gt;HNG internship&lt;/a&gt; and &lt;a href="https://hng.tech/hire"&gt;HNG Hire&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Differences between REACT JS AND VUE JS
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Performance
&lt;/h2&gt;

&lt;p&gt;Performance between VUE and React websites are quite minimal this because they both  use virtual DOM. However, it is important to note that Vue and React carry out the same functionality within almost the same timeframe, although there is a few milliseconds difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Flexibility:
&lt;/h2&gt;

&lt;p&gt;React has more flexibility than VUE JS. In  terms that it offers the basic functionality and allows developers to be able to use other plugins or libraries if they want more features to handle routing, server-side rendering, mobile app development etc. In the case of Vue, unlike React it gives more tool sets without the need to use additional plugins to libraries. &lt;/p&gt;

&lt;h2&gt;
  
  
  3. Scalability:
&lt;/h2&gt;

&lt;p&gt;React has an upper hand due to its scalability and lightweight nature this can be pointed back to the use of JavaScript (JSX) exclusively and allows for the reuse of existing components.This does not mean VUE JS is not capable of scaling, it is just that it is typically utilized for smaller applications. Because of its flexible architecture, it often necessitates the use of external Vue.js libraries to address certain framework limitations&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Mobile Development:
&lt;/h2&gt;

&lt;p&gt;For mobile development, React offers React Native to build apps for Android and IOS. While VUE JS offers Native Script to build apps for Android and IOS. Applications developed by NativeScripts and React Native can literally do the same thing. The only difference is that the applications built with NativeScripts works faster,better and with little load time. &lt;/p&gt;

&lt;h2&gt;
  
  
  5. Community and Popularity:
&lt;/h2&gt;

&lt;p&gt;It is quite obvious that React has more community support and popularity. I feel like React is the most insulted Javascript library yet it is always the top in the charts.Because of React community support, it has made the library very popular. Although, I feel VUE JS community is gradually growing and in the next 3-5 years there will be a huge difference in the chart.  &lt;/p&gt;

&lt;h2&gt;
  
  
  What Should You Choose Between Vue JS vs React?
&lt;/h2&gt;

&lt;p&gt;In conclusion, both React and Vue are excellent tools for building modern web applications. Although, React and Vue for more effectiveness should be used based on the project requirements factoring the size of the project and the useage, team's expertise, and personal preferences. In simple terms,if you need to work on a smaller project without needing multiple plugins and library then use &lt;strong&gt;VUE JS&lt;/strong&gt;. Meanwhile,if you are working on a large app with higher functionality and will need  to make use of thousands of tools and libraries then use &lt;strong&gt;REACT JS&lt;/strong&gt;. If you have any questions or comment, please drop them in the comment section. I will be reading the comments, thank you! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>womenintech</category>
      <category>frontend</category>
    </item>
    <item>
      <title>UseReducer React Hook Well Explained</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Sun, 10 Mar 2024 19:19:24 +0000</pubDate>
      <link>https://dev.to/kpeale/usereducer-react-hook-well-explained-3lbh</link>
      <guid>https://dev.to/kpeale/usereducer-react-hook-well-explained-3lbh</guid>
      <description>&lt;p&gt;Learning React can be a struggle, I can relate, and everyone who will eventually read this article can too but I aim to simplify those hard components in React. One thing that is very unique to React is dealing with states to update the User Interface and handle states the useState hook is used. The useState hook is very easy to learn it can be learned in under 2-3 minutes max but as you begin to work on more complex websites you begin to see the limitations of the useState react hook. This is just like how small spoons or cups are used for babies but when a child gets older he/she realizes how limiting those cups or spoons are and reaches for a bigger spoon. I hope this analogy hits home 😅😂😂.&lt;/p&gt;

&lt;h2&gt;
  
  
  UseReducer() 101: What is this hook about?
&lt;/h2&gt;

&lt;p&gt;The useReducer() hook is a React hook that is used to handle complex state management. And yes, this useReducer is just like the useState for state management but with a few differences which we will talk about in this article. One important thing to note about the useReducer hook is that you can keep track of multiple pieces of state with a more complex data structure, such as an array or an object. After reading this article, you will not only understand useReducer but also know when to use it properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The UseReducer Syntax
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;const [state, dispatch] = useReducer(reducer, initialState);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is the syntax for the useReducer hook which is quite similar to the useState syntax below;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const [value, setValue] = useState(0)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In both syntax, we get the state object and a function to manipulate that state but the useState accepts one argument and useReducer accepts two - to three arguments, this is one of the differences.&lt;/p&gt;

&lt;p&gt;The first argument that the useReducer accepts is the reducer function. This is a function that will take in the state and action object as parameters. Depending on the action object, the reducer function must update the state in an immutable manner, and return the new state.&lt;/p&gt;

&lt;p&gt;The second argument is the initial state. The initial state is the value the state is initialized with which is required and will return an error if not defined.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to start using useReducer hook
&lt;/h2&gt;

&lt;p&gt;To start using the useReducer hook, the first thing you have to do is import the hook from React like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import { useReducer } from 'react';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After importing your useReducer hook, you can go on to use it in your code. Let us look at how we can start using useReducer in our code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a counter with useReducer
&lt;/h2&gt;

&lt;p&gt;We will be building a counter in this article with the useReducer hook then later on, we will see how to go about it with the useState.&lt;/p&gt;

&lt;p&gt;Step 1: Import the useReducer hook from React&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import { useReducer } from 'react';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Let us define what we will be working with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useReducer } from 'react';

const initialState = {
count : 0
};

export default function Demo () {
const [state, dispatch] = useReducer(reducer, initialState);

return (
&amp;lt;div&amp;gt;
 &amp;lt;h1&amp;gt;I am a counter&amp;lt;/h2&amp;gt;
 &amp;lt;button&amp;gt;+&amp;lt;/buuton&amp;gt;
 &amp;lt;p&amp;gt;{count}&amp;lt;/p&amp;gt;
 &amp;lt;button&amp;gt;-&amp;lt;/buuton&amp;gt;
&amp;lt;/div&amp;gt;
)
}

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

&lt;/div&gt;



&lt;p&gt;In the code block above, I have defined a lot of things and we will be working on the functionality next. The first thing we will be doing is writing the reducer function. It is in the reducer function that most of the functionality will be written. The reducer function as I said earlier takes in a copy of the state and action as an argument. Then depending on the type of the action, it is going to make some changes to that copy of the state and return the state, so let us jump back into the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function reducer(state, action) {
switch (action.type) {

default:
      throw new Error('action unknown');
}
}

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

&lt;/div&gt;



&lt;p&gt;In the reducer function, we will use a switch to define new cases. The action.type contains the name of the operation to be performed. This is a string and you can set any value you want. Just make sure it's relevant to the action being performed for better readability. If the type of action in the dispatch does not correspond to any of the actions it will throw an error, so it is an important part of the code. Let us move to writing more functionality for increasing the state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function reducer(state, action) {
switch (action.type) {
case 'increment' : 
return {
...state, count: state.counter + 1;
}
case 'decrement' : 
return {
...state, count: state.counter - 1;
}

default:
      throw new Error('action unknown');
}
}

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

&lt;/div&gt;



&lt;p&gt;After defining the case, you return the state back and write the functionality you want, very easy right. Incase you are wondering how we will get the buttons working, I got you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useReducer } from 'react';

const initialState = {
count : 0
};

function reducer(state, action) {
switch (action.type) {
case 'increment' : 
return {
...state, count: state.counter + 1;
}
case 'decrement' : 
return {
...state, count: state.counter - 1;
}

default:
      throw new Error('action unknown');
}
} 

export default function Demo () {
const [state, dispatch] = useReducer(reducer, initialState);

return (
&amp;lt;div&amp;gt;
 &amp;lt;h1&amp;gt;I am a counter&amp;lt;/h2&amp;gt;
 &amp;lt;button onClick={() =&amp;gt; dispatch({ type: 'increment' })} &amp;gt;+ 
 &amp;lt;/button&amp;gt;
 &amp;lt;p&amp;gt;{count}&amp;lt;/p&amp;gt;
 &amp;lt;button onClick={() =&amp;gt; dispatch({ type: 'decrement' })}  &amp;gt;- 
 &amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
)
}

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

&lt;/div&gt;



&lt;p&gt;The click event handlers of the buttons use the dispatch() function to dispatch the corresponding action object and this is how to use useReducer in your code, simple, right? Let us write the same code using the useState React hook just for comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a counter with useStateBuilding a counter with useState
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from 'react';

export default function Demo () {
const [count, setCount] = useState(0);

function increase () {
setCount(count + 1)
}

function decrease () {
setCount(count - 1)
}

return (
 &amp;lt;div&amp;gt;
  &amp;lt;h1&amp;gt;I am a counter&amp;lt;/h2&amp;gt;
  &amp;lt;button onClick={increase} &amp;gt;+&amp;lt;/button&amp;gt;
  &amp;lt;p&amp;gt;{count}&amp;lt;/p&amp;gt;
  &amp;lt;button onClick={decrease}  &amp;gt;-&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
)
}

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

&lt;/div&gt;



&lt;p&gt;This is how the counter looks when writing it with the useState React Hook. I know it still looks easy but imagine you have like 5 states that depend on each other, you will have to keep writing different states and functions as opposed to the useReducer hook where you can define everything in the reducer function.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to know when to use useState and UseReducer React Hook
&lt;/h2&gt;

&lt;p&gt;PreferuseStateif you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript primitives(string, boolean, number) as a state( eg. our first use case )&lt;/li&gt;
&lt;li&gt;The state being managed is Simple business logic&lt;/li&gt;
&lt;li&gt;Different properties that don’t change in any correlated way and can be managed by multiple useState hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prefer useReducerif you have:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript objects or arrays as a state ( eg. our second use case )&lt;/li&gt;
&lt;li&gt;Different properties tied together that should be managed in one state object&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I hope this article was quite explanatory for you and helped you understand the basics of useReducer hook. I want you to challenge yourself and try to implement the useReducer hook in our next React project rather than relying on useState it alone. I would like to hear from you in the comment section.&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>useContext React Hook</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Sun, 10 Mar 2024 05:49:51 +0000</pubDate>
      <link>https://dev.to/kpeale/usecontext-react-hook-4md</link>
      <guid>https://dev.to/kpeale/usecontext-react-hook-4md</guid>
      <description>&lt;p&gt;Props is a special keyword in React that simply stands for properties and is used for passing data from one component to another, one thing to note is that data with props are passed in one direction, from parents to child. The use of props in React is very cool but at the same time, it can quickly sour especially when you have to pass data through deeply nested components that is what we call prop drilling. Let me create a scenario, imagine you work in a company that has a four storey building with no functional elevator and you have to use the staircase every time you want to see a friend who works on the ground floor since you work on the fourth floor, that is crazy right? That is what prop drilling is like. To make things easier and more efficient the useContext React hook was developed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;ContextAPI in React is an alternative way of passing data through the component tree without the need to prop drill. ContextAPI is particularly useful when dealing with data that is considered “global” or needs to be accessible by many components within the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use the useContext React Hook
&lt;/h2&gt;

&lt;p&gt;There are three steps to remember when you want to use the useContext React Hook and they are: creating the context, providing the context, and consuming the context.Let us quickly move to the first step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Creating the Context
&lt;/h2&gt;

&lt;p&gt;The first thing is to import createContext from React like in the code snippet below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {createContext } from "react";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After importing the createContext from React the next thing we will do is to define.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {createContext } from "react";

const Context = createContext();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is important to note that the createContext function accepts only one optional argument. After importing and defining the createContext, we will move to the next step. One thing to note is that this userContext is now divided into three parts: &lt;br&gt;
Provider: The provider gives all child components access to the value: One thing to note is that the provider can be put anywhere in the component tree but it is common to place it at the top.&lt;/p&gt;

&lt;p&gt;Consumer: These are all the components that read the value passed into the provider in other words consumers are components that read the context.&lt;/p&gt;

&lt;p&gt;Value: This is the data we want to make available, usually, it contains one or more states and functions. It will make more sense in the next step, just stay with me.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Providing the Context
&lt;/h2&gt;

&lt;p&gt;This next step is quite straightforward like the first step. The first thing you want to do is identify the parent component among your component tree. In some component trees, it can be the App.js component while in some it can be the Main.js. After identifying the parent component, we will wrap the parent component markup with the Context provider to have all child components subscribe to Context changes. Let us jump straight into the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {createContext } from "react";

const Context = createContext();

function App() {
  const [name, setName] = useState("Jesse Hall");
  return (
    &amp;lt;Context.Provider value={{name}}&amp;gt;
      &amp;lt;Childcomponent1 /&amp;gt;
      &amp;lt;Childcomponent2 /&amp;gt;
      &amp;lt;Childcomponent3 /&amp;gt;
    &amp;lt;/Context.Provider&amp;gt;
  );
}

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

&lt;/div&gt;



&lt;p&gt;From the code above, we can see that after passing the values we want through the provider all the child components wrapped will be able to access these values through the useContext Hook. Another thing to note is that the value can be more than one and can be anything ranging from states, functions, objects, or even arrays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Consuming the Context
&lt;/h2&gt;

&lt;p&gt;To use the Context in a child component, we need to consume the context and we can consume the context using the useContext Hook. The useContext hooks accept a context object (the value when we imported createContext from React).It is also important to note that a component calling the useContext hook will always re-render whenever the context value changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState, createContext, useContext } from "react";
const Context = createContext();

function App() {
  const [name, setName] = useState("Jesse Hall");
  const [age, setAge] = useState(44);

  function ageHandler () {
  setAge(age + 1) 
  }
  return (
    &amp;lt;Context.Provider value={{value1:name,value2:age, 
     value3:ageHandler}}&amp;gt;
      &amp;lt;Childcomponent1 /&amp;gt;
      &amp;lt;Childcomponent2 /&amp;gt;
      &amp;lt;Childcomponent3 /&amp;gt;
    &amp;lt;/Context.Provider&amp;gt;
  );
}

function Childcomponent1 () {
const {value1, value2, value3} = useContext(Context)
return (
 &amp;lt;section&amp;gt;
  &amp;lt;h1&amp;gt;My name is {value1}&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;I am {value2} years old&amp;lt;/p&amp;gt;
 &amp;lt;/section&amp;gt;
)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code snippet, I added more things to the code like a new state and a function into the provider. In one of the child components, I called the useContext react hook and consumed the context we had earlier. To make my work easier and prevent bugs, I destructured my values and used them directly. However, it is important to note that most developers use custom hooks whenever they work with the useContext hook and I subscribe to it. &lt;/p&gt;

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

&lt;p&gt;The useContext Hook is a fantastic hook to use, which might not be beginner-friendly. However, if you follow the three steps I outlined in my article then you will not face any challenges.One important thing to note is that useContext is best used when you need to share data across multiple components at different levels of the component tree, especially when passing props becomes cumbersome and difficult to manage. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>PostgreSQL Interview Questions</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Thu, 08 Apr 2021 20:22:02 +0000</pubDate>
      <link>https://dev.to/arctype/postgresql-interview-questions-1cjo</link>
      <guid>https://dev.to/arctype/postgresql-interview-questions-1cjo</guid>
      <description>&lt;p&gt;If you’re interviewing for a position in which you’ll have to work with a PostgreSQL database; there are some fundamental things that you should know. In this article, I have prepared some important PostgreSQL interview questions and answers which will help you succeed in your interview.&lt;/p&gt;

&lt;p&gt;See if you can read through the list below and answer every question. If you can - you are going to crush this interview! If not, read on below for the answers and explanations.&lt;/p&gt;

&lt;h4&gt;
  
  
  Question List
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;What are the languages which PostgreSQL supports?&lt;/li&gt;
&lt;li&gt;What are the main features of PostgreSQL?&lt;/li&gt;
&lt;li&gt;What is a non-clustered index?&lt;/li&gt;
&lt;li&gt;How can you store binary data?&lt;/li&gt;
&lt;li&gt;Explain what a Function is&lt;/li&gt;
&lt;li&gt;How can we change the column data type in SQL?&lt;/li&gt;
&lt;li&gt;Explain Write-Ahead Logging&lt;/li&gt;
&lt;li&gt;What is multi-version concurrency control?&lt;/li&gt;
&lt;li&gt;What are tokens?&lt;/li&gt;
&lt;li&gt;Explain how to Enable Debugging&lt;/li&gt;
&lt;li&gt;What is the purpose of Array_To_String in PostgreSQL?&lt;/li&gt;
&lt;li&gt;What is a CTID?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What are the languages which PostgreSQL supports?
&lt;/h2&gt;

&lt;p&gt;It supports a language of its own, PL/pgSQL and it supports internal procedural languages - Python, Perl, and Tcl.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the main features of PostgreSQL?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MVCC (Multi Version Concurrency Control), and procedural languages&lt;/li&gt;
&lt;li&gt;Flexible API and data validation&lt;/li&gt;
&lt;li&gt;Support and extensibility for SQL
We covered more of the key features of &lt;a href="https://arctype.com/blog/mysqlvspostgres/"&gt;Postgres compared to MySQL in a previous blog post&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is a non-clustered index?
&lt;/h2&gt;

&lt;p&gt;A non-clustered index is a type of index where the order of the rows does not match the order of the actual data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can you store binary data in PostgreSQL?
&lt;/h2&gt;

&lt;p&gt;PostgreSQL provides two distinct methods for storing binary data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first is by storing the binary data in a table using the data type &lt;code&gt;bytea&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The second method is by using the Large Object feature, which stores the binary data in a separate table in a special format and refers to that table by storing a value of type &lt;code&gt;oid&lt;/code&gt; in your table. 
The &lt;code&gt;bytea&lt;/code&gt; data type is not well suited for storing very large amounts of data, while the Large Object method for storing binary data is better suited for storing very large values. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Explain functions in PostgreSQL
&lt;/h2&gt;

&lt;p&gt;Functions in PostgreSQL are also known as stored procedures. They are used to store commands, declarations, assignments, etc. This makes it easy to perform operations that would generally take thousands of lines of code to write. &lt;br&gt;
PostgreSQL functions can be created in several languages such as SQL, PL/pgSQL, C, Python, etc.&lt;/p&gt;
&lt;h2&gt;
  
  
  How can we change the column data type in SQL?
&lt;/h2&gt;

&lt;p&gt;Columns data-type in PostgreSQL are changed using the &lt;code&gt;ALTER TABLE&lt;/code&gt; statement combined with the &lt;code&gt;ALTER COLUMN&lt;/code&gt; statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="k"&gt;column_name&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;DATA&lt;/span&gt; &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;new_data_type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explain Write-Ahead Logging
&lt;/h2&gt;

&lt;p&gt;This feature provides a log of a database in case of a database crash by logging changes before any changes or updates are made to the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is multi-version concurrency control in PostgreSQL?
&lt;/h2&gt;

&lt;p&gt;It is a method commonly used to provide concurrent access to the database, and in programming languages to implement transactional memory. It avoids unnecessary locking of the database - removing the time lag for the user to log into the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are tokens?
&lt;/h2&gt;

&lt;p&gt;Answer: Tokens are the building blocks of any line of source code. A token can be a keyword, an identifier, a quoted identifier, a constant, etc. Tokens which are keywords consist of predefined SQL commands, while identifiers are used to represent variable names like columns and tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explain how to enable debugging in PostgreSQL
&lt;/h2&gt;

&lt;p&gt;This command is used for enabling the compilation of all libraries and applications. This process slows down the system and at the same time increases the binary file size. It can be turned on by &lt;a href="https://gist.github.com/eneldoserrata/6633963a1dbb63001b2e3c4a6a5e9bba"&gt;installing the pldbgapi extension&lt;/a&gt; and running the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE EXTENSION pldbgapi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What is the purpose of &lt;code&gt;Array_To_String&lt;/code&gt; in PostgreSQL?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Array_To_String&lt;/code&gt; function concatenates array elements to a string using a &lt;code&gt;provide&lt;/code&gt; delimiter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a CTID?
&lt;/h2&gt;

&lt;p&gt;This is a field that exists in every PostgreSQL table. It is a hidden and unique record for each table in PostgreSQL that easily denotes the location of a tuple and is known to identify certain physical rows according to their block and offset positions within a particular table. A logical row’s ctid changes when it is updated, so the ctid cannot be used as a long term identifier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of studying Database Systems
&lt;/h3&gt;

&lt;p&gt;Most interviews will not focus on specific technologies too much. But if you list familiarity with Postgres you can expect to get some questions about how Postgres works and its features. Asking and &lt;a href="https://discord.gg/FMZejv5eF3"&gt;answering questions on Discord servers&lt;/a&gt; dedicated to SQL and data is a good idea too. Of course the best way to learn Postgres is to use it and other databases in practice to build projects and apps.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>career</category>
      <category>beginners</category>
      <category>database</category>
    </item>
    <item>
      <title>CSS GRADIENTS 1</title>
      <dc:creator>Kpeale Legbara</dc:creator>
      <pubDate>Sat, 19 Sep 2020 06:09:13 +0000</pubDate>
      <link>https://dev.to/kpeale/css-gradients-1-495</link>
      <guid>https://dev.to/kpeale/css-gradients-1-495</guid>
      <description>&lt;p&gt;Hello Everyone, welcome to my first article on dev.to and I am writing on CSS GRADIENTS.&lt;/p&gt;

&lt;p&gt;What are GRADIENTS?&lt;br&gt;
 Gradients are one color that fades into another. This color can fade into another in different directions, example: top, bottom, left, right, diagonal e.t.c. This effect can be accomplished by using CSS GRADIENTS.&lt;br&gt;
 According to W3 schools, CSS defines two types of gradients:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linear Gradients&lt;/li&gt;
&lt;li&gt;Radical Gradients&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Linear Gradients (goes down/up/left/right/diagonally)&lt;br&gt;
The easiest way to understand this concept is that the Linear Gradient function transitions two or more colors along a straight line hence the name linear. &lt;br&gt;
In creating linear gradients, at least two colors should be specified for it to work and the selector is background-image.&lt;br&gt;
Syntax: &lt;br&gt;
background-image: linear-gradient(direction, color1, color2, ...);&lt;/p&gt;

&lt;p&gt;I will use some examples for better understanding:&lt;/p&gt;

&lt;p&gt;Example 1&lt;br&gt;
Direction - Top to Bottom (this is default).&lt;br&gt;
I will start by creating a div in my index.html and put a content inside because the &lt;/p&gt; tag does not work unless it has a content. &lt;br&gt;
Index.html:

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frtjhwets7dqtzsg6vwit.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frtjhwets7dqtzsg6vwit.PNG" alt="Alt Text" width="723" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in my CSS,&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu31ai3ycic00otrcq0bn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu31ai3ycic00otrcq0bn.PNG" alt="Alt Text" width="501" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbtruiv99igx0wsyxh12l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbtruiv99igx0wsyxh12l.jpg" alt="Alt Text" width="763" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EXAMPLE 2&lt;br&gt;
Direction - Left to Right&lt;/p&gt;

&lt;p&gt;In the CSS file,&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvobadywnwe7625e1o08o.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvobadywnwe7625e1o08o.PNG" alt="Alt Text" width="581" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6eg6w2n2i4gaplj07rry.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6eg6w2n2i4gaplj07rry.PNG" alt="Alt Text" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EXAMPLE 3&lt;br&gt;
Direction - Diagonal:&lt;br&gt;
You can make a gradient diagonally by specifying both the horizontal and vertical starting positions.&lt;/p&gt;

&lt;p&gt;In CSS file,&lt;br&gt;
 &lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0nmpe38n6t04fn7qiw5w.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0nmpe38n6t04fn7qiw5w.PNG" alt="Alt Text" width="574" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi61mz8z7xjmisna0pat2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fi61mz8z7xjmisna0pat2.PNG" alt="Alt Text" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where I will stop for linear gradients. I will like to know your comment about the article and if it was helpful. My next post will be on radical gradients.&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>womenintech</category>
    </item>
  </channel>
</rss>
