<?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: Emmanuel Kariithi</title>
    <description>The latest articles on DEV Community by Emmanuel Kariithi (@immah).</description>
    <link>https://dev.to/immah</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%2F51322%2Fec0b0f15-98f9-420d-af9d-96d68f611f3d.jpg</url>
      <title>DEV Community: Emmanuel Kariithi</title>
      <link>https://dev.to/immah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/immah"/>
    <language>en</language>
    <item>
      <title>Design and Implement Role-Based Access with AWS IAM</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Wed, 20 Aug 2025 11:11:29 +0000</pubDate>
      <link>https://dev.to/immah/design-and-implement-role-based-access-with-aws-iam-3bbf</link>
      <guid>https://dev.to/immah/design-and-implement-role-based-access-with-aws-iam-3bbf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first started exploring AWS, I quickly realized that reading docs and watching tutorials wasn't enough for me. I wanted to &lt;strong&gt;get my hands dirty&lt;/strong&gt; with real projects. The problem was that most resources either covered concepts without context or jumped straight into production level setups without explaining the "why."&lt;/p&gt;

&lt;p&gt;After some searching, I came across a course called &lt;a href="https://www.udemy.com/course/aws-mastery-hands-on-cloud-projects-for-engineers/?couponCode=MT180825G1" rel="noopener noreferrer"&gt;AWS Mastery: 26 AWS Cloud Projects for Engineers &amp;amp; Architect&lt;/a&gt; on Udemy by &lt;a href="https://www.udemy.com/course/aws-mastery-hands-on-cloud-projects-for-engineers/?couponCode=MT180825G1#instructor-1" rel="noopener noreferrer"&gt;Pravin Mishra&lt;/a&gt;. What I love about this course is that it isn't just theory, it focuses on &lt;strong&gt;practical, project-based learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I've decided to take on a personal challenge of working through each project &lt;strong&gt;without looking at the solutions&lt;/strong&gt; while documenting my process here in this little world of mine. This way, I can build confidence while also creating a guide that other beginners can follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article is the first in that journey&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Project Overview

&lt;ul&gt;
&lt;li&gt;What is AWS IAM?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Step 1: Create the Admins Group&lt;/li&gt;

&lt;li&gt;Step 2: Create the Developers Group&lt;/li&gt;

&lt;li&gt;Step 3: Create the Test Group&lt;/li&gt;

&lt;li&gt;Step 4: Add Users to Groups&lt;/li&gt;

&lt;li&gt;Step 5: Enable Multi-Factor Authentication (MFA)&lt;/li&gt;

&lt;li&gt;Step 6: Set Up Regular Access Reviews&lt;/li&gt;

&lt;li&gt;Wrap Up&lt;/li&gt;

&lt;li&gt;

Key Takeaways &lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;In this task, I'm stepping into the role of a &lt;strong&gt;Cloud Security Administrator&lt;/strong&gt; for a fictional company called &lt;strong&gt;ComiCloud&lt;/strong&gt;, a comics delivery service / store. The goal is to set up a structured IAM environment that's both &lt;strong&gt;secure&lt;/strong&gt; and &lt;strong&gt;easy to manage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The main tasks are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create IAM groups (Admins, Developers, Testers) with appropriate permissions.&lt;/li&gt;
&lt;li&gt;Add users to the right groups (including cross-functional users).&lt;/li&gt;
&lt;li&gt;Configure security best practices like MFA.&lt;/li&gt;
&lt;li&gt;Set up a process for regular access reviews.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  So, what is AWS IAM (Identity and Access Management)?
&lt;/h3&gt;

&lt;p&gt;According to the &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html" rel="noopener noreferrer"&gt;official AWS documentation&lt;/a&gt;, AWS IAM is a web service that helps you securely control access to AWS resources. IAM manages the permissions that determine which AWS resources users can access.&lt;/p&gt;

&lt;p&gt;Since it's risky to use the AWS &lt;strong&gt;root account&lt;/strong&gt; for daily operations and most organizations have multiple users who need different levels of access, AWS Identity and Access Management (IAM) is essential for securely managing &lt;strong&gt;who can access what&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Imagine a small startup (like ComiCloud) building a web application on AWS. The admin team needs full control to set up services, developers need access to services like EC2 and S3 (Don't worry, we'll cover these in future projects) to run and store code, while testers only need read-only permissions to validate features. With IAM, you can create groups for admins, developers and testers and assign the right permissions to each, so everyone has just enough access to do their job and nothing more. This is known as the principle of &lt;strong&gt;least privilige&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Phew! That felt like a long introduction. Let's get our hands dirty, shall we?&lt;/p&gt;

&lt;p&gt;Oh, before I forget, you'll need to create an &lt;a href="https://aws.amazon.com/free/?trk=dbc7f76e-fb1e-4d73-9607-b3dc7b4a7541&amp;amp;sc_channel=ps&amp;amp;ef_id={gclid}:G:s&amp;amp;s_kwcid=AL!4422!3!645125273267!e!!g!!aws%20account!19574556890!145779847112&amp;amp;gad_campaignid=19574556890" rel="noopener noreferrer"&gt;AWS account&lt;/a&gt; first. AWS usually gives new accounts free credits (around $100), which is more than enough for experimenting (Used to be 12 months free for a number of services).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create the Admins Group
&lt;/h3&gt;

&lt;p&gt;The first step is to create an &lt;strong&gt;Admins&lt;/strong&gt; group and give it full administrator access.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to the AWS Management Console and open &lt;strong&gt;IAM&lt;/strong&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%2Fd8gdhatxtbuk734hk9h8.png" alt="AWS Management Console IAM" width="800" height="463"&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;User Groups&lt;/strong&gt; then &lt;strong&gt;Create group&lt;/strong&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%2Fetdhzxv89dssy8504c6k.png" alt="User Groups" width="800" height="351"&gt;
&lt;/li&gt;
&lt;li&gt;Enter &lt;strong&gt;Admins&lt;/strong&gt; as the group name.&lt;/li&gt;
&lt;li&gt;Attach the &lt;strong&gt;AdministratorAccess&lt;/strong&gt; policy you can search it in the search bar if it doesn't appear on top.
&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%2Fxve924e565dbu8zz3h2z.png" alt="attach policy" width="800" height="352"&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create group&lt;/strong&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%2F6p88epvy0mxqpkmgvq21.png" alt="Create group" width="800" height="351"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now we have a dedicated Admins group with full privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create the Developers Group
&lt;/h3&gt;

&lt;p&gt;Next, set up the &lt;strong&gt;Developers&lt;/strong&gt; group with policies granting access to EC2, S3 and RDS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AmazonEC2FullAccess&lt;/li&gt;
&lt;li&gt;AmazonS3FullAccess&lt;/li&gt;
&lt;li&gt;AmazonRDSFullAccess&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process is identical to creating the Admins group, just enter &lt;strong&gt;Developers&lt;/strong&gt; as the name and attach the three policies.&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%2F3767m31ttlt8scncrrwl.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%2F3767m31ttlt8scncrrwl.png" alt="AmazonEC2FullAccess" width="800" height="350"&gt;&lt;/a&gt;&lt;br&gt;
Our Developers group is now ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create the Test Group
&lt;/h3&gt;

&lt;p&gt;For the Testers, create a group named &lt;strong&gt;Test&lt;/strong&gt; and attach &lt;strong&gt;ReadOnlyAccess&lt;/strong&gt; policy.&lt;/p&gt;

&lt;p&gt;Repeat the same steps as before (create group → name → attach policy → create).&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%2Fbga8sc6hlgm0jsgvidhz.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%2Fbga8sc6hlgm0jsgvidhz.png" alt="ReadOnlyAccess" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should now see all three groups (Admins, Developers and Test) in your console.&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%2Fmjc5du21ku5wkf62h6l5.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%2Fmjc5du21ku5wkf62h6l5.png" alt="All three groups" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Add Users to Groups
&lt;/h3&gt;

&lt;p&gt;With groups ready, it's time to create and add users.&lt;br&gt;
Our fictional organization has the following users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admins:&lt;/strong&gt; &lt;em&gt;John_Admin&lt;/em&gt;, &lt;em&gt;Lisa_Admin&lt;/em&gt;, &lt;em&gt;Raj_Admin&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers:&lt;/strong&gt; &lt;em&gt;Alice_Dev&lt;/em&gt;, &lt;em&gt;Mark_Dev&lt;/em&gt;, &lt;em&gt;Priya_Dev&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testers:&lt;/strong&gt; &lt;em&gt;Sam_Test&lt;/em&gt;, &lt;em&gt;Nina_Test&lt;/em&gt;, &lt;em&gt;Carlos_Test&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-functional:&lt;/strong&gt; &lt;em&gt;Alex_DevOps&lt;/em&gt; (belongs to &lt;strong&gt;both&lt;/strong&gt; Developers and Test groups).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will show you how to create a user and you will create the others since the steps are similar for each user.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the IAM dashboard, select Users
&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%2Fj41dqcpeqm1333pylu6o.png" alt="create users" width="800" height="351"&gt;
&lt;/li&gt;
&lt;li&gt;Select Create user&lt;/li&gt;
&lt;li&gt;Enter &lt;strong&gt;John_Admin&lt;/strong&gt; as the username and check the 'Provide user access to the AWS Management Console' checkbox.
&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%2Fsenjxzrpj2nd25kwlhpa.png" alt="John_Admin" width="800" height="353"&gt;
&lt;/li&gt;
&lt;li&gt;Select 'I want to create an IAM user' and you can choose whether to autogenerate a password or use a custom password and click Next.&lt;/li&gt;
&lt;li&gt;Select Add user to group and select the Admins group then click Next.
&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%2Ff2ndl0rp5lc10zfdcn46.png" alt="Add user to group" width="800" height="353"&gt;
&lt;/li&gt;
&lt;li&gt;Create User and the next page will prompt you to download the user's login credentials. Ensure that you download the .csv file and store it safely.
&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%2Fsv5s9vmiy1jp1590i2sv.png" alt="Download .csv" width="800" height="353"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat the same process for the other user and remember to add each user in their respective group. For &lt;strong&gt;Alex_DevOps&lt;/strong&gt; select both &lt;em&gt;Developers&lt;/em&gt; and &lt;em&gt;Test&lt;/em&gt;.&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%2Fdro51uh72prv2gemb4pl.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%2Fdro51uh72prv2gemb4pl.png" alt="Alex_DevOps" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, your IAM environment should have all groups and users properly configured.&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%2Ffkd6l5xay8bryy0pw1yk.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%2Ffkd6l5xay8bryy0pw1yk.png" alt="All users" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Enable Multi-Factor Authentication (MFA)
&lt;/h3&gt;

&lt;p&gt;Security best practices recommend enabling &lt;strong&gt;MFA&lt;/strong&gt; for all users and it's &lt;strong&gt;mandatory&lt;/strong&gt; for &lt;strong&gt;Admins&lt;/strong&gt;. MFA adds an extra layer of security by requiring not just a password, but also a temporary code from an authenticator app or device.&lt;/p&gt;

&lt;p&gt;Here's how to enable MFA for a user (we'll start with &lt;strong&gt;John_Admin&lt;/strong&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM&lt;/strong&gt; → &lt;strong&gt;Users&lt;/strong&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%2Ffkd6l5xay8bryy0pw1yk.png" alt="All users" width="800" height="353"&gt;
&lt;/li&gt;
&lt;li&gt;Select the user &lt;strong&gt;John_Admin&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Security credentials&lt;/strong&gt; tab
&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%2Fdhojg5o9f5et3xdfh379.png" alt="security tab" width="800" height="355"&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Multi-factor authentication (MFA)&lt;/strong&gt;, click &lt;strong&gt;Assign MFA device&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter a name for the MFA device and choose &lt;strong&gt;Authenticator app&lt;/strong&gt; Click &lt;strong&gt;Next&lt;/strong&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%2Fn792s7pj5amsf1gw8jk1.png" alt="Device Name" width="800" height="355"&gt;
&lt;/li&gt;
&lt;li&gt;Follow the instructions on that page, enter the two codes and click &lt;strong&gt;Add MFA&lt;/strong&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%2Flczi2twckwj5g2rz75m9.png" alt="Add MFA" width="800" height="363"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MFA is now enabled for &lt;strong&gt;John_Admin&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Repeat the same process for the other two Admins (&lt;strong&gt;Lisa_Admin&lt;/strong&gt; and &lt;strong&gt;Raj_Admin&lt;/strong&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Set Up Regular Access Reviews
&lt;/h3&gt;

