<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Emmanuel Omoiya</title>
    <description>The latest articles on Forem by Emmanuel Omoiya (@emmanuelomoiya).</description>
    <link>https://forem.com/emmanuelomoiya</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%2F935506%2F0d05f4b2-c24c-45a5-97c0-92cfa7d9f18d.jpg</url>
      <title>Forem: Emmanuel Omoiya</title>
      <link>https://forem.com/emmanuelomoiya</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/emmanuelomoiya"/>
    <language>en</language>
    <item>
      <title>Setting Up NGINX on Ubuntu: DevOps Stage 0</title>
      <dc:creator>Emmanuel Omoiya</dc:creator>
      <pubDate>Fri, 31 Jan 2025 22:34:54 +0000</pubDate>
      <link>https://forem.com/emmanuelomoiya/setting-up-nginx-on-ubuntu-devops-stage-0-210i</link>
      <guid>https://forem.com/emmanuelomoiya/setting-up-nginx-on-ubuntu-devops-stage-0-210i</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As part of my DevOps internship journey, I was tasked with setting up and configuring &lt;strong&gt;NGINX&lt;/strong&gt; on a fresh &lt;strong&gt;Ubuntu server&lt;/strong&gt;. This task aimed to evaluate my ability to work with web server configurations and ensure I could deliver a functional web server. The final goal was to serve a custom HTML page displaying the message:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Welcome to DevOps Stage 0 - Emmanuel Omoiya / Emmanuel Omoiya"&lt;/em&gt;  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This blog post documents my approach, challenges faced, and key learnings from completing this task.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Setting Up the Ubuntu Server
&lt;/h2&gt;

&lt;p&gt;To begin, I set up an &lt;strong&gt;Ubuntu&lt;/strong&gt; server on my preferred cloud platform. I used &lt;strong&gt;AWS EC2&lt;/strong&gt;, but other options like &lt;strong&gt;Google Cloud&lt;/strong&gt; or &lt;strong&gt;DigitalOcean&lt;/strong&gt; could also be used. After launching the instance, I connected via SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh ubuntu@&amp;lt;your-server-ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Ensure your security group allows inbound traffic on &lt;strong&gt;port 80&lt;/strong&gt; to make the NGINX server accessible publicly.  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2: Installing NGINX
&lt;/h2&gt;

&lt;p&gt;Installing NGINX on Ubuntu was straightforward using the package manager:&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;sudo &lt;/span&gt;apt update  
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, I verified that &lt;strong&gt;NGINX was running&lt;/strong&gt; with:&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;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If not running, I started the service:&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;sudo &lt;/span&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And enabled it to start on boot:&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;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage, visiting &lt;code&gt;http://&amp;lt;your-server-ip&amp;gt;/&lt;/code&gt; in a browser should display the default &lt;strong&gt;NGINX Welcome Page&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Configuring the Custom HTML Page
&lt;/h2&gt;

&lt;p&gt;Next, I created a simple HTML file to serve as the default page:&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;sudo &lt;/span&gt;nano /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I replaced its content with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;DevOps Stage 0&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Welcome to DevOps Stage 0 - Emmanuel Omoiya / Emmanuel Omoiya&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving the file, I restarted NGINX to apply the changes:&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;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, visiting &lt;code&gt;http://&amp;lt;your-server-ip&amp;gt;/&lt;/code&gt; displayed the custom message.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Verifying the Setup
&lt;/h2&gt;