&lt;p&gt;Creating groups and assigning users is just the beginning. To keep your AWS environment secure, you need to perform &lt;strong&gt;regular access reviews&lt;/strong&gt; most probably once per quarter.  &lt;/p&gt;

&lt;p&gt;Here’s what to check during a review:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Group Memberships&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM → Groups → Users tab&lt;/strong&gt; and verify each user is still in the right group.
&lt;/li&gt;
&lt;li&gt;Remove users who no longer need access.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Policies&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For each group, open the &lt;strong&gt;Permissions&lt;/strong&gt; tab.
&lt;/li&gt;
&lt;li&gt;Confirm only the necessary policies are attached.
&lt;/li&gt;
&lt;li&gt;Remove or adjust any that seem too broad.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MFA Status&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;IAM → Users&lt;/strong&gt;, check the &lt;strong&gt;MFA column&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Make sure all Admins have MFA enabled.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Credential Rotation&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remind users to rotate passwords and access keys every 90 days.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Document Changes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep a simple log of any modifications (e.g., add/remove user, updated policy).
&lt;/li&gt;
&lt;li&gt;You could store this securely in an internal wiki or even an encrypted S3 bucket.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process helps maintain the principle of &lt;strong&gt;least privilege&lt;/strong&gt; and ensures your IAM setup stays secure over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Set Up Regular Access Reviews
&lt;/h3&gt;

&lt;p&gt;Creating groups and assigning users is just the beginning. To keep your AWS environment secure, you need to perform &lt;strong&gt;regular access reviews&lt;/strong&gt; most probably once per quarter.  &lt;/p&gt;

&lt;p&gt;Here’s what to check during a review:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Group Memberships&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM → Groups → Users tab&lt;/strong&gt; and verify each user is still in the right group.
&lt;/li&gt;
&lt;li&gt;Remove users who no longer need access.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Policies&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For each group, open the &lt;strong&gt;Permissions&lt;/strong&gt; tab.
&lt;/li&gt;
&lt;li&gt;Confirm only the necessary policies are attached.
&lt;/li&gt;
&lt;li&gt;Remove or adjust any that seem too broad.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MFA Status&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;IAM → Users&lt;/strong&gt;, check the &lt;strong&gt;MFA column&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Make sure all Admins have MFA enabled.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Credential Rotation&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remind users to rotate passwords and access keys every 90 days.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Document Changes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep a simple log of any modifications (e.g., add/remove user, updated policy).
&lt;/li&gt;
&lt;li&gt;You could store this securely in an internal wiki or even an encrypted S3 bucket.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process helps maintain the principle of &lt;strong&gt;least privilege&lt;/strong&gt; and ensures your IAM setup stays secure over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrap Up
&lt;/h3&gt;

&lt;p&gt;That’s a wrap! We've just built a complete &lt;strong&gt;role-based access management system&lt;/strong&gt; in AWS using IAM. Yaaay!&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never use the root account&lt;/strong&gt; for daily operations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM groups&lt;/strong&gt; make it easy to manage permissions at scale.
&lt;/li&gt;
&lt;li&gt;Always follow the principle of &lt;strong&gt;least privilege&lt;/strong&gt; (users get only the access they need).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA&lt;/strong&gt; is non-negotiable for Admins.
&lt;/li&gt;
&lt;li&gt;Regular &lt;strong&gt;access reviews&lt;/strong&gt; help keep your environment secure over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is just the first step in my AWS project journey. Next up, I’ll be tackling more hands-on projects, from setting up EC2 and S3, to building entire cloud-native applications. &lt;/p&gt;

&lt;p&gt;If you’re learning AWS too, I encourage you to try this out in your own account. Don’t worry if you get stuck, that’s part of the process. The important thing is to keep experimenting and building.  &lt;/p&gt;

&lt;p&gt;Stay tuned for the next article where we’ll dive into more AWS services and put them into action.  &lt;/p&gt;

&lt;p&gt;Until then, happy cloud building! Turus!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudsecurity</category>
      <category>cloudcomputing</category>
      <category>awsbeginners</category>
    </item>
    <item>
      <title>Building a Password Strength Checker in Python</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Mon, 14 Oct 2024 08:19:54 +0000</pubDate>
      <link>https://dev.to/immah/building-a-password-strength-checker-in-python-47om</link>
      <guid>https://dev.to/immah/building-a-password-strength-checker-in-python-47om</guid>
      <description>&lt;p&gt;Hello again, and welcome to today's tutorial. Today, we are going to build a simple password strength checker using Python. We’ll explain how the code works step-by-step and give tips on how to improve your passwords.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Password Strength Important?
&lt;/h2&gt;

&lt;p&gt;A weak password makes it easier for hackers to guess or crack using various methods, putting your personal information at risk. A strong password is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long enough (at least 12 characters)&lt;/li&gt;
&lt;li&gt;Uses a mix of letters (both uppercase and lowercase), numbers, and special characters&lt;/li&gt;
&lt;li&gt;Avoids common or predictable words&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s get started by building a tool that assesses the strength of a password based on these rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your Environment
&lt;/h2&gt;

&lt;p&gt;Before we start coding, make sure you have Python installed on your computer.&lt;/p&gt;

&lt;p&gt;Create a new Python file where you will write your code. Also, download this &lt;a href="https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt" rel="noopener noreferrer"&gt;file&lt;/a&gt; that contains the most common passwords (we will look more into that later) and save the file in the same directory as your Python file for this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Import Necessary Libraries
&lt;/h2&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;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;string&lt;/code&gt; module provides useful constants for checking character types like uppercase letters, digits and special characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check for Common Passwords
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_common_password&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="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;common-password.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function checks if the given password is in a list of common passwords.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It opens a file called 'common-password.txt' which we downloaded earlier.&lt;/li&gt;
&lt;li&gt;It reads all the passwords from this file into a list.&lt;/li&gt;
&lt;li&gt;If the input password is in this list, it returns &lt;code&gt;True&lt;/code&gt; (meaning it's a common, and therefore weak, password).&lt;/li&gt;
&lt;li&gt;Otherwise, it returns &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why is this important?&lt;/strong&gt; Many hackers start by trying common passwords, so using one makes your account very vulnerable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assess Paswword Strength
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;password_strength&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="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&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="n"&gt;upper_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isupper&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lower_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;islower&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;special&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;punctuation&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;characters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;upper_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lower_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;special&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;characters&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Okay&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Good&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Strong&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function evaluates the strength of the password based on several criteria.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The password gets points for being longer than 8, 12, 17, and 20 characters.&lt;/li&gt;
&lt;li&gt;It checks for the presence of uppercase letters, lowercase letters, special characters, and digits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How does the scoring works?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It starts with a score of 0.&lt;/li&gt;
&lt;li&gt;It adds 1 point for each length threshold passed.&lt;/li&gt;
&lt;li&gt;It adds 1 point for each type of character used (uppercase, lowercase, special, digit), minus 1.&lt;/li&gt;
&lt;li&gt;Based on the final score, it categorizes the password as "Weak", "Okay", "Good", or "Strong".&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Provide feedback to the User
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;feedback&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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;check_common_password&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="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Password was found in a common list. Score: 0/7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;strength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;password_strength&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="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Password strength: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strength&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/7)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Suggestions to improve your password:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&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="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- Make your password longer (more than 8 characters). &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isupper&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- Include uppercase letters.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;islower&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- Include lowercase letters.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;punctuation&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- Add special characters (e.g., @, #, $).&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&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;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;feedback&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- Add numbers.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function combines the previous two functions to provide comprehensive feedback.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It first checks if the password is common. If so, it immediately returns a warning.&lt;/li&gt;
&lt;li&gt;If the password is not common, it assesses its strength.&lt;/li&gt;
&lt;li&gt;It provides the strength rating and score.&lt;/li&gt;
&lt;li&gt;If the password is weak (score &amp;lt; 4), it gives specific suggestions for improvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Main Program
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter the password: &lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;feedback&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This last part simply asks the user to input a password and then prints the feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Program in Action
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fbry03ywy3fz3a6b3jw1y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbry03ywy3fz3a6b3jw1y.gif" alt="Password strength checker" width="500" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Creating strong passwords is a vital part of maintaining online security, and with this tool, you can easily assess how secure your passwords are. This simple program demonstrates how basic Python programming can be combined with cybersecurity principles to solve a real-world problem.&lt;/p&gt;

&lt;p&gt;Feel free to experiment with the code and add more features.&lt;/p&gt;

&lt;p&gt;Happy coding, and stay secure!&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>security</category>
    </item>
    <item>
      <title>Building a Simple Image Encryption Tool Using Python</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Wed, 09 Oct 2024 13:44:21 +0000</pubDate>
      <link>https://dev.to/immah/building-a-simple-image-encryption-tool-using-python-2439</link>
      <guid>https://dev.to/immah/building-a-simple-image-encryption-tool-using-python-2439</guid>
      <description>&lt;p&gt;Today, we're going to dive into an exciting project that combines image processing with basic encryption techniques. We'll be exploring a Python program that can encrypt and decrypt images using a simple yet effective method. Let's break it down step by step!&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow along, you should have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Basic knowledge of Python programming.&lt;/li&gt;
&lt;li&gt;Python installed on your computer.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pillow library which is a python imaging Library used for handling images. Use &lt;code&gt;pip install pillow&lt;/code&gt; to install.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tkinter which is a python library used for building graphical user interfaces (GUIs). Use &lt;code&gt;pip install tk&lt;/code&gt; to install.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Does This Program Do?
&lt;/h2&gt;

&lt;p&gt;This program creates a graphical user interface (GUI) that allows users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select an image file&lt;/li&gt;
&lt;li&gt;Choose an output location&lt;/li&gt;
&lt;li&gt;Enter a seed key&lt;/li&gt;
&lt;li&gt;Encrypt or decrypt the image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The encryption process shuffles the pixels of the image based on a seed key, making the image unrecognizable. The decryption process reverses this, restoring the original image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Explanation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Importing Required Libraries
&lt;/h3&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filedialog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messagebox&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;os&lt;/code&gt; provides functions to interact with the operating system.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tkinter&lt;/code&gt; provides GUI elements like buttons, labels, and input fields.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PIL&lt;/code&gt; (Pillow) allows us to open, manipulate, and save images.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;random&lt;/code&gt; helps us shuffle the pixels in a deterministic way, using a &lt;strong&gt;seed&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Seeded Random Generator Function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_seeded_random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Returns a seeded random generator.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;get_seeded_random&lt;/code&gt; function returns a random object that can shuffle items the same way every time if given the same seed value.&lt;/p&gt;

&lt;p&gt;This is key to both encrypting and decrypting images consistently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Image Encryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encrypt_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Encrypts the image by manipulating pixel values.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
    &lt;span class="c1"&gt;# Get pixel data as a list
&lt;/span&gt;    &lt;span class="n"&gt;pixels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getdata&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;random_gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_seeded_random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Create a list of pixel indices
&lt;/span&gt;    &lt;span class="n"&gt;indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixels&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="c1"&gt;# Shuffle the indices using the seeded random generator
&lt;/span&gt;    &lt;span class="n"&gt;random_gen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Reorder pixels based on shuffled indices
&lt;/span&gt;    &lt;span class="n"&gt;encrypted_pixels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pixels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Create new image
&lt;/span&gt;    &lt;span class="n"&gt;encrypted_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# Apply encrypted pixels to the new image
&lt;/span&gt;    &lt;span class="n"&gt;encrypted_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Save the encrypted image
&lt;/span&gt;    &lt;span class="n"&gt;encrypted_image&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="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;We load the image and extract its pixel data.&lt;/li&gt;
&lt;li&gt;The pixel order is shuffled using a seeded random generator to ensure the same shuffle order is maintained when decrypting.&lt;/li&gt;
&lt;li&gt;We create a new image with the shuffled pixel values and save it as the encrypted image.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Image Decryption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decrypt_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Decrypts the image by reversing the encryption process.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
    &lt;span class="c1"&gt;# Get encrypted pixel data as a list
&lt;/span&gt;    &lt;span class="n"&gt;encrypted_pixels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getdata&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;random_gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_seeded_random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Create a new list to hold pixel indices in their original order
&lt;/span&gt;    &lt;span class="n"&gt;indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="c1"&gt;# Shuffle the indices again to get the original order
&lt;/span&gt;    &lt;span class="n"&gt;random_gen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Create a new image to hold the decrypted data
&lt;/span&gt;    &lt;span class="n"&gt;decrypted_pixels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Restore original pixels using the shuffled indices
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;original_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shuffled_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;decrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shuffled_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;original_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Save the decrypted image
&lt;/span&gt;    &lt;span class="n"&gt;decrypted_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;decrypted_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decrypted_pixels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;decrypted_image&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="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;decrypt_image&lt;/code&gt; function works by reversing the encryption process. It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loads the encrypted image.&lt;/li&gt;
&lt;li&gt;Uses the same random seed to reshuffle the pixels back into their original order.&lt;/li&gt;
&lt;li&gt;Creates and saves a new image with the decrypted pixels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  File Selection Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;select_input_image&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Opens a file dialog to select an input image.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;input_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filedialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;askopenfilename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Select Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;input_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;select_output_image&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Opens a file dialog to select an output image path.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;output_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filedialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asksaveasfilename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultextension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filetypes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PNG files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.jpg;*.jpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Save Encrypted/Decrypted Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;output_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;select_input_image&lt;/code&gt; function allows the user to select the image they want to encrypt or decrypt by using a file dialog.&lt;/p&gt;

&lt;p&gt;The selected image path is then displayed on the GUI.&lt;/p&gt;

&lt;p&gt;Similarly, the &lt;code&gt;select_output_image&lt;/code&gt; function allows users to choose where to save the output image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encrypt and Decrypt Button Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;input_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;output_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;output_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seed_entry&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;input_image_path&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Please select input and output images.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;encrypt_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image encrypted successfully!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;input_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;output_image_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;output_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seed_entry&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;input_image_path&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Please select input and output images.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;decrypt_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;messagebox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image decrypted successfully!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;encrypt&lt;/code&gt; and &lt;code&gt;decrypt&lt;/code&gt; functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gets the selected file paths and the seed value entered by the user.&lt;/li&gt;
&lt;li&gt;Ensures the user has selected both input and output image paths before proceeding.&lt;/li&gt;
&lt;li&gt;Calls the respective &lt;code&gt;encrypt_image()&lt;/code&gt; or &lt;code&gt;decrypt_image()&lt;/code&gt; functions and displays success messages once done.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating the GUI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image Encryption Tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create and place widgets
&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Select Image to Encrypt/Decrypt:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;input_image_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No image selected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;input_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Browse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;select_input_image&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Output Image Path:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;output_image_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No output path selected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;output_image_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Save As&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;select_output_image&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter Seed Key:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;seed_entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;seed_entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Encrypt Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Decrypt Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Labels, buttons, and text entry fields are placed using &lt;code&gt;pack()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;root.mainloop&lt;/code&gt; function keeps the window open and responsive to user input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Program in Action
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2F6dsa1nwt4mgiiokdjtv0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6dsa1nwt4mgiiokdjtv0.gif" alt="Image encryption" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This program demonstrates how we can manipulate digital images at the pixel level and how we can use pseudo-random number generators for basic encryption tasks.&lt;/p&gt;

&lt;p&gt;Happy coding, and stay secure!&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>pixelmanipulation</category>
      <category>imageencryption</category>
    </item>
    <item>
      <title>Implementing a Caesar Cipher Program in Python</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Mon, 07 Oct 2024 17:59:50 +0000</pubDate>
      <link>https://dev.to/immah/implementing-a-caesar-cipher-program-in-python-1gf3</link>
      <guid>https://dev.to/immah/implementing-a-caesar-cipher-program-in-python-1gf3</guid>
      <description>&lt;p&gt;In the world of cybersecurity, encryption plays a crucial role in protecting sensitive information. One of the simplest and oldest forms of encryption is the Caesar Cipher, named after Julius Caesar, who reportedly used this method to  communicate secretly with his generals, the Caesar Cipher provides an excellent starting point for understanding basic cryptographic concepts.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will walk through how to implement a Caesar Cipher in Python, allowing you to both encrypt and decrypt messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Caesar Cipher?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Caesar Cipher&lt;/strong&gt; is a substitution cipher which works by shifting each letter of a message (plaintext) by a fixed number of positions in the alphabet. This fixed number is known as the "&lt;strong&gt;&lt;em&gt;key&lt;/em&gt;&lt;/strong&gt;" or "&lt;strong&gt;&lt;em&gt;shift&lt;/em&gt;&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose a key (let's say 3).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For each letter in your message:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shift it forward in the alphabet by the number of positions specified by the key.&lt;/li&gt;
&lt;li&gt;If you reach the end of the alphabet, wrap around to the beginning.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Non-alphabetic characters (spaces, punctuation) remain unchanged.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, with a shift of 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;'A' becomes 'D'&lt;/li&gt;
&lt;li&gt;'B' becomes 'E'&lt;/li&gt;
&lt;li&gt;'Y' becomes 'B' (wrapping around)&lt;/li&gt;
&lt;li&gt;'Z' becomes 'C' (wrapping around)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, the message "&lt;strong&gt;HELLO WORLD&lt;/strong&gt;" with a shift of 3 would become "&lt;strong&gt;KHOOR ZRUOG&lt;/strong&gt;".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During encryption, each letter in the message is shifted forward in the alphabet by the key value.&lt;/li&gt;
&lt;li&gt;During decryption, each letter in the encrypted message is shifted backward in the alphabet by the key value.&lt;/li&gt;
&lt;li&gt;The shift wraps around the alphabet, meaning if we go past Z, we loop back to A.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation of Caesar Cipher
&lt;/h2&gt;

&lt;p&gt;Let's dive into the Python code that implements this algorithm. We'll explain each part in detail so that you understand not only how the code works, but also why it works.&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;string&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encrypt_decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ascii_lowercase&lt;/span&gt;
    &lt;span class="n"&gt;num_letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;

    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;num_letters&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isupper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&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="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;new_position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;new_position&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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We import the &lt;code&gt;string&lt;/code&gt; module to help us handle the alphabet. We'll use it to get both the lowercase and uppercase letters easily.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;encrypt_decrypt&lt;/code&gt; function takes care of both encryption and decryption based on the mode selected by the user.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt; is a parameter that represents the message to be encrypted or decrypted.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mode&lt;/code&gt; is a parameter that specifies whether we are encrypting ('&lt;strong&gt;e&lt;/strong&gt;') or decrypting ('&lt;strong&gt;d&lt;/strong&gt;').&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt; is a parameter that represents the number of positions by which to shift each letter in the text.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;letters = string.ascii_lowercase&lt;/code&gt; stores all lowercase letters in the alphabet, which we can use to calculate shifts.&lt;/li&gt;
&lt;li&gt;The modulo operator &lt;code&gt;% 26&lt;/code&gt; ensures that when the new position exceeds 25 (the index for 'Z'), it wraps around to 0 (the index for 'A').&lt;/li&gt;
&lt;li&gt;If the mode is '&lt;strong&gt;d&lt;/strong&gt;' (decryption), we make the key negative (&lt;code&gt;key = -key&lt;/code&gt;), so that letters are shifted in the opposite direction.&lt;/li&gt;
&lt;li&gt;If the character is a letter, we calculate its position in the alphabet using &lt;code&gt;ord(char)&lt;/code&gt; (which gives us the Unicode value of the character).&lt;/li&gt;
&lt;li&gt;Depending on whether it's an uppercase or lowercase letter, we find the new position after applying the shift and convert it back to a character using &lt;code&gt;chr()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the character is not a letter (e.g., spaces or punctuation), we leave it unchanged and add it to the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting a Valid Key
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_valid_key&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Enter a key (1 through 25): &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
            &lt;span class="k"&gt;else&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Key must be between 1 and 25. Please try again.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid input. Please enter a number between 1 and 25.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;get_valid_key()&lt;/code&gt; function ensures that the user inputs a valid key between 1 and 25. If the input is invalid (either not a number or outside the acceptable range), the program will prompt the user to try again. This function prevents errors due to incorrect user input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Function
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;*** CAESAR CIPHER PROGRAM ***&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1. Encrypt a message&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2. Decrypt a message&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3. Exit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter your choice (1-3): &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&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="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;ENCRYPTION MODE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_valid_key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Enter the text to encrypt: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;ciphertext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;encrypt_decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;e&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CIPHERTEXT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ciphertext&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;'&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="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;DECRYPTION MODE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_valid_key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Enter the text to decrypt: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;plaintext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;encrypt_decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PLAINTEXT: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;plaintext&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;'&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Thank you for using the Caesar Cipher program. Goodbye!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;

        &lt;span class="k"&gt;else&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid choice. Please enter 1, 2, or 3.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program presents a simple menu where the user can choose to encrypt a message, decrypt a message, or exit the program.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user chooses option 1, the user enters a text and a shift key, the program calls &lt;code&gt;encrypt_decrypt()&lt;/code&gt; with mode &lt;code&gt;e&lt;/code&gt; for encryption and displays the encrypted message.&lt;/li&gt;
&lt;li&gt;When a user chooses option 2, the user inputs the encrypted text and the key used for encryption, the program calls &lt;code&gt;encrypt_decrypt()&lt;/code&gt; with mode &lt;code&gt;d&lt;/code&gt; for decryption and displays the original message.&lt;/li&gt;
&lt;li&gt;When a user chooses option 3, the program terminates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Program in Action
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Encryption
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fc50bre03l0tv30o6lcvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fc50bre03l0tv30o6lcvq.png" alt="Encryption"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Decryption
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ftf1u9mdmbl2uh2ru9fnc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftf1u9mdmbl2uh2ru9fnc.png" alt="Decryption"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Exit
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fhphzao064ayz6rcpzi4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fhphzao064ayz6rcpzi4o.png" alt="Exit"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;While the Caesar Cipher is an excellent learning tool, it's crucial to understand some of its limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With only 25 possible shifts, it's vulnerable to brute-force attacks.&lt;/li&gt;
&lt;li&gt;In longer messages, letter frequencies can be analyzed to break the cipher.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this tutorial, we’ve implemented a Caesar Cipher in Python that allows users to both encrypt and decrypt messages.&lt;/p&gt;

&lt;p&gt;Happy coding, and stay secure!&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>encryption</category>
    </item>
    <item>
      <title>Walkthrough / Solution to SBT's Wireshark Challenge Activity</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Wed, 02 Oct 2024 09:26:38 +0000</pubDate>
      <link>https://dev.to/immah/walkthrough-solution-to-sbts-wireshark-challenge-activity-36hf</link>
      <guid>https://dev.to/immah/walkthrough-solution-to-sbts-wireshark-challenge-activity-36hf</guid>
      <description>&lt;p&gt;I recently started my journey in the cybersecurity world, aiming to build a career in this field. After completing Google's Cybersecurity course on Coursera, I embarked on the &lt;a href="https://www.securityblue.team/courses/blue-team-junior-analyst-pathway-bundle" rel="noopener noreferrer"&gt;Blue Team Junior Analyst Pathway Bundle&lt;/a&gt; by &lt;a href="https://www.securityblue.team/" rel="noopener noreferrer"&gt;Security Blue Team (SBT)&lt;/a&gt;. This article is part of a series detailing my solutions to various activities covered on the platform. Please note that the Blue Team Junior Analyst Pathway Bundle is entirely self-paced and free.&lt;/p&gt;

&lt;p&gt;In this instalment, I'll tackle the first activity, which involves analyzing network traffic with Wireshark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Setup&lt;/li&gt;
&lt;li&gt;Challenge Questions&lt;/li&gt;
&lt;li&gt;Key Concepts&lt;/li&gt;
&lt;li&gt;
Solutions