&lt;p&gt;To confirm everything was working correctly, I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected output should display the HTML content of my page. Additionally, I tested my server from a browser using the public IP address.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges Faced and Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ &lt;strong&gt;NGINX Not Starting Due to Conflicts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At first, NGINX failed to start due to a &lt;strong&gt;port conflict&lt;/strong&gt;. Running:&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;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;showed that another process was using port &lt;strong&gt;80&lt;/strong&gt;. I resolved this by stopping the conflicting process:&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;sudo &lt;/span&gt;systemctl stop apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ &lt;strong&gt;Permission Issues While Editing HTML Files&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When trying to edit &lt;code&gt;/var/www/html/index.html&lt;/code&gt;, I encountered permission errors. Granting necessary access fixed this:&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;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;This task reinforced several important DevOps concepts:  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Server Setup &amp;amp; Configuration&lt;/strong&gt; – I gained hands-on experience installing and configuring &lt;strong&gt;NGINX&lt;/strong&gt; on a cloud-based Ubuntu server.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Web Server Basics&lt;/strong&gt; – Understanding how NGINX serves static content and how to customize the default page was invaluable.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Troubleshooting Skills&lt;/strong&gt; – Debugging issues like port conflicts and permission errors improved my problem-solving skills.  &lt;/p&gt;

&lt;p&gt;This foundational knowledge will be crucial as I advance in my DevOps journey, especially in &lt;strong&gt;Site Reliability Engineering&lt;/strong&gt; and &lt;strong&gt;Cloud Engineering&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Completing this task gave me a deeper understanding of &lt;strong&gt;NGINX&lt;/strong&gt;, a core component in web infrastructure. It also prepared me for more advanced topics like &lt;strong&gt;reverse proxying, load balancing, and SSL configurations&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;For those interested in &lt;strong&gt;DevOps roles&lt;/strong&gt;, check out:&lt;br&gt;&lt;br&gt;
🔹 &lt;a href="https://hng.tech/hire/site-reliability-engineers" rel="noopener noreferrer"&gt;Site Reliability Engineers&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;Cloud Engineers&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Would love to hear about your experience with NGINX! Drop a comment below. 🚀&lt;/p&gt;

</description>
      <category>devops</category>
      <category>hng</category>
      <category>hngi12</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>User and Group Management in Linux</title>
      <dc:creator>Emmanuel Omoiya</dc:creator>
      <pubDate>Thu, 04 Jul 2024 09:16:02 +0000</pubDate>
      <link>https://forem.com/emmanuelomoiya/user-and-group-management-in-linux-3jdm</link>
      <guid>https://forem.com/emmanuelomoiya/user-and-group-management-in-linux-3jdm</guid>
      <description>&lt;p&gt;In recent times where organizations and companies hold secrets of the biggest magnitude e.g. proprietary secrets, trademark secrets e.t.c. and store them on the main company network (server), adding employees to that network or server has to be done with high accuracy and precision by assigning the employee to the appropriate groups according to his/her job title in order to protect this secret of the company and to make sure no one has access to such information except certain people like, the C.E.O, C.T.O, C.M.O. e.t.c.&lt;/p&gt;

&lt;p&gt;Today, we're going to look into such phenomenon taking Linux (Ubuntu distro) as our case study environment.&lt;/p&gt;

&lt;p&gt;How are we going to implement this you may ask?&lt;/p&gt;

&lt;p&gt;Well, we're going to create a bash script that takes the path to a .txt file as our input file which contains the names of employees and the groups you wish to place them in.&lt;/p&gt;

&lt;p&gt;For example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alice; developers, foodies
bob; testers; admins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This .txt file contains lines in the format of &lt;code&gt;user;groups delimited by a comma"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Before going into the code, we must first know and understand what we want our code to do explicitly&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read users in format &lt;code&gt;user; groups&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create users and groups as specified&lt;/li&gt;
&lt;li&gt;setup home directories with appropriate permissions and ownership&lt;/li&gt;
&lt;li&gt;generate random passwords for the users&lt;/li&gt;
&lt;li&gt;store the generated passwords securely in &lt;code&gt;/var/secure/user_passwords.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;log all actions to &lt;code&gt;/var/log/user_management.log&lt;/code&gt;
Note: handle error scenarios like existing users&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preparatory steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a file named &lt;code&gt;create_users.sh&lt;/code&gt; in your home directory on linux
&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="nb"&gt;touch &lt;/span&gt;create_users.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Open this file with nano editor to add your code
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano create_users.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's follow through with how we want our script to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1
&lt;/h3&gt;