&lt;ul&gt;
&lt;li&gt;Which protocol was used over port 3942?&lt;/li&gt;
&lt;li&gt;What is the IP address of the host that was pinged twice?&lt;/li&gt;
&lt;li&gt;How many DNS query response packets were captured?&lt;/li&gt;
&lt;li&gt;What is the IP address of the host which sent the most number of bytes?&lt;/li&gt;
&lt;li&gt;What is the WebAdmin password?&lt;/li&gt;
&lt;li&gt;What is the version number of the attacker’s FTP server?&lt;/li&gt;
&lt;li&gt;Which port was used to gain access to the victim Windows host?&lt;/li&gt;
&lt;li&gt;What is the name of a confidential file on the Windows host?&lt;/li&gt;
&lt;li&gt;What is the name of the log file that was created at 4:51 AM on the Windows host?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion&lt;/li&gt;

&lt;/ul&gt;

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

&lt;p&gt;If you're using Ubuntu like me, &lt;a href="https://www.cherryservers.com/blog/install-wireshark-ubuntu" rel="noopener noreferrer"&gt;here's a guide&lt;/a&gt; on downloading Wireshark on your system. For other platforms, you can find installation instructions &lt;a href="https://www.wireshark.org/download.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge Questions
&lt;/h2&gt;

&lt;p&gt;The activity consists of analyzing two PCAP files and answering the following questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCAP 1&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which protocol was used over port 3942?&lt;/li&gt;
&lt;li&gt;What is the IP address of the host that was pinged twice?&lt;/li&gt;
&lt;li&gt;How many DNS query response packets were captured?&lt;/li&gt;
&lt;li&gt;What is the IP address of the host which sent the most number of bytes?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;PCAP 2&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the WebAdmin password?&lt;/li&gt;
&lt;li&gt;What is the version number of the attacker's FTP server?&lt;/li&gt;
&lt;li&gt;Which port was used to gain access to the victim Windows host?&lt;/li&gt;
&lt;li&gt;What is the name of a confidential file on the Windows host?&lt;/li&gt;
&lt;li&gt;What is the name of the log file that was created at 4:51 AM on the Windows host?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Concepts
&lt;/h2&gt;

&lt;p&gt;Before we dive into the solutions, let's briefly explain some key networking concepts that will be encountered in this challenge:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simple Service Discovery Protocol (SSDP)&lt;/strong&gt; - This is a network protocol that allows network devices to advertise their services to others on the network. It's commonly used in home networks for devices like printers or media servers to make themselves discoverable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internet Control Message Protocol (ICMP)&lt;/strong&gt; - This is a network layer protocol used by network devices to diagnose network communication issues. The most common example is the "ping" command, which uses ICMP echo request and reply messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Name System (DNS)&lt;/strong&gt; - Often called the "phonebook of the Internet," DNS translates human-readable domain names (like &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;) into IP addresses that computers use to identify each other on the network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hypertext Transfer Protocol (HTTP)&lt;/strong&gt; - The foundation of data communication on the World Wide Web. It defines how messages are formatted and transmitted between web browsers and servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Transfer Protocol (FTP)&lt;/strong&gt; - A standard network protocol used for transferring files between a client and server on a computer network.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, let's proceed with the solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which protocol was used over port 3942?
&lt;/h3&gt;

&lt;p&gt;To find the protocol used over port 3942, we use the filter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tcp.port == 3942 or udp.port == 3942&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This filter shows all TCP or UDP traffic using port 3942. In the protocol column for the filtered packets, we see SSDP, which stands for Simple Service Discovery Protocol.&lt;/p&gt;

&lt;p&gt;Therefore, the answer to the first question is &lt;strong&gt;SSDP&lt;/strong&gt;.&lt;/p&gt;

&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%2Fuploads%2Farticles%2F6z63id66b179rlvl3x2w.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%2Fuploads%2Farticles%2F6z63id66b179rlvl3x2w.png" alt="quetion1" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the IP address of the host that was pinged twice?
&lt;/h3&gt;

&lt;p&gt;To find the IP address of the host that was pinged twice, we apply the display filter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;icmp.type == 8&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This filter shows ICMP echo request packets (pings). We look for the destination IP address that appears twice, which is 8.8.4.4. Note that 192.168.1.7 is a private IP address, while 8.8.4.4 is a public IP address.&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;8.8.4.4&lt;/strong&gt;.&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fom640dk0rs9hl275kqcz.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%2Fuploads%2Farticles%2Fom640dk0rs9hl275kqcz.png" alt="question2" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How many DNS query response packets were captured?
&lt;/h3&gt;

&lt;p&gt;To count DNS query response packets, we apply the display filter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dns.flags.response == 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This filter shows all DNS response packets. The number of packets can be found at the bottom right of the Wireshark window, which shows 90.&lt;/p&gt;

&lt;p&gt;Therefore, the answer is &lt;strong&gt;90&lt;/strong&gt;&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fdrbjgb3nqt7xc9w9z3vi.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%2Fuploads%2Farticles%2Fdrbjgb3nqt7xc9w9z3vi.png" alt="question3" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the IP address of the host which sent the most number of bytes?
&lt;/h3&gt;

&lt;p&gt;To find the IP address of the host which sent the most bytes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to Statistics &amp;gt; Endpoints&lt;/li&gt;
&lt;li&gt;In the IPv4 tab, sort by the Tx Bytes column (click on the column header)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The IP address at the top of the list is 192.168.1.7, but the answer recognized by Security Blue Team is 115.178.9.18. This discrepancy might be due to an outdated answer key or a difference in interpretation.&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fybj6d0jfwsqx0u0qnubd.gif" 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%2Fuploads%2Farticles%2Fybj6d0jfwsqx0u0qnubd.gif" alt="question4" width="959" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the WebAdmin password?
&lt;/h3&gt;

&lt;p&gt;To find the WebAdmin password:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply the filter http to show all HTTP traffic&lt;/li&gt;
&lt;li&gt;Find the response to the GET request (frame 4121), which is frame 4123&lt;/li&gt;
&lt;li&gt;Right-click on frame 4123 and select "Follow &amp;gt; HTTP Stream"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The password is visible in the stream: &lt;strong&gt;sbt123&lt;/strong&gt;&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fvoi8hq20qgwh3cfb4trj.gif" 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%2Fuploads%2Farticles%2Fvoi8hq20qgwh3cfb4trj.gif" alt="question5" width="959" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the version number of the attacker’s FTP server?
&lt;/h3&gt;

&lt;p&gt;To find the version number of the attacker's FTP server, check the first frame (4243). In the info column, the response is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pyftpdlib 1.5.5 ready&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This indicates that the version number is &lt;strong&gt;1.5.5&lt;/strong&gt;.&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fkqq8aitkp0qpf4ddz9it.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%2Fuploads%2Farticles%2Fkqq8aitkp0qpf4ddz9it.png" alt="question6" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Which port was used to gain access to the victim Windows host?
&lt;/h3&gt;

&lt;p&gt;To find the port used to access the victim's Windows host, use the filter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ip.src == 192.168.56.1 and ip.dst == 192.168.56.103 and tcp.flags.ack == 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This filter shows all packets from the attacker to the victim with an ACK flag set.&lt;/p&gt;

&lt;p&gt;The port used is &lt;strong&gt;8081&lt;/strong&gt;.&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fwjh0di3hrk3vthtod0xa.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%2Fuploads%2Farticles%2Fwjh0di3hrk3vthtod0xa.png" alt="question7" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the name of a confidential file on the Windows host?
&lt;/h3&gt;

&lt;p&gt;To find the name of the confidential file:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on the first frame (4130) from the previous step&lt;/li&gt;
&lt;li&gt;Select "Follow &amp;gt; TCP Stream"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The confidential file name is visible in the stream as &lt;strong&gt;Employee_Information_CONFIDENTIAL.txt&lt;/strong&gt;&lt;/p&gt;

&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%2Fuploads%2Farticles%2Fygond8q7nvnbi5bhtt67.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%2Fuploads%2Farticles%2Fygond8q7nvnbi5bhtt67.png" alt="question8" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the name of the log file that was created at 4:51 AM on the Windows host?
&lt;/h3&gt;

&lt;p&gt;In the same TCP stream as the previous question, you can find the log file created at 4:51 AM.&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;LogFile.log&lt;/strong&gt;&lt;/p&gt;

&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%2Fuploads%2Farticles%2F4vcvq5nlsppjmlgg5679.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%2Fuploads%2Farticles%2F4vcvq5nlsppjmlgg5679.png" alt="question9" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This Wireshark challenge activity provides an excellent opportunity to practice network traffic analysis skills. By working through these questions, you'll gain hands-on experience with filtering packets, analyzing protocols, and extracting valuable information from network captures.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>networkanalysis</category>
      <category>securityblueteam</category>
    </item>
    <item>
      <title>Automating User and Group Creation With Bash Script</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Tue, 02 Jul 2024 12:36:06 +0000</pubDate>
      <link>https://dev.to/immah/automating-user-and-group-creation-with-bash-script-58mp</link>
      <guid>https://dev.to/immah/automating-user-and-group-creation-with-bash-script-58mp</guid>
      <description>&lt;p&gt;In this article, I will guide you on creating a bash script that can be used to automate the creation of users and groups based on a provided list, set up home directories, generate random passwords and log all actions in a log file.&lt;/p&gt;

&lt;p&gt;This script is task 2 given as part of the HNG Internship: DevOps track. You can read more about the HNG program &lt;a href="https://hng.tech/internship"&gt;here&lt;/a&gt;, and if you are hiring talented developers, checkout their services &lt;a href="https://hng.tech/hire"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Prerequisities&lt;/li&gt;
&lt;li&gt;
Script Overview

&lt;ul&gt;
&lt;li&gt;Shebang&lt;/li&gt;
&lt;li&gt;File Paths&lt;/li&gt;
&lt;li&gt;Ensure Secure Directory Exists&lt;/li&gt;
&lt;li&gt;Clear Log and Password Files&lt;/li&gt;
&lt;li&gt;Generate Random Password&lt;/li&gt;
&lt;li&gt;Check Input File&lt;/li&gt;
&lt;li&gt;Read the input file line by line&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Example Input File&lt;/li&gt;
&lt;li&gt;Usage&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This script automates user and group creation on a Unix-based system, making it easier for SysOps engineers to manage multiple users.&lt;/p&gt;

&lt;p&gt;It reads a list of usernames and their respective groups from a file, creates users and groups, sets up home directories with appropriate permissions, generates random passwords, and logs all actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Linux commands and Bash scripting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root or sudo&lt;/strong&gt; privileges to run the script.&lt;/li&gt;
&lt;li&gt;An input file containing the list of users and groups formatted as &lt;code&gt;username;group1,group2,...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flash; sudo,dev,www-data
thunder; sudo
thanos; dev,www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Script Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shebang
&lt;/h3&gt;

&lt;p&gt;When writing a bash script, the first thing is to ensure that you include a shebang at the top of the script file.&lt;/p&gt;

&lt;p&gt;Shebang is used to tell the system which interpreter/command to use to execute the commands written inside the scripts.&lt;/p&gt;

&lt;p&gt;For example in this case, let's use &lt;code&gt;#!/bin/bash&lt;/code&gt; to tell the terminal to use bash to execute the script.&lt;/p&gt;

&lt;p&gt;You can read more about shebang &lt;a href="https://medium.com/@codingmaths/bin-bash-what-exactly-is-this-95fc8db817bf"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Paths
&lt;/h3&gt;

&lt;p&gt;We need to set variables that specifies/stores paths to the files we will be using to achieve the various tasks.&lt;/p&gt;

&lt;p&gt;This files are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LOG_FILE&lt;/strong&gt;: The log file where all actions are recorded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PASSWORD_FILE&lt;/strong&gt;: The file where generated passwords are stored securely.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/log/user_management.log"&lt;/span&gt;
&lt;span class="nv"&gt;PASSWORD_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/secure/user_passwords.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ensure Secure Directory Exists
&lt;/h3&gt;

&lt;p&gt;We use the conditional if statement to ensure that the &lt;code&gt;var/secure&lt;/code&gt; directory exist.&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/secure 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create /var/secure directory. Permission denied."&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /var/secure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;chmod 700&lt;/code&gt; grants the owner read , write and execute permissions, and gives no permissions for group and other users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clear Log and Password Files
&lt;/h3&gt;

&lt;p&gt;This step clears the log and password files if they exist and sets appropriate permissions.&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="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create log file &lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create password file &lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;chmod &lt;/span&gt;600 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;chmod 600&lt;/code&gt; grants read and write permissions to the owner, while denying all permissions to the group and other users.&lt;/p&gt;

&lt;p&gt;You can read more about modifying file permissions with chmod &lt;a href="https://www.linode.com/docs/guides/modify-file-permissions-with-chmod/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate Random Password
&lt;/h3&gt;

&lt;p&gt;This function creates a random 12-character password.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;generate_password&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-dc&lt;/span&gt; A-Za-z0-9 &amp;lt;/dev/urandom | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 12
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Input File
&lt;/h3&gt;

&lt;p&gt;Here, we check if an input file that contains a list of users and groups is provided and exits with a usage message if not.&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;user_list_file&amp;gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read the input file line by line
&lt;/h3&gt;

&lt;p&gt;Once we have verified that an input file has been provided, we can now process each user in the input file.&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="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;';'&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; username &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To avoid instances where the input file might contain whitesspaces, we have to ignore / trim the whitespaces first.&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="nv"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | xargs&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$groups&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | xargs&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check if a user in the input file exists in the system, and if so, skip creation of the user.&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="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; already exists. Skipping..."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;continue
    fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a personal group for the user if it doesn't exist already.&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; getent group &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; groupadd &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create group &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;continue
        fi
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Group &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; created."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the user with a home directory and assign the personal group.&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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; useradd &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create user &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;continue
    fi
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; created with home directory."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the user to additional groups as specified in the input file.&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="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-ra&lt;/span&gt; ADDR &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$groups&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;group &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ADDR&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        &lt;/span&gt;&lt;span class="nv"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | xargs&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; getent group &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; groupadd &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to create group &lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                &lt;span class="k"&gt;continue
            fi
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Group &lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt; created."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;fi
        if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to add user &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; to group &lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;continue
        fi
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; added to group &lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set permissions and ownership for the user's home directory.&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;chmod &lt;/span&gt;700 &lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the function &lt;code&gt;generate_password&lt;/code&gt; that we created earlier, generate a random password, set it for the user and log it in the &lt;code&gt;PASSWORD_FILE&lt;/code&gt;.&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="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;generate_password&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | chpasswd 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Failed to set password for user &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;. Permission denied."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Password for user &lt;/span&gt;&lt;span class="nv"&gt;$username&lt;/span&gt;&lt;span class="s2"&gt; set."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can include a completion message for the "LOG_FILE".&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"User creation process completed."&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Input File
&lt;/h2&gt;

&lt;p&gt;Create a file named &lt;code&gt;user_list.txt&lt;/code&gt; 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;flash; sudo,dev,www-data
thunder; sudo
thanos; dev,www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;To use the script, follow these steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the script as &lt;code&gt;create_users.sh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Make the script executable - &lt;code&gt;chmod +x create_users.sh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run the script with &lt;code&gt;sudo&lt;/code&gt; - &lt;code&gt;sudo ./create_users.sh user_list.txt&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You can view the full script &lt;a href="https://github.com/emmanuelkaringi/HNG_Task_2/blob/main/create_users.sh"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;This script simplifies the process of creating users and groups, setting up home directories, generating passwords, and logging actions. By automating these tasks, SysOps engineers can efficiently manage user accounts in a consistent and secure manner.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>devops</category>
    </item>
    <item>
      <title>Stored Procedures: The Secret to Improving Your Database Applications</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Tue, 08 Aug 2023 14:36:35 +0000</pubDate>
      <link>https://dev.to/immah/stored-procedures-the-secret-to-improving-your-database-applications-462g</link>
      <guid>https://dev.to/immah/stored-procedures-the-secret-to-improving-your-database-applications-462g</guid>
      <description>&lt;p&gt;Imagine a single command that can execute complex operations, streamline database interactions, and enhance security, all while reducing network traffic.&lt;/p&gt;

&lt;p&gt;Stored procedures are the secret weapon in every seasoned developer's toolkit, offering not just a way to execute SQL statements, but a gateway to optimizing performance, simplifying maintenance and protecting your data.&lt;/p&gt;

&lt;p&gt;In this exploration, we delve into the world of stored procedures, unraveling their capabilities and revealing how they revolutionize the way databases are harnessed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
Introduction to Stored Procedures

&lt;ul&gt;
&lt;li&gt;What are stored procedures?&lt;/li&gt;
&lt;li&gt;Why use stored procedures?&lt;/li&gt;
&lt;li&gt;What are the limitations of using stored procedures?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating and Using Stored Procedures&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a stored procedure&lt;/li&gt;
&lt;li&gt;Types of parameters that can be used with stored procedures&lt;/li&gt;
&lt;li&gt;Call / execute a stored procedures&lt;/li&gt;
&lt;li&gt;Alter / modify a stored procedure.&lt;/li&gt;
&lt;li&gt;Drop / delete a stored procedure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best Practices for Developing Stored Procedures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inventory Management Project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve all items in items&lt;/li&gt;
&lt;li&gt;Add an item to items&lt;/li&gt;
&lt;li&gt;Update the quantity of an item in items&lt;/li&gt;
&lt;li&gt;Retrieve items by name&lt;/li&gt;
&lt;li&gt;Delete an item from items&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conclusion &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introduction to Stored Procedures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What are stored procedures?
&lt;/h3&gt;

&lt;p&gt;A stored procedure is a group of SQL statements that are stored together as a unit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why use stored procedures?
&lt;/h3&gt;

&lt;p&gt;Using stored procedures in a database driven application offers a range of benefits that contribute to improved performance, security, maintainability, and overall efficiency.&lt;/p&gt;

&lt;p&gt;Here are some of the most common benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Stored procedures are precompiled and stored in the database. This means that the query execution plan is generated and saved when the procedure is created or modified, thus leading to faster query execution and reduced overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Stored procedures can improve the security of your database applications by hiding the underlying SQL code from users.&lt;/p&gt;

&lt;p&gt;This can help prevent unauthorized users from making unauthorized changes to your database. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maintainability:&lt;/strong&gt; Stored procedures can improve the maintainability of your database applications by centralizing the code for a particular task.&lt;/p&gt;

&lt;p&gt;This makes it easier to find and fix bugs, and to make changes to the code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reusability:&lt;/strong&gt; Stored procedures can be reused in multiple applications. This can save time and effort in development, and it can also help to ensure that applications are consistent with each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; Stored procedures can be documented, which can help to improve the understanding of how your database applications work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Network Traffic:&lt;/strong&gt; With stored procedures, only the procedure name and input parameters need to be sent to the database server, minimizing the amount of data transferred over the network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility Across Platforms:&lt;/strong&gt; Since stored procedures provide a consistent interface to the database regardless of the application's programming language or framework, integration and collaboration among different components of a system is easier.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What are the limitations of using stored procedures?
&lt;/h3&gt;

&lt;p&gt;While stored procedures offer numerous advantages, there are also some limitations and considerations that you as a developer should be aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; Stored procedures can be complex to develop and maintain. This is especially true for stored procedures that perform complex tasks or that interact with multiple tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing:&lt;/strong&gt;  Stored procedures can be difficult to test. This is because stored procedures are not executed in the same way as regular SQL queries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portability:&lt;/strong&gt; Stored procedures are not always portable between different database platforms.&lt;/p&gt;

&lt;p&gt;This is because different database platforms have different syntax for stored procedures.&lt;/p&gt;

&lt;p&gt;If you heavily rely on stored procedures, it might become challenging to migrate to a different database platform in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security:&lt;/strong&gt; Stored procedures can be a security risk if they are not properly written and secured. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Trade-offs:&lt;/strong&gt; While stored procedures can enhance performance, there can be cases where they might not be as efficient as optimized application code, especially when dealing with complex calculations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating and Using Stored Procedures
&lt;/h2&gt;

&lt;p&gt;In this article we are going to use SQL Server and Azure data studio to create and run our stored procedures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a stored procedure
&lt;/h3&gt;

&lt;p&gt;The syntax for creating a stored procedure:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;procedure_name&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;parameter_name&lt;/span&gt; &lt;span class="n"&gt;data_type&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;statements&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;CREATE PROCEDURE&lt;/code&gt; statement is used to create a new stored procedure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;schema_name&lt;/code&gt; is the name of the schema in which the stored procedure will be created.&lt;/p&gt;

&lt;p&gt;This option depends on whether you created a schema when developing your database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;procedure_name&lt;/code&gt; is the name of the stored procedure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;parameter_name&lt;/code&gt; is the name of a parameter that can be passed to the stored procedure. &lt;/p&gt;

&lt;p&gt;In instances where the procedure will be used to list all items, you don’t need a parameter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;data_type&lt;/code&gt; is the data type of the parameter. You can specify multiple parameters by separating them with commas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AS&lt;/code&gt; keyword is used to separate the declaration of the stored procedure from the body of the stored procedure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;BEGIN&lt;/code&gt; and &lt;code&gt;END&lt;/code&gt; keywords are used to enclose the body of the stored procedure, where you place your SQL statements and logic that will be executed when the stored procedure is called.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Types of parameters that can be used with stored procedures
&lt;/h3&gt;

&lt;p&gt;There are three main types of parameters that can be used with stored procedures:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Input Parameters (IN):&lt;/strong&gt; Input parameters allow you to pass values into the stored procedure when it's called.&lt;/p&gt;

&lt;p&gt;These values can be used within the procedure's logic to perform operations or queries. Input parameters are prefixed with an &lt;strong&gt;@&lt;/strong&gt; symbol.&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;AddItemToInventory&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Inventory&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;END&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 example, the stored procedure takes three &lt;code&gt;IN&lt;/code&gt; parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@ItemID:&lt;/strong&gt; The ID of the item to add to inventory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@ItemName:&lt;/strong&gt; The name of the item to add to inventory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@Quantity:&lt;/strong&gt; The quantity of the item to add to inventory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The values of these parameters are used by the stored procedure to insert a new row into the Inventory table.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Output Parameters (OUT):&lt;/strong&gt; Output parameters are used to return values from the stored procedure back to the caller.&lt;/p&gt;

&lt;p&gt;The stored procedure sets the value of the OUT parameter before it returns from execution.&lt;/p&gt;

&lt;p&gt;They must be declared using the OUTPUT keyword and are also prefixed with &lt;code&gt;@&lt;/code&gt;.&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetNumberOfItemsInInventory&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;NumberOfItems&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;OUT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;NumberOfItems&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Inventory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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 example, the stored procedure takes one OUT parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@NumberOfItems:&lt;/strong&gt; The number of items in inventory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stored procedure counts the number of rows in the Inventory table and sets the value of the &lt;code&gt;@NumberOfItems&lt;/code&gt; parameter to the number of rows.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Input/Output Parameters (INOUT):&lt;/strong&gt; These are parameters that can be used to pass data to the stored procedure and to return data from the stored procedure.&lt;/p&gt;

&lt;p&gt;The stored procedure can both read and write the value of the INOUT parameter.&lt;/p&gt;

&lt;p&gt;They must be declared using the INOUT keyword and are also prefixed with &lt;code&gt;@&lt;/code&gt;.&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;IncreaseQuantityByOne&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;INOUT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;Inventory&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Quantity&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;END&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 example, the stored procedure takes two parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;@ItemID:&lt;/em&gt;&lt;/strong&gt; The ID of the item to increase the quantity of.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;@Quantity:&lt;/em&gt;&lt;/strong&gt; The current quantity of the item.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stored procedure first updates the quantity of the item by 1. Then, it sets the value of the &lt;code&gt;@Quantity&lt;/code&gt; parameter to the new quantity of the item.&lt;/p&gt;

&lt;h3&gt;
  
  
  Call / execute a stored procedure
&lt;/h3&gt;