&lt;p&gt;Define the following paths in which you want to save your logs and users password&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;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;
  
  
  Step 2
&lt;/h3&gt;

&lt;p&gt;Ensure the directory exists and has the 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="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"/var/secure"&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/secure
    &lt;span class="nb"&gt;chmod &lt;/span&gt;700 /var/secure
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3
&lt;/h3&gt;

&lt;p&gt;Ensure the log file and password file exist and are writable&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;touch&lt;/span&gt; &lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt; &lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$PASSWORD_FILE&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 &lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4
&lt;/h3&gt;

&lt;p&gt;Add the function to log all user actions and include a timestamp to each respective action&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;log&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="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;&lt;span class="si"&gt;)&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;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5
&lt;/h3&gt;

&lt;p&gt;Check if the script is run as root&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="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EUID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 0 &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;log &lt;span class="s2"&gt;"Script must be run as root."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Please run as root."&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;
  
  
  Step 6
&lt;/h3&gt;

&lt;p&gt;Check if the input file is provided and readable&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="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&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;log &lt;span class="s2"&gt;"Input file not provided or does not exist."&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;input_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;
  
  
  Step 7
&lt;/h3&gt;

&lt;p&gt;Add the function to generate user passwords&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;
    &amp;lt; /dev/urandom &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-dc&lt;/span&gt; &lt;span class="s1"&gt;'A-Za-z0-9!@#$%^&amp;amp;*()_+'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 8
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8
&lt;/h3&gt;

&lt;p&gt;Read the input file line by line&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; user &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;span class="nv"&gt;user&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;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | xargs&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# Trim whitespace&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;span class="c"&gt;# Trim whitespace&lt;/span&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;$user&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;log &lt;span class="s2"&gt;"User &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt; already exists."&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;$user&lt;/span&gt;&lt;span class="s2"&gt; already exists. Skipping."&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;&lt;em&gt;Add the following codes to the while do block&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9
&lt;/h3&gt;

&lt;p&gt;Create groups if they do not exist and collect them in a list&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; group_list &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="nv"&gt;group_string&lt;/span&gt;&lt;span class="o"&gt;=&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;group_list&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="c"&gt;# Trim whitespace&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
            &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;
            log &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="k"&gt;else
            &lt;/span&gt;log &lt;span class="s2"&gt;"Group &lt;/span&gt;&lt;span class="nv"&gt;$group&lt;/span&gt;&lt;span class="s2"&gt; already exists."&lt;/span&gt;
        &lt;span class="k"&gt;fi
        &lt;/span&gt;group_string+&lt;span class="o"&gt;=&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="k"&gt;done
    &lt;/span&gt;&lt;span class="nv"&gt;group_string&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;group_string&lt;/span&gt;&lt;span class="p"&gt;%,&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="c"&gt;# Remove trailing comma&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 10
&lt;/h3&gt;

&lt;p&gt;Create user and assign to groups&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;$group_string&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &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;log &lt;span class="s2"&gt;"User &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt; created and added to groups &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;else
        &lt;/span&gt;log &lt;span class="s2"&gt;"Failed to create user &lt;/span&gt;&lt;span class="nv"&gt;$user&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;"Failed to create user &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;. Check log for details."&lt;/span&gt;
        &lt;span class="k"&gt;continue
    fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 11
&lt;/h3&gt;

&lt;p&gt;Generate and assign a password&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;$user&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
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &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;log &lt;span class="s2"&gt;"Password set for user &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;log &lt;span class="s2"&gt;"Failed to set password for user &lt;/span&gt;&lt;span class="nv"&gt;$user&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;"Failed to set password for user &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;. Check logs for details."&lt;/span&gt;
        &lt;span class="k"&gt;continue
    fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 12