&lt;p&gt;To call a stored procedure, you use the EXEC statement. &lt;/p&gt;

&lt;p&gt;The syntax for the EXEC statement is as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Without Parameters:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the stored procedure has no parameters, you can omit the parameter list.&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;EXEC&lt;/span&gt; &lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;procedure_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An example of how to call the &lt;code&gt;GetNumberOfItemsInInventory&lt;/code&gt; stored procedure:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;GetNumberOfItemsInInventory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will call the &lt;code&gt;GetNumberOfItemsInInventory&lt;/code&gt; stored procedure and return the number of items in inventory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;With Parameters:&lt;/em&gt;&lt;/strong&gt;&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;EXEC&lt;/span&gt; &lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;procedure_name&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;param1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;param2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An example of how to call the AddItemToInventory stored procedure:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;AddItemToInventory&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&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="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'T-Shirt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will call the AddItemToInventory stored procedure and pass the values 1, 'T-Shirt', and 10 to the stored procedure as parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alter / modify a stored procedure.
&lt;/h3&gt;

&lt;p&gt;To alter or modify a stored procedure, you use&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;PROCEDURE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the &lt;strong&gt;ALTER PROCEDURE&lt;/strong&gt; statement to add new parameters, remove parameters from a stored procedure, or to change the definition of a parameter.&lt;/p&gt;

&lt;p&gt;The syntax for the ALTER PROCEDURE statement is as follows:&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;PROCEDURE&lt;/span&gt; &lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;procedure_name&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="n"&gt;New_sql_statements&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is an example of how to alter the &lt;code&gt;AddItemToInventory&lt;/code&gt; stored procedure to add a new parameter:&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;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;AddItemToInventory&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Inventory&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add a new parameter called &lt;code&gt;@Price&lt;/code&gt; to the &lt;code&gt;AddItemToInventory&lt;/code&gt; stored procedure. The @Price parameter will be used to store the price of the item being added to inventory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drop / delete a stored procedure
&lt;/h3&gt;

&lt;p&gt;To drop or delete a stored procedure, you use the &lt;strong&gt;&lt;em&gt;DROP PROCEDURE&lt;/em&gt;&lt;/strong&gt; statement.&lt;/p&gt;

&lt;p&gt;The syntax is as follows:&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;DROP&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="k"&gt;schema_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;procedure_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, to drop the &lt;code&gt;AddItemToInventory&lt;/code&gt; stored procedure, you would use the following syntax:&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;DROP&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;AddItemToInventory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will delete the &lt;code&gt;AddItemToInventory&lt;/code&gt; stored procedure from the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;You should only drop a stored procedure if you are sure that you no longer need it. If you drop a stored procedure that is still in use, it could cause problems with your database applications.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Developing Stored Procedures
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use meaningful names for stored procedures:&lt;/strong&gt; The names of your stored procedures should be descriptive and easy to understand.&lt;/p&gt;

&lt;p&gt;This will make it easier for other developers to understand what the stored procedures do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comment your stored procedures:&lt;/strong&gt; Commenting your stored procedures will make it easier for other developers to understand how the stored procedures work.&lt;/p&gt;

&lt;p&gt;It is also a good idea to comment on the parameters that are passed to the stored procedures and the values that are returned by the stored procedures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use parameters to pass data to and from stored procedures:&lt;/strong&gt; Using parameters to pass data to and from stored procedures makes your stored procedures more flexible and reusable.&lt;/p&gt;

&lt;p&gt;This is because you can change the values of the parameters without having to change the code in the stored procedure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test your stored procedures thoroughly:&lt;/strong&gt; It is important to test your stored procedures thoroughly before you put them into production.&lt;/p&gt;

&lt;p&gt;This will help to ensure that your stored procedures are working correctly and that they are not vulnerable to security attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use a consistent naming convention for stored procedures:&lt;/strong&gt; Using a consistent naming convention for stored procedures will make it easier for other developers to understand your code.&lt;/p&gt;

&lt;p&gt;This is especially important if you are working on a team of developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use error handling in your stored procedures:&lt;/strong&gt; Error handling is important for any piece of code, but it is especially important for stored procedures.&lt;/p&gt;

&lt;p&gt;This is because stored procedures are often called by other applications, and if an error occurs in a stored procedure, it could cause problems with the application that called it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use stored procedures to encapsulate complex logic:&lt;/strong&gt; Stored procedures can be used to encapsulate complex logic, which can make your code more readable and maintainable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is because you can put all of the complex logic in the stored procedure, and then call the stored procedure from your application code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use stored procedures to improve performance:&lt;/strong&gt; Stored procedures can be used to improve performance by caching the execution plan for the stored procedure&lt;/p&gt;

&lt;p&gt;This means that the database engine does not have to recompile the execution plan each time the stored procedure is called.&lt;/p&gt;

&lt;p&gt;This can result in significant performance improvements, especially for frequently executed stored procedures.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Inventory Management Project
&lt;/h2&gt;

&lt;p&gt;For this simple project, we are going to have a database named inventory which will contain only one tale.&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product A'&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="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product C'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product D'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product E'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Retrieve all items in items
&lt;/h3&gt;

&lt;p&gt;Let’s create a stored procedure to retrieve / view all items in the items table:&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;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetAllItems&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After executing the stored procedure, it is saved in the database as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zMCiHaDK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n7fgxz31so7iht85ypqt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zMCiHaDK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n7fgxz31so7iht85ypqt.png" alt="stored" width="301" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, Lets execute it and see the results:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;GetAllItems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u5yFtAcz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oto2qd8hj327ksst6hsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u5yFtAcz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oto2qd8hj327ksst6hsx.png" alt="Get all Items Results" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will return a result set containing all rows from the items table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add an item to items
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;AddItem&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, Lets execute it and see the results:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;AddItem&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Product F'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add a new item to inventory with the name 'Product F', a quantity of 10, and a price of 10.99.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7sJav5An--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ubzi7m8mx41eioday70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7sJav5An--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ubzi7m8mx41eioday70.png" alt="Add Product" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Update the quantity of an item in items
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;UpdateQuantityOfItem&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
  &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, Lets execute it and see the results:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;UpdateQuantityOfItem&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&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="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will update the quantity of the item with the ID 1 to 20.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--07TtYbA4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bieq8nphjnl76oegxsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--07TtYbA4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bieq8nphjnl76oegxsm.png" alt="Update Result" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieve items by name
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;RetrieveItemsByName&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ItemName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Price&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This stored procedure takes one parameter, &lt;strong&gt;&lt;em&gt;@ItemName&lt;/em&gt;&lt;/strong&gt;, which is the name of the item to retrieve. &lt;/p&gt;

&lt;p&gt;The stored procedure then selects all rows from the Items table where the ItemName column is equal to &lt;strong&gt;&lt;em&gt;@ItemName&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now, Lets execute it and see the results:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;RetrieveItemsByName&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Product C'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TZblFn4p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gzwmy8racs8ls0u17sqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TZblFn4p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gzwmy8racs8ls0u17sqe.png" alt="Retrieve by Name" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Delete an item from items
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;DeleteItem&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
  &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ItemID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now, Lets execute it and see the results:&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;EXEC&lt;/span&gt; &lt;span class="n"&gt;DeleteItem&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ItemID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will delete the row from the items table where the ItemID column is equal to 1 that is Product D.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WrwbGpMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iipvq9wu7sh902s4knsq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WrwbGpMh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iipvq9wu7sh902s4knsq.png" alt="Delete Item" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;By mastering the art of creating, altering, and calling stored procedures, you've acquired a valuable skill set for optimizing data manipulation tasks.&lt;/p&gt;

&lt;p&gt;While this article has unveiled the fundamentals and best practices, there's always more to explore. &lt;/p&gt;

&lt;p&gt;To further expand your expertise and deepen your understanding, I encourage you to explore more on stored procedures through a comprehensive resource available at &lt;a href="https://www.sqlservertutorial.net/sql-server-stored-procedures/basic-sql-server-stored-procedures/"&gt;SQL Server Tutorial&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There, you'll find a wealth of information, advanced techniques, and real-world use cases that will empower you to harness the full potential of stored procedures in your database driven projects.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>How to build a user management API using Node.js and Express (No Database)</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Wed, 14 Jun 2023 19:17:43 +0000</pubDate>
      <link>https://dev.to/immah/how-to-build-a-user-management-api-using-nodejs-and-express-no-database-a5b</link>
      <guid>https://dev.to/immah/how-to-build-a-user-management-api-using-nodejs-and-express-no-database-a5b</guid>
      <description>&lt;p&gt;Liquid syntax error: Unknown tag 'endraw'&lt;/p&gt;
</description>
      <category>api</category>
      <category>node</category>
      <category>express</category>
    </item>
    <item>
      <title>How To Setup a Web Server and Nginx with Amazon EC2</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Wed, 26 Oct 2022 17:04:05 +0000</pubDate>
      <link>https://dev.to/immah/how-to-setup-a-web-server-and-nginx-with-amazon-ec2-2fgd</link>
      <guid>https://dev.to/immah/how-to-setup-a-web-server-and-nginx-with-amazon-ec2-2fgd</guid>
      <description>&lt;p&gt;I recently signed up for the &lt;a href="https://internship.zuri.team/hngi9"&gt;HNG Internship 9&lt;/a&gt; for the backend track. The internship starts on 27th October 2022.&lt;br&gt;
The first task (ungraded) was to set up a web server and host a simple website that displays ‘Hello World'. &lt;br&gt;
This is a step-by-step process of how I did the task.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Amazon EC2?
&lt;/h3&gt;

&lt;p&gt;Amazon Elastic Compute Cloud (Amazon EC2) is a web service that provides secure and resizable compute capacity in the cloud. It is designed to make web-scale cloud computing easier for developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Nginx?
&lt;/h3&gt;

&lt;p&gt;Nginx is a web server used as a reverse proxy, load balancer, mail proxy and HTTP cache.&lt;/p&gt;

&lt;h4&gt;
  
  
  Set Up an AWS Account and Configure a Security Group
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Create an AWS Account, &lt;a href="https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;amp;all-free-tier.sort-order=asc&amp;amp;awsf.Free%20Tier%20Types=*all&amp;amp;awsf.Free%20Tier%20Categories=*all"&gt;sign up&lt;/a&gt; and get a 12 months free tier account.&lt;/li&gt;
&lt;li&gt;Open the Amazon EC2 console &lt;a href="https://console.aws.amazon.com/ec2/"&gt;https://console.aws.amazon.com/ec2/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5UI3zQXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tqun6x9ucg1e57k0kfxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5UI3zQXd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tqun6x9ucg1e57k0kfxr.png" alt="EC2 Console" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the EC2 Dashboard, select ‘Security Group’.&lt;/li&gt;
&lt;li&gt;Select ‘Create Security Group’.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7LyCzOcZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/st2h637a16azq1upohbh.png" alt="Create Security Group" width="800" height="68"&gt;
&lt;/li&gt;
&lt;li&gt;Enter a simple name that you will remember for future use. Leave VPC as it is.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dAgmYDQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0dtr0r62p03r7rzs4mls.png" alt="Basic Details" width="800" height="294"&gt;
&lt;/li&gt;
&lt;li&gt;Add some inbound rules.