&lt;/h3&gt;

&lt;p&gt;Store the password securely&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;"&lt;/span&gt;&lt;span class="nv"&gt;$user&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="nv"&gt;$PASSWORD_FILE&lt;/span&gt;
    log &lt;span class="s2"&gt;"Password for user &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt; stored securely."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 13
&lt;/h3&gt;

&lt;p&gt;Set ownership and permissions for 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;chown&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$user&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;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&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;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    log &lt;span class="s2"&gt;"Home directory for user &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt; set up with appropriate permissions."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Last Step
&lt;/h3&gt;

&lt;p&gt;Close the while do block and log the end&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;done&lt;/span&gt; &amp;lt; &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;

log &lt;span class="s2"&gt;"Users - groups creation process completed."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User creation process completed. Check &lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt; for details."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this code you can be sure to add your respective employees to the appropriate Groups and add permissions, in order for your organization top secret information doesn't get into the wrong hands 😊.&lt;/p&gt;

&lt;p&gt;Thanks for following me through with this article.&lt;/p&gt;

&lt;p&gt;A big shout out to &lt;a href="https://hng.tech"&gt;HNG&lt;/a&gt;, &lt;a href="https://hng.tech/internship"&gt;HNG Internship&lt;/a&gt;, &lt;a href="https://hng.tech/hire"&gt;HNG Hiring&lt;/a&gt; for inspiring this article.&lt;/p&gt;

&lt;p&gt;Reach out to me on &lt;a href="https://www.linkedin.com/in/emmanuelomoiya"&gt;Linkedin&lt;/a&gt; or &lt;a href="https://x.com/Emmanuel_Omoiya"&gt;X(Twitter)&lt;/a&gt; if you want to have a nice chat about anything and I mean absolutely anything.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>programming</category>
    </item>
    <item>
      <title>Challenge with RBAC Authentication</title>
      <dc:creator>Emmanuel Omoiya</dc:creator>
      <pubDate>Tue, 02 Jul 2024 09:29:06 +0000</pubDate>
      <link>https://forem.com/emmanuelomoiya/challenge-with-rbac-authentication-329h</link>
      <guid>https://forem.com/emmanuelomoiya/challenge-with-rbac-authentication-329h</guid>
      <description>&lt;p&gt;Building great and memorable experiences for any software requires a lot of things and one of those things is for your user to feel safe and "actually" be safe and secure...&lt;br&gt;
The last thing any engineer would hope for is to wake up in the early hours of the morning and notice that the software has been down for close to 3hours and all the data in the database is gone due to a cyber-attack 😭.&lt;/p&gt;

&lt;p&gt;I am an engineer that places the security of my user's data above anything else.&lt;br&gt;
Therefore, I would not want a user to access the information of another user through some loop-hole found in the security system of my software.&lt;/p&gt;

&lt;p&gt;I have built a lot of software ranging from websites to webservers, microservices, mobile applications, OS kernels and database ORM...&lt;/p&gt;

&lt;p&gt;The most painful security experience I have had is with a web server RBAC (Role based access control) authentication feature, as much as it is simple, it can become complex very quickly.&lt;/p&gt;

&lt;p&gt;That concept is a "pain in the ass", no cap 🧢...&lt;/p&gt;

&lt;p&gt;Having to choose between either using cookies or sessions or even localStorage...&lt;br&gt;
Having to be changing environments to test them out individually 😤...&lt;/p&gt;




&lt;p&gt;We'll stop here for today... Follow me for the next part of this article&lt;/p&gt;

&lt;p&gt;A big shout out to &lt;a href="https://hng.tech"&gt;HNG&lt;/a&gt;, &lt;a href="https://hng.tech/internship"&gt;HNG Internship&lt;/a&gt;, &lt;a href="https://hng.tech/hire"&gt;HNG Hiring&lt;/a&gt; for inspiring this article.&lt;/p&gt;