&lt;ul&gt;
&lt;li&gt;Rule 1 - Type: HTTP, Source: Anywhere IPV4&lt;/li&gt;
&lt;li&gt;Rule 2 - Type: HTTPS, Source: Anywhere IPV4&lt;/li&gt;
&lt;li&gt;Rule 3 - Type: SSH, Source: MyIP
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tf5YOjf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dasrdep2tq4rihmdnhok.png" alt="Inbound Rules" width="800" height="290"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Leave everything else as it is and click ‘Create Security Group’&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Create a Key Pair
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Move back to the EC2 dashboard.&lt;/li&gt;
&lt;li&gt;Click on ‘Key Pairs’ and select ‘create key pair’.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UHf5xkE_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ja9ot9tunns7n85v6hsd.png" alt="Create Key Pair" width="800" height="50"&gt;
&lt;/li&gt;
&lt;li&gt;Assign a suitable name for your key pair and leave everything else as selected. &lt;strong&gt;Choose .ppk only if you intend to use PuTTY to connect to your instance.&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Click on ‘Create key pair’.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oRIz5xrR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlzrmpr3m1idd80la42z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oRIz5xrR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlzrmpr3m1idd80la42z.png" alt="Create key pair" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A download dialogue box will pop up. Download the private key and store it on your computer. &lt;strong&gt;Note that if you do not download the key, you have to create a new key pair.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Launch an Instance
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Move back to the EC2 dashboard and choose instances.&lt;/li&gt;
&lt;li&gt;Choose ‘Launch Instance’. Give it an appropriate name.&lt;/li&gt;
&lt;li&gt;For Application and OS Images, select one of ‘Amazon Linux (HVM). Click on ‘Browse more AMIs’ for more options.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d6KRvE4F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2msq49fcv47ntqz1iop.png" alt="AMIs" width="800" height="455"&gt;
&lt;/li&gt;
&lt;li&gt;For instance type, select t2.micro.&lt;/li&gt;
&lt;li&gt;For the key pair, select the one that you created earlier.&lt;/li&gt;
&lt;li&gt;Select 'existing security group' and select the one you created earlier.&lt;/li&gt;
&lt;li&gt;Leave everything else as it is and click on Launch instance. It will take a few minutes before the status check is complete. Once the status check indicates &lt;strong&gt;2/2 checks passed&lt;/strong&gt;, you can now connect to your EC2 instance.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Connect to your Instance
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Fire up your local terminal and cd into the folder where you stored your private key. &lt;code&gt;cd Downloads&lt;/code&gt; in my case.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;chmod 400 &amp;lt;filename.pem&amp;gt;&lt;/code&gt; to change permission on the file to protect it against accidental overwriting.&lt;/li&gt;
&lt;li&gt;Connect to the instance by running &lt;code&gt;ssh -i &amp;lt;privatekey.pem&amp;gt; username@publicipaddress&lt;/code&gt;
In my case: &lt;code&gt;ssh -i keytest.pem ec2-user@3.86.234.246&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gsLISYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/besfw18uj5xvdvmz0vmb.png" alt="Connect to Instance Error" width="800" height="456"&gt;
&lt;/li&gt;
&lt;li&gt;If you get a &lt;strong&gt;connect to host 3.86…. port 22: Connection timed out&lt;/strong&gt; error, open the EC2 Console and choose security group. Select the security group you created or are using and edit inbound rules. Remove the IP on the SSH rule, choose MyIP and save the rules.&lt;/li&gt;
&lt;li&gt;Run the command in step 3. Everything should work well now. If you get more errors, check out more troubleshooting options from &lt;a href="https://www.s-squaresystems.com/how-to-troubleshoot-ssh-connection-issues-with-aws-ec2/#:~:text=Any%20timeout%20is%20related%20to,firewall%20is%20blocking%20the%20connection."&gt;here&lt;/a&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9EmuXiNP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75v8jmoe6ds870sexju2.png" alt="Connect to Instance Success" width="733" height="480"&gt;
&lt;/li&gt;
&lt;li&gt;Gain root access to your server by running &lt;code&gt;sudo su -&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pXGWMOuj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1b993zc99w6remvvfazl.png" alt="Root Access" width="786" height="533"&gt;
&lt;/li&gt;
&lt;li&gt;Install HTTPD package: &lt;code&gt;yum install -y httpd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable your server: &lt;code&gt;chkconfig httpd on&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rcg4SVLD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/it4zkx31e2zo20xdpvwk.png" alt="Install HTTPD" width="786" height="533"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Install and Configure Nginx
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Install EPEL: &lt;code&gt;yum install -y epel-release&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update Yum: &lt;code&gt;yum update -y&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install Nginx: &lt;code&gt;sudo amazon-linux-extras install nginx1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check Nginx Version: &lt;code&gt;nginx -v&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start Nginx: &lt;code&gt;systemctl start nginx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable Nginx: &lt;code&gt;systemctl enable nginx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check Nginx Status: &lt;code&gt;systemctl status nginx&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MDQqDb9d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ou0p911zlk0e7xke14wi.png" alt="Install &amp;amp; Enable Nginx" width="786" height="533"&gt;
&lt;/li&gt;
&lt;li&gt;Copy the Public IP to your web Browser to view the site's content.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G2ESWS0---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xiwx48nn8hy5r7seo1v1.png" alt="Site Content" width="800" height="452"&gt;
&lt;/li&gt;
&lt;li&gt;Write to the index.html file Using cat: &lt;code&gt;cat &amp;gt; /usr/share/nginx/html/index.html&lt;/code&gt;
&lt;code&gt;Hello World&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JxCf07pm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4thba5cxijnkhi7jpuj8.png" alt="After Editing" width="786" height="533"&gt;
&lt;/li&gt;
&lt;li&gt;Refresh your site to see the changes.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tvsg7Hjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14f9rf5suxwajwlkcq8b.png" alt="Site Refresh" width="800" height="452"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Terminate Your Instance
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;In the EC2 dashboard, choose Instances. &lt;/li&gt;
&lt;li&gt;In the list of instances, select the instance.&lt;/li&gt;
&lt;li&gt;Choose Instance state, Terminate instance.&lt;/li&gt;
&lt;li&gt;Choose Terminate when prompted for confirmation.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>aws</category>
      <category>ec2</category>
      <category>webserver</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Data Engineering 101: Introduction to Data Engineering</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Tue, 23 Aug 2022 16:49:59 +0000</pubDate>
      <link>https://dev.to/immah/data-engineering-101-introduction-to-data-engineering-3gjf</link>
      <guid>https://dev.to/immah/data-engineering-101-introduction-to-data-engineering-3gjf</guid>
      <description>&lt;p&gt;As data becomes ever more critical to organizations of all sizes, there has been a need for more data professionals such as Data Scientists, Data Analysts, ML Engineers and Data Engineers. In this article, we'll go through the difference between data engineering and data science and the skills of a data engineer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Data Engineering?
&lt;/h2&gt;

&lt;p&gt;Data engineering is the practice of designing and building systems for collecting, storing, and analyzing data at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is a Data Engineer?
&lt;/h2&gt;

&lt;p&gt;A Data Engineer is responsible for ingesting data from different sources, optimizing databases for analysis, removing corrupted data and developing, testing and maintaining data architectures.&lt;br&gt;
Generally, a Data Engineer makes data accessible so that organizations can use it to evaluate and optimize their performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Engineering vs Data Science
&lt;/h2&gt;

&lt;p&gt;Data Engineering focuses on building infrastructure and architecture for data generation, while Data Science focuses on advanced mathematics and statistical analysis of the generated data. It is not a requirement for a data engineer to have advanced math or statistics skills, unlike a data scientist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills that a Data Engineer should have?
&lt;/h2&gt;

&lt;p&gt;Listed below are some of the skills that a data engineer should have.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Programming&lt;/strong&gt;: Python, Java or Scala.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripting and Automation&lt;/strong&gt;: Shell, Cron&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt;: SQL, NoSQL, Data Modeling and Map Reduce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Analysis&lt;/strong&gt;: Pandas, Numpy, Web Scraping, Data Visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Processing Techniques&lt;/strong&gt;: Batch Processing, Stream Processing, Build Data Pipelines, Target Databases, Machine learning Algorithms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big Data&lt;/strong&gt;: HDFS, Hadoop Yarn, Sqoop Hadoop, Hadoop Yarn, Hive, Pig, Hbase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflows and Scheduling&lt;/strong&gt;: Airflow, Jenkins, Autosys, Java Spring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Computing&lt;/strong&gt;: Amazon Web Services (AWS), Google Cloud Platform, Microsoft Azure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt;: Docker, Kubernetes, Terraform&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;N.B&lt;/strong&gt;: This is not a comprehensive list of skills, nor does it mean that you should master everything listed here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The average salary for a Data Engineer
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://www.payscale.com/research/US/Job=Data_Engineer/Salary"&gt;Payscale&lt;/a&gt;, the average salary for a Data Engineer is $93,654 per year. However, salaries depend on various variables such as the type of role, skills, experience, and location.&lt;/p&gt;

</description>
      <category>newbie</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Improve Python Code Quality With Pylint</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Tue, 26 Jul 2022 18:30:07 +0000</pubDate>
      <link>https://dev.to/immah/improve-python-code-quality-with-pylint-3ebl</link>
      <guid>https://dev.to/immah/improve-python-code-quality-with-pylint-3ebl</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In this article, we shall look at Pylint and how it's used to ensure that your python code conforms to PEP8 guidelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is PEP8?
&lt;/h3&gt;

&lt;p&gt;PEP8 is a document that provides guidelines and best practices on how to write python code, thus making the code readable and consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What is Pylint&lt;/li&gt;
&lt;li&gt;Install Pylint&lt;/li&gt;
&lt;li&gt;Create a simple quiz app&lt;/li&gt;
&lt;li&gt;Run Pylint on our Quiz app&lt;/li&gt;
&lt;li&gt;Make recommended changes.&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What is Pylint
&lt;/h3&gt;

&lt;p&gt;Pylint is a python tool that checks for errors and tries to enforce a coding standard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Pylint
&lt;/h3&gt;

&lt;p&gt;Install Pylint via terminal &lt;code&gt;pip install pylint&lt;/code&gt; or &lt;code&gt;pip3 install pylint&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a simple quiz app
&lt;/h3&gt;

&lt;p&gt;Build a simple python quiz app which will include five quizzes from the renowned show "The Big Bang Theory", then run Pylint on it and make the recommended changes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Procedure:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Make a directory of the project. I named mine quiz_app.
Run &lt;code&gt;mkdir quiz_app&lt;/code&gt; in your terminal&lt;/li&gt;
&lt;li&gt;Change into your quiz_app directory.
Run &lt;code&gt;cd quiz_app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You can create the file at this point.
Run&lt;code&gt;touch app.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open Vs Code
&lt;code&gt;Code .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open the created file and input the code below. Alternatively, you can copy the code directly from this &lt;strong&gt;&lt;a href="https://github.com/emmanuelkaringi/quiz_app"&gt;repository&lt;/a&gt;&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import random
from string import ascii_lowercase
NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
    "How old was Sheldon when he got his first P.h.d?": [
        "16",
        "18",
        "20",
        "22",
    ],
    "What’s Amy’s job": [
        "Neurobiologist",
        "Marine biologist",
        "Forensic biologist",
        "Microbiologist",
    ],
    "Which couple gets married first?": [
        "Bernadette and Howard",
        "Penny and Leonard",
        "Amy and Sheldon",
        "Emily and raj",
    ],
    "What is Leonard primary health concern?": [
        "He is lactose intolerant",
        "He is allergic to peanuts",
        "He has to eat gluten free",
        "He has diabetes",
    ],
    "Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
        "Elon Musk",
        "Jeff Bezos",
        "Bill Gates",
        "Steve Jobs",
    ]
}

num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)

num_correct = 0
for num, (question, alternatives) in enumerate(questions, start=1):
    print(f"\nQuestion {num}:")
    print(f"{question}?")
    correct_answer = alternatives[0]
    labeled_alternatives = dict(
        zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
    )
    for label, alternative in labeled_alternatives.items():
        print(f"  {label}) {alternative}")

    while (answer_label := input("\nChoice? ")) not in labeled_alternatives:
        print(f"Please answer one of {', '.join(labeled_alternatives)}")

    answer = labeled_alternatives[answer_label]
    if answer == correct_answer:
        num_correct += 1
        print("⭐ Correct! ⭐")
    else:
        print(f"The answer is {correct_answer!r}, not {answer!r}")

print(f"\nYou got {num_correct} correct out of {num} questions")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run Pylit on our quiz_app
&lt;/h3&gt;

&lt;p&gt;Now, run pylint on the above code. If you are using Vs Code, launch bash and run &lt;code&gt;pylint app.py&lt;/code&gt;. You have to specify the python file after pylint.&lt;br&gt;
Alternatively, you can run pylint on your terminal by changing into your quiz_app directory and run &lt;code&gt;pylint app.py&lt;/code&gt;.&lt;br&gt;
After running pylint, the command window will display the Pylint results. The result is as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;************* Module app
app.py:62:0: C0304: Final newline missing (missing-final-newline)
app.py:1:0: C0114: Missing module docstring (missing-module-docstring)
app.py:41:0: C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name)
app.py:62:48: W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable)