&lt;p&gt;Reach out to me on &lt;a href="https://www.linkedin.com/in/emmanuelomoiya"&gt;Linkedin&lt;/a&gt; or &lt;a href="https://x.com/Emmanuel_Omoiya"&gt;X(Twitter)&lt;/a&gt; if you want to have a nice chat about anything and I mean absolutely anything.&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>backend</category>
      <category>api</category>
    </item>
    <item>
      <title>Understanding Mobile Development</title>
      <dc:creator>Emmanuel Omoiya</dc:creator>
      <pubDate>Tue, 02 Jul 2024 08:14:20 +0000</pubDate>
      <link>https://forem.com/emmanuelomoiya/understanding-mobile-development-o76</link>
      <guid>https://forem.com/emmanuelomoiya/understanding-mobile-development-o76</guid>
      <description>&lt;p&gt;Developing a mobile application isn't just about writing codes in either swift or flutter or react-native, NO...&lt;br&gt;
It's about understanding the requirements of the software you want to build i.e. how it should work, your target audience, your proposed user-base quantity e.g. (2,000 users in 2 weeks) and its impact on the software ecosystem at large.&lt;/p&gt;

&lt;p&gt;In order for you to fulfill the afore-mentioned requirements, you must understand the common architectural patterns of building &lt;em&gt;Good&lt;/em&gt; Software and the platforms of delivering this software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common software Architectural pattens
&lt;/h2&gt;

&lt;p&gt;Let's begin with the common software architectural patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Model-View-Controller (MVC)
&lt;/h3&gt;

&lt;p&gt;Think of MVC as splitting your software into three parts which in this case would be our mobile application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt;: This is basically the brains and brawns of your software. It handles your business logic and data. Without this guy, your software is basically a user interface with no function, just for sight seeing &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;: This is the user interface (what users see), I'm sure you know what will happen if this little but serious guy isn't available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt;: This guy is as the waiter in a restaurant that takes orders from you and sends the requests to the chef, and once your order is ready, the waiter brings it to you, it manages input and update the model and view (the go-between)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Model-View-ViewModel (MVVM)
&lt;/h3&gt;

&lt;p&gt;MVVM is like MVC with an extra twist. It adds a ViewModel, which acts as a middleman between the Model and View (I'm sure you're wondering, what's the difference, isn't it the same as MVC, don't worry, I'll explain)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: Like the MVC this guy manages the data and business logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt;: This guys as well manages the user interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ViewModel&lt;/strong&gt;: But this guy, it's like a combination of view and model, to streamline the relationship between your data and your user interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Model-View-Presenter (MVP)
&lt;/h3&gt;

&lt;p&gt;MVP is another spin on MVCC, with the Presenter taking charge, (you might ask "what is this presenter?", take a chill man... you'll see it soon):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: Data and Business Logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt;: User interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presenter&lt;/strong&gt;: The presenter acts upon the model and the view. It retrieves data from repositories (the model), and formats it for display in the view&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Clean Architecture...
&lt;/h3&gt;




&lt;p&gt;We'll stop here for today... Follow me for the next part of this article&lt;/p&gt;

&lt;p&gt;A big shout out to &lt;a href="https://hng.tech"&gt;HNG&lt;/a&gt;, &lt;a href="https://hng.tech/internship"&gt;HNG Internship&lt;/a&gt;, &lt;a href="https://hng.tech/hire"&gt;HNG Hiring&lt;/a&gt; for inspiring this article.&lt;/p&gt;

&lt;p&gt;Reach out to me on &lt;a href="https://www.linkedin.com/in/emmanuelomoiya"&gt;Linkedin&lt;/a&gt; or &lt;a href="https://x.com/Emmanuel_Omoiya"&gt;X(Twitter)&lt;/a&gt; if you want to have a nice chat about anything and I mean absolutely anything.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