------------------------------------------------------------------
Your code has been rated at 8.18/10  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that &lt;strong&gt;app.py:62:0&lt;/strong&gt;, indicates what line is affected while &lt;strong&gt;C0304:&lt;/strong&gt;, is a message code. In this case, the first line refers to a coding standard violation in line 62, column 0.&lt;br&gt;
There are other message codes that you can get apart from the above shown. Below is a list of prefixes and their meanings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[R] Refactor for a "good practice" metric violation&lt;/li&gt;
&lt;li&gt;[C] Convention for coding standard violation&lt;/li&gt;
&lt;li&gt;[W] Warning for stylistic problems, or minor programming issues&lt;/li&gt;
&lt;li&gt;[E] Error for important programming issues (i.e. most probably bug)&lt;/li&gt;
&lt;li&gt;[F] Fatal for errors which prevented further processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of the result shown, there is a grading that Pylit does. This grading shows how your code conforms to PEP 8. This code received an 8.18 out of 10. Try to get it to a 10 out of 10.&lt;/p&gt;
&lt;h3&gt;
  
  
  Make Recommended changes
&lt;/h3&gt;

&lt;p&gt;Create a new file and name it &lt;code&gt;app_modified.py&lt;/code&gt;. Copy the code from &lt;code&gt;app.py&lt;/code&gt;,which will be used to make the recommended changes.&lt;br&gt;
Start with &lt;code&gt;C0103: Constant name "num_correct" doesn't conform to UPPER_CASE naming style (invalid-name)&lt;/code&gt; As you can see, pylint lets us know that we have to change &lt;code&gt;num_correct&lt;/code&gt; to uppercase. Find and replace &lt;code&gt;num_correct&lt;/code&gt; to &lt;code&gt;NUM_CORRECT&lt;/code&gt; used in three instances.&lt;br&gt;
&lt;strong&gt;Running Pylint at this point gives us a score of 8.64 out of 10.&lt;/strong&gt;&lt;br&gt;
For &lt;code&gt;C0114: Missing module docstring (missing-module-docstring)&lt;/code&gt;. A &lt;strong&gt;docstring&lt;/strong&gt; is a short description of what your code does, and it may include specifics on aspects of the code. It mainly occurs as the first statement in a module, function, class, or method definition.&lt;br&gt;
We will add &lt;code&gt;"""A quiz app based on the show: The Big Bang Theory"""&lt;/code&gt; at the start of our program.&lt;br&gt;
For &lt;code&gt;C0304: Final newline missing (missing-final-newline)&lt;/code&gt;, we will add an empty line at the end of our program.&lt;br&gt;
We can ignore &lt;code&gt;W0631: Using possibly undefined loop variable 'num' (undefined-loop-variable)&lt;/code&gt;. Since changing it will affect how our program runs.&lt;br&gt;
&lt;strong&gt;Running Pylint at this point gives us a score of 9.55 out of 10.&lt;/strong&gt;&lt;br&gt;
Your final code will be similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"""A quiz app based on the show: The Big Bang Theory"""
import random
from string import ascii_lowercase

NUM_QUESTIONS_PER_QUIZ = 5
QUESTIONS = {
    "How old was Sheldon when he got his first P.h.d?": [
        "16",
        "18",
        "20",
        "22",
    ],
    "What’s Amy’s job": [
        "Neurobiologist",
        "Marine biologist",
        "Forensic biologist",
        "Microbiologist",
    ],
    "Which couple gets married first?": [
        "Bernadette and Howard",
        "Penny and Leonard",
        "Amy and Sheldon",
        "Emily and raj",
    ],
    "What is Leonard primary health concern?": [
        "He is lactose intolerant",
        "He is allergic to peanuts",
        "He has to eat gluten free",
        "He has diabetes",
    ],
    "Who does Howard meet while serving Thanksgiving dinner at a shelter?": [
        "Elon Musk",
        "Jeff Bezos",
        "Bill Gates",
        "Steve Jobs",
    ]
}

num_questions = min(NUM_QUESTIONS_PER_QUIZ, len(QUESTIONS))
questions = random.sample(list(QUESTIONS.items()), k=num_questions)

NUM_CORRECT = 0
for num, (question, alternatives) in enumerate(questions, start=1):
    print(f"\nQuestion {num}:")
    print(f"{question}?")
    correct_answer = alternatives[0]
    labeled_alternatives = dict(
        zip(ascii_lowercase, random.sample(alternatives, k=len(alternatives)))
    )
    for label, alternative in labeled_alternatives.items():
        print(f"  {label}) {alternative}")

    while (answer_label := input("\nChoice? ")) not in labeled_alternatives:
        print(f"Please answer one of {', '.join(labeled_alternatives)}")

    answer = labeled_alternatives[answer_label]
    if answer == correct_answer:
        NUM_CORRECT += 1
        print("⭐ Correct! ⭐")
    else:
        print(f"The answer is {correct_answer!r}, not {answer!r}")

print(f"\nYou got {NUM_CORRECT} correct out of {num} questions")

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;There are a number of tools used to improve your python code quality, Pylint is one of them. You can read more about improving your code quality &lt;a href="https://realpython.com/python-code-quality/#how-to-improve-python-code-quality"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>pep8</category>
      <category>pylint</category>
      <category>codequality</category>
    </item>
    <item>
      <title>PYTHON 101: ULTIMATE PYTHON GUIDE</title>
      <dc:creator>Emmanuel Kariithi</dc:creator>
      <pubDate>Sun, 13 Feb 2022 13:52:04 +0000</pubDate>
      <link>https://dev.to/immah/python-101-ultimate-python-guide-1jjf</link>
      <guid>https://dev.to/immah/python-101-ultimate-python-guide-1jjf</guid>
      <description>&lt;p&gt;Have there been instances where you were hanging out with your tech buddies, as we like to call them, ‘tech bros’ they start talking about python this and python that? You are just there wondering why are people who don't specialize in veterinary services talking about a snake? Did you feel out of place? (This intro feels like I am trying to market something. I will stop there).&lt;/p&gt;

&lt;p&gt;The purpose of this article is to guide you (in a technical and yet not so technical way) on how to install, configure, write your first python program and run it. We first have to understand what Python is. No, not the snake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Python is a high-level programming language released in 1991 created by &lt;strong&gt;Guido van Rossum&lt;/strong&gt;. Python has a relatively simple syntax compared to other programming languages e.g. C++ and has countless use cases. Here are a few of them;&lt;br&gt;
    1. Artificial Intelligence&lt;br&gt;
    2. Desktop Application&lt;br&gt;
    3. Automation&lt;br&gt;
    4. Web Development&lt;br&gt;
    5. Data Wrangling, Exploration And Visualization.&lt;/p&gt;

&lt;p&gt;Python has a couple of features, including but not limited to;&lt;br&gt;
    1. It is simple to write and run.&lt;br&gt;
    2. It is open source&lt;br&gt;
    3. It is Portable.&lt;br&gt;
    4. It is embeddable &amp;amp; extensible.&lt;br&gt;
    5. It has a huge collection of libraries.&lt;br&gt;
    6. It is object-oriented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up your Python Environment
&lt;/h2&gt;

&lt;p&gt;The installation process is pretty simple. I'll guide you through the installation process for those using Ubuntu. I will leave some links to guides on how to install on Windows and Macs.&lt;br&gt;
    1. Head over to the python website download page.&lt;br&gt;
    2. Here’s the link: &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2Fjzj69xqa0smzteux9xrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjzj69xqa0smzteux9xrg.png" alt="Python Download Page"&gt;&lt;/a&gt;&lt;br&gt;
    3. Select the release you want.&lt;br&gt;
    4. You can either choose to download the latest version (3.10.2) or scroll down and choose an older version. I chose version 3.8 for this installation.&lt;br&gt;
    5. Install Python&lt;br&gt;
You can either use the downloaded file to install Python or use the terminal. I prefer using the terminal since it is easier.&lt;/p&gt;

&lt;p&gt;Below is a step by step guide for installing Python using the terminal.&lt;br&gt;
    1. Run &lt;em&gt;Sudo apt install python3&lt;/em&gt;. Follow the instructions given (Input password and type Y to continue).&lt;br&gt;
&lt;a href="https://media.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%2Fzqe7d104lsk9xw3cesat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzqe7d104lsk9xw3cesat.png" alt="Install Python3"&gt;&lt;/a&gt;&lt;br&gt;
    2. Run &lt;em&gt;Sudo apt install python3-pip&lt;/em&gt; (Follow the instructions given on the terminal).&lt;br&gt;
&lt;a href="https://media.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%2Fl5idybw74gxfj6vapfza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fl5idybw74gxfj6vapfza.png" alt="Install Pip3"&gt;&lt;/a&gt;&lt;br&gt;
    3. Run &lt;em&gt;pip3&lt;/em&gt; or &lt;em&gt;python3 --version&lt;/em&gt; to confirm that the installation was successful.&lt;br&gt;
&lt;a href="https://media.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%2Fth3xzas9b9r2peza3nco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fth3xzas9b9r2peza3nco.png" alt="Confirm Pip Installation"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.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%2F2im2h824x5u5bjyf99ke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2im2h824x5u5bjyf99ke.png" alt="Confirm Python Installation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Done. See how easy it is?&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=UvcQlPZ8ecA" rel="noopener noreferrer"&gt;Windows Installation&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=M323OL6K5vs" rel="noopener noreferrer"&gt;Mac Installation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Write your first Program
&lt;/h2&gt;

&lt;p&gt;I bet you feel like a real programmer now? Me too, I think it's time to start applying to those freelancing gigs on &lt;a href="https://www.upwork.com/ab/jobs/search/?q=python&amp;amp;sort=recency" rel="noopener noreferrer"&gt;Upwork&lt;/a&gt;? Not so fast.&lt;/p&gt;

&lt;p&gt;Let us write our first program, the usual ‘Hello World program’. We are going to use visual studio code. You can also use the normal notepad.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open visual studio code and open a new text file.
&lt;img src="https://media.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%2Fmr91zey5wz41h0nvpyx9.png" alt="Open VS Code"&gt;
&lt;/li&gt;
&lt;li&gt;There are two ways in this step, you can either click on ‘select a language’ if you are using visual studio or directly save the file and edit the .txt extension to .py.
&lt;img src="https://media.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%2F6fg1hcurjeu24ho5y33e.png" alt="Save File"&gt;
&lt;/li&gt;
&lt;li&gt;Now we are finally here, the best part about programming, writing the code. Your first line of code (if you are a total beginner, give yourself a clap).
As stated earlier, python has a pretty simple syntax, however, we will only write one line of code to display hello world. Unlike languages like C++ which requires multiple lines to display this simple greeting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the opened file, type &lt;em&gt;print("Hello World")&lt;/em&gt; or &lt;em&gt;print('Hello World')&lt;/em&gt;. Then click F5 for those working on visual studio.&lt;br&gt;
Python does not care if you use the single quotes or double quotes, unless what you want to display has quotes in it e.g. &lt;em&gt;print("It's finally happening, I'm writing my first technical article")&lt;/em&gt;.&lt;br&gt;
&lt;a href="https://media.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%2Feqatmpjbjj93pqpqgyr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Feqatmpjbjj93pqpqgyr3.png" alt="Python Hello World"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, you can ask the user of your program to input certain details by using the input function and later print what the user inputs.&lt;br&gt;
&lt;em&gt;print(input("What’s your name? "))&lt;/em&gt;.&lt;br&gt;
&lt;a href="https://media.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%2Fzbjr2cqcpsnrvbrx3fif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fzbjr2cqcpsnrvbrx3fif.png" alt="Python Input"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it for today. I hope this article has helped you in one way or the other. Feel free to leave feedback on what to improve on. I hope to write more on my programming journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=_uQrJ0TkZlc" rel="noopener noreferrer"&gt;Python Youtube Course&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>codenewbie</category>
      <category>100daysofcode</category>
    </item>
  </channel>
</rss>
