<?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: MUHAMMED YAZEEN AN</title>
    <description>The latest articles on Forem by MUHAMMED YAZEEN AN (@messenger1012).</description>
    <link>https://forem.com/messenger1012</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%2F368522%2Fde1dc3dd-b520-4b7d-abd8-a7e8d7e18bfd.jpg</url>
      <title>Forem: MUHAMMED YAZEEN AN</title>
      <link>https://forem.com/messenger1012</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/messenger1012"/>
    <language>en</language>
    <item>
      <title>🚦 Automate Testing, linting and other tasks Before Every Commit: Complete Pre-Commit Setup Guide</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Mon, 09 Jun 2025 13:29:57 +0000</pubDate>
      <link>https://forem.com/messenger1012/keep-your-code-clean-with-husky-step-by-step-guide-1c55</link>
      <guid>https://forem.com/messenger1012/keep-your-code-clean-with-husky-step-by-step-guide-1c55</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58yw8t839pd7yjx3h1w3.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%2F58yw8t839pd7yjx3h1w3.png" alt="Title" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey devs! 👋 Ever committed code and realized later you forgot to run your linter or formatter? 😅 Let's fix that! Husky 🐶 can automate these checks for you, so your codebase stays clean and consistent—without you even thinking about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧐 What is Husky (and Git Hooks)?
&lt;/h2&gt;

&lt;p&gt;Husky is a tool that lets you run scripts automatically before you commit or push code. Think of it as a helpful guard dog that barks if something's off before your code gets into the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git Hooks Explained:&lt;/strong&gt; Git hooks are scripts that Git executes before or after events such as commit, push, and receive. They're a built-in feature of Git that allows you to customize Git's internal behavior and trigger custom actions at critical points in the development lifecycle. Husky makes it easier to manage these hooks.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Use Cases for Husky
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistent Code Style Across Teams:&lt;/strong&gt; Enforce Prettier or your favorite formatter to maintain a uniform code style, regardless of who's contributing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prevent Errors in Production:&lt;/strong&gt; Automatically lint code to catch issues before they make it to the main branch, reducing the risk of bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Readable and Maintainable Commit History:&lt;/strong&gt; Enforce commit message rules to ensure a clear and consistent commit history, making it easier to understand changes over time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Testing:&lt;/strong&gt; Run tests before each commit to ensure that new changes don't break existing functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Checks:&lt;/strong&gt; Integrate security linters to automatically scan for vulnerabilities before code is committed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Let's Set Up Husky (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Install Husky
&lt;/h3&gt;

&lt;p&gt;Add Husky to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; husky
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Husky will help you manage Git hooks for your project.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Enable Husky Git Hooks
&lt;/h3&gt;

&lt;p&gt;Set up Husky to use Git hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm set-script prepare &lt;span class="s2"&gt;"husky install"&lt;/span&gt;
npm run prepare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm set-script prepare "husky install"&lt;/code&gt;: Adds a script to your &lt;code&gt;package.json&lt;/code&gt; called "prepare". This ensures Husky is set up every time someone installs dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run prepare&lt;/code&gt;: Runs the "prepare" script right now to set up Husky immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting:&lt;/strong&gt; If &lt;code&gt;npm run prepare&lt;/code&gt; fails, make sure you have the latest version of npm installed. Try running &lt;code&gt;npm install -g npm@latest&lt;/code&gt; and then try &lt;code&gt;npm run prepare&lt;/code&gt; again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Up Pre-commit Hook with Linting Example
&lt;/h3&gt;

&lt;p&gt;Let's create a pre-commit hook that runs linting before every commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, install ESLint:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; eslint
npx eslint &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add a lint script to your &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create the pre-commit hook:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npm run lint"&lt;/span&gt;
git add .husky/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What these commands do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npx husky add .husky/pre-commit "npm run lint"&lt;/code&gt;: Creates a file called &lt;code&gt;pre-commit&lt;/code&gt; in the &lt;code&gt;.husky&lt;/code&gt; folder that will run &lt;code&gt;npm run lint&lt;/code&gt; before every commit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git add .husky/pre-commit&lt;/code&gt;: Stages the hook file so it gets committed to your repository and shared with your team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You can add multiple commands to your pre-commit hook like this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx husky add .husky/pre-commit &lt;span class="s2"&gt;"npm run lint &amp;amp;&amp;amp; npm run format &amp;amp;&amp;amp; npm run test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Examples of scripts you can add to your &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write ."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack --mode production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type-check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc --noEmit"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, every time you commit, Husky will automatically run your linter first! If the linting fails, the commit will be blocked until you fix the issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Other Tools You Can Integrate with Husky
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Formatting:&lt;/strong&gt; Use &lt;a href="https://www.npmjs.com/package/prettier" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; to automatically format your code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit Message Linting:&lt;/strong&gt; Use &lt;a href="https://www.npmjs.com/package/@commitlint/cli" rel="noopener noreferrer"&gt;commitlint&lt;/a&gt; to enforce commit message standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Checks:&lt;/strong&gt; Use &lt;a href="https://www.npmjs.com/package/eslint-plugin-security" rel="noopener noreferrer"&gt;eslint-plugin-security&lt;/a&gt; to detect security vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Run your test suite before commits to ensure nothing breaks.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎉 That's It!
&lt;/h2&gt;

&lt;p&gt;Now, every time you commit, Husky will make sure your code is clean and follows your project's standards. No more "oops, forgot to lint!" moments. 🚫🐛&lt;/p&gt;

&lt;p&gt;Give it a try and let your codebase thank you!&lt;/p&gt;

&lt;p&gt;Questions? Drop them below! 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://typicode.github.io/husky/#/" rel="noopener noreferrer"&gt;Husky Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/githooks" rel="noopener noreferrer"&gt;Git Hooks Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint.org/docs/user-guide/getting-started" rel="noopener noreferrer"&gt;ESLint Getting Started Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prettier.io/docs/en/configuration.html" rel="noopener noreferrer"&gt;Prettier Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏷️ Tags
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;#Husky&lt;/code&gt; &lt;code&gt;#GitHooks&lt;/code&gt; &lt;code&gt;#CodeQuality&lt;/code&gt; &lt;code&gt;#Linting&lt;/code&gt; &lt;code&gt;#JavaScript&lt;/code&gt; &lt;code&gt;#Development&lt;/code&gt; &lt;code&gt;#Automation&lt;/code&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>git</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Turn Your Tablet into a Second Monitor for Ubuntu</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Thu, 27 Feb 2025 04:55:45 +0000</pubDate>
      <link>https://forem.com/messenger1012/use-your-tablet-as-an-extended-monitor-for-ubuntu-2ipb</link>
      <guid>https://forem.com/messenger1012/use-your-tablet-as-an-extended-monitor-for-ubuntu-2ipb</guid>
      <description>&lt;p&gt;This guide will show you how to set it up step-by-step using Remote Desktop Protocol (RDP). By the end, you'll have a fully functional extended display setup. Let’s get started!&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Step 1: Enable Remote Desktop on Ubuntu
&lt;/h3&gt;

&lt;p&gt;The steps to enable Remote Desktop depend on your Ubuntu version:&lt;/p&gt;

&lt;h4&gt;
  
  
  For Ubuntu version below 22:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Sharing&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Turn on the &lt;strong&gt;Sharing&lt;/strong&gt; switch.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Screen Sharing&lt;/strong&gt; and enable it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set a password for security.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  For Ubuntu version above 22:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;System &amp;gt; Remote Desktop&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%2Fxryyi0rw9ehly17yl47m.png" alt="Ubuntu settings screen" width="800" height="430"&gt;
&lt;/li&gt;
&lt;li&gt;You will see two tabs: &lt;strong&gt;Remote Login&lt;/strong&gt; and &lt;strong&gt;Desktop Sharing&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%2Fbjx2b1hk3xv47bwahveb.png" alt="Ubuntu settings screen" width="800" height="430"&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Desktop Sharing&lt;/strong&gt;, toggle &lt;strong&gt;Desktop Sharing&lt;/strong&gt; to enable it.&lt;/li&gt;
&lt;li&gt;Set or update the username and password for security.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  ⚙️ Step 2: Enable Extend Mode for Your Tablet
&lt;/h3&gt;

&lt;p&gt;By default, RDP mirrors your Ubuntu desktop to your tablet, showing the same content on both screens. To use your tablet as a true extended display, where you can have different windows and content, you need to change the screen sharing mode to "extend."&lt;/p&gt;

&lt;p&gt;Open the terminal on your Ubuntu computer and type this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gsettings &lt;span class="nb"&gt;set &lt;/span&gt;org.gnome.desktop.remote-desktop.rdp screen-share-mode extend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fclbf68ufmcnszobckhst.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%2Fclbf68ufmcnszobckhst.png" alt="Linux terminal" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command configures RDP to treat your tablet as an extended display rather than a mirrored one, allowing you to drag windows and apps to your tablet just like a second monitor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;! Important:&lt;/strong&gt; Without this setting, you would only see a copy of your main screen on your tablet, which limits the productivity benefits of having an additional display.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🔄 Step 3: Log Out and Log Back In
&lt;/h3&gt;

&lt;p&gt;After enabling Remote Desktop and running the command above, log out of your Ubuntu session and log back in. This step ensures that all the changes are applied correctly.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 Step 4: Find Your Computer's Local IP Address
&lt;/h3&gt;

&lt;p&gt;To connect your tablet, you need your computer's local IP address. The easiest way to find it is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the terminal on your Ubuntu computer.&lt;/li&gt;
&lt;li&gt;Type this command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54ufe7fxjfejwcql5v8o.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%2F54ufe7fxjfejwcql5v8o.png" alt="Terminal image" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output will show your local IP address (e.g., &lt;code&gt;192.168.x.x&lt;/code&gt;). Write it down, as you'll need it to connect your tablet.&lt;/p&gt;




&lt;h3&gt;
  
  
  📱 Step 5: Connect Your Tablet Using a Remote Desktop App
&lt;/h3&gt;

&lt;p&gt;Now that Remote Desktop is ready, you can connect your tablet. You'll need a Remote Desktop app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For Android&lt;/strong&gt;: Download the &lt;a href="https://play.google.com/store/apps/details?id=com.microsoft.rdc.androidx&amp;amp;hl=en_US&amp;amp;gl=US&amp;amp;pli=1" rel="noopener noreferrer"&gt;Windows App&lt;/a&gt; from the Google Play Store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For iPhone/iPad&lt;/strong&gt;: Download the &lt;a href="https://apps.apple.com/us/app/microsoft-remote-desktop/id714464092" rel="noopener noreferrer"&gt;Windows App&lt;/a&gt; from the App Store.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔧 Step 6: Set Up the Remote Desktop App
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the Microsoft Remote Desktop app on your tablet/iPad.&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Add PC&lt;/strong&gt; or the &lt;strong&gt;+&lt;/strong&gt; button to create a new connection.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;PC Name&lt;/strong&gt; or &lt;strong&gt;Hostname&lt;/strong&gt; field, type your computer's local IP address (the one you found earlier).&lt;/li&gt;
&lt;li&gt;When asked, enter the username and password you set in the Remote Desktop settings on Ubuntu.&lt;/li&gt;
&lt;li&gt;Save the connection and tap to connect.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🚀 Step 7: Use Your Tablet as an Extended Monitor
&lt;/h3&gt;

&lt;p&gt;Once connected, your tablet will work as an extra screen for your Ubuntu computer. You can now move windows and apps to your tablet, just like using a second monitor. This is a simple and effective way to boost your productivity!&lt;/p&gt;




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

&lt;p&gt;Using your tablet as an extended monitor for Ubuntu is a great way to maximize your productivity and make the most of your devices. Whether you're multitasking, coding, or designing, this setup can help you work more efficiently. However, there are a few things to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reconnection Issues&lt;/strong&gt;: You may encounter problems when reconnecting the screen after disconnecting. In such cases, you might need to restart the Remote Desktop session or reapply the settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slight Delay&lt;/strong&gt;: Since this setup relies on a wireless connection, there can be a slight delay in responsiveness. It’s not as performant as a wired connection, so it’s best used when you don’t have access to a physical second monitor or a wired solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite these limitations, this method is a simple and effective way to extend your screen space when you need it. &lt;/p&gt;

&lt;p&gt;:) Happy multitasking! 🚀&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>productivity</category>
      <category>linux</category>
      <category>rdp</category>
    </item>
    <item>
      <title>🚀 Host Your React App with Express.js: A Beginner's Guide</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Tue, 11 Feb 2025 10:31:39 +0000</pubDate>
      <link>https://forem.com/messenger1012/host-your-react-app-with-expressjs-a-beginners-guide-cpf</link>
      <guid>https://forem.com/messenger1012/host-your-react-app-with-expressjs-a-beginners-guide-cpf</guid>
      <description>&lt;h3&gt;
  
  
  If you're looking for a quick and easy way to host your React app or static files, Express.js is a fantastic option. In this guide, we’ll walk you through the process step-by-step, from setting up your project to running your app locally. While this method is great for testing and small-scale deployments, we’ll also highlight why it’s not ideal for production and suggest better alternatives.
&lt;/h3&gt;




&lt;h3&gt;
  
  
  🛠️ Step 1: Set Up Your Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a New Folder&lt;/strong&gt;:
Open your terminal and run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;mkdir &lt;/span&gt;express-static-server
   &lt;span class="nb"&gt;cd &lt;/span&gt;express-static-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize a Node.js Project&lt;/strong&gt;:
Inside the folder, initialize a new project:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a &lt;code&gt;package.json&lt;/code&gt; file to manage your project’s dependencies and scripts.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Step 2: Install Dependencies
&lt;/h3&gt;

&lt;p&gt;Install the required packages:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Express&lt;/strong&gt;: A lightweight framework for building web servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression&lt;/strong&gt; (Optional): Middleware to enable GZIP compression for faster file delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Compression is optional but recommended for better performance.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ⚛️ Step 3: Build Your React App
&lt;/h3&gt;

&lt;p&gt;If you have a React app, navigate to your React project directory and build it for production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate a &lt;code&gt;build/&lt;/code&gt; folder containing your app’s optimized static files.&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ Step 4: Set Up the Server
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a &lt;code&gt;server.js&lt;/code&gt; File&lt;/strong&gt;:
In your project folder, create a file named &lt;code&gt;server.js&lt;/code&gt; and add the following code:
&lt;/li&gt;
&lt;/ol&gt;

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

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="c1"&gt;// Enable GZIP compression (optional)&lt;/span&gt;
   &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

   &lt;span class="c1"&gt;// Serve static files from the React build directory&lt;/span&gt;
   &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

   &lt;span class="c1"&gt;// Handle all other routes by serving the React app's index.html&lt;/span&gt;
   &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;

   &lt;span class="c1"&gt;// Start the server&lt;/span&gt;
   &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is running on http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Move the React Build Folder&lt;/strong&gt;:
Copy the &lt;code&gt;build/&lt;/code&gt; folder from your React project into the same directory as &lt;code&gt;server.js&lt;/code&gt;. Your project structure should look like this:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   express-static-server/
   ├── build/          # Contains your React app's production build
   ├── node_modules/
   ├── package.json
   ├── package-lock.json
   └── server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Step 5: Run the Server
&lt;/h3&gt;

&lt;p&gt;Start your server by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your React app will now be hosted at &lt;code&gt;http://localhost:5000&lt;/code&gt;. Open your browser and navigate to this URL to see your app in action.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚠️ Why This Method is Not Ideal for Production
&lt;/h3&gt;

&lt;p&gt;While this setup is great for local testing or small-scale deployments, it’s &lt;strong&gt;not recommended for production&lt;/strong&gt; because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Express.js is not optimized for serving static files at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: It lacks advanced features like caching and load balancing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: It doesn’t provide built-in HTTPS or protection against malicious requests.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🌟 Recommended Alternatives for Production
&lt;/h3&gt;

&lt;p&gt;For production hosting, consider using these tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NGINX&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS S3 + CloudFront&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These platforms are optimized for hosting React apps and provide features like global CDNs, caching, and HTTPS.&lt;/p&gt;




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

&lt;p&gt;Using Express.js to host your React build is a simple and effective way to get started. It’s perfect for local testing or learning how servers work. However, for production, switch to a dedicated hosting solution for better performance and reliability.&lt;/p&gt;

&lt;p&gt;:) Happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
      <category>express</category>
    </item>
    <item>
      <title>Fixing OpenVPN Connection Issues in Ubuntu</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Wed, 01 Jan 2025 04:15:02 +0000</pubDate>
      <link>https://forem.com/messenger1012/fixing-openvpn-connection-issues-in-ubuntu-2404-56cf</link>
      <guid>https://forem.com/messenger1012/fixing-openvpn-connection-issues-in-ubuntu-2404-56cf</guid>
      <description>&lt;p&gt;If you've recently upgraded to Ubuntu 24.04 and are experiencing issues with OpenVPN connections failing silently after importing a &lt;code&gt;.ovpn&lt;/code&gt; profile, you're not alone. This is a common problem that many users have encountered. Fortunately, it can be resolved using one of two methods: editing the &lt;code&gt;.ovpn&lt;/code&gt; file directly or adjusting settings through the GUI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Edit the &lt;code&gt;.ovpn&lt;/code&gt; Profile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Import the &lt;code&gt;.ovpn&lt;/code&gt; Profile
&lt;/h3&gt;

&lt;p&gt;Start by importing the &lt;code&gt;.ovpn&lt;/code&gt; profile into Ubuntu's Network Settings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; on your Ubuntu system.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Network&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;VPN&lt;/strong&gt; section, click the &lt;strong&gt;+&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Import from file&lt;/strong&gt; and choose your &lt;code&gt;.ovpn&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once imported, try connecting to the VPN. If the connection fails silently, proceed with the following steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Edit the &lt;code&gt;.ovpn&lt;/code&gt; File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;code&gt;.ovpn&lt;/code&gt; file you imported using a text editor.&lt;/li&gt;
&lt;li&gt;Locate the line that says:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   cipher AES-256-CBC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Comment out this line by adding a &lt;code&gt;#&lt;/code&gt; at the beginning:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   #cipher AES-256-CBC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Save the file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Re-import the Edited Profile
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go back to &lt;strong&gt;Network Settings&lt;/strong&gt; and remove the existing VPN profile.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;+&lt;/strong&gt; button again and re-import the edited &lt;code&gt;.ovpn&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Reconnect to the VPN
&lt;/h3&gt;

&lt;p&gt;Try reconnecting to the VPN. The connection should now work without any issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method 2: Change Cipher Settings via GUI
&lt;/h2&gt;

&lt;p&gt;If you prefer not to edit the &lt;code&gt;.ovpn&lt;/code&gt; file directly, you can resolve the issue through the Network Settings GUI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Import the &lt;code&gt;.ovpn&lt;/code&gt; Profile
&lt;/h3&gt;

&lt;p&gt;Follow the same steps as in Method 1 to import your &lt;code&gt;.ovpn&lt;/code&gt; profile:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; and go to the &lt;strong&gt;Network&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;+&lt;/strong&gt; button under the &lt;strong&gt;VPN&lt;/strong&gt; section and select &lt;strong&gt;Import from file&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose your &lt;code&gt;.ovpn&lt;/code&gt; profile.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Open VPN Profile Settings
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;After importing, click the &lt;strong&gt;gear icon&lt;/strong&gt; next to the VPN profile to open its settings.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Navigate to Advanced Settings
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Identity&lt;/strong&gt; tab, scroll down to the &lt;strong&gt;Advanced&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Advanced Options&lt;/strong&gt; to open the advanced properties modal.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Change the Cipher
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Under the &lt;strong&gt;Security&lt;/strong&gt; section, locate the dropdown for &lt;strong&gt;Cipher&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Change the Cipher from &lt;code&gt;AES-256-CBC&lt;/code&gt; to &lt;strong&gt;Default&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Save the changes and close the modal.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Reconnect to the VPN
&lt;/h3&gt;

&lt;p&gt;After saving the changes, try reconnecting to the VPN. The connection should now work properly.&lt;/p&gt;




&lt;p&gt;I hope this helps :)&lt;/p&gt;

</description>
      <category>openvpn</category>
      <category>ubuntu</category>
      <category>vpn</category>
      <category>networking</category>
    </item>
    <item>
      <title>Exploring Zsh and Its Powerful Plugins: A Guide to Supercharge Your Terminal Experience</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Tue, 31 Oct 2023 04:52:35 +0000</pubDate>
      <link>https://forem.com/messenger1012/exploring-zsh-and-its-powerful-plugins-a-guide-to-supercharge-your-terminal-experience-1b2p</link>
      <guid>https://forem.com/messenger1012/exploring-zsh-and-its-powerful-plugins-a-guide-to-supercharge-your-terminal-experience-1b2p</guid>
      <description>&lt;p&gt;Zsh, an upgraded version of the Bourne Shell, brings several new features like automatic cd (change directory), spell correction, themes, and plugins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv7ny2gckiv41e3fkjwqu.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%2Fv7ny2gckiv41e3fkjwqu.png" alt="ZSH" width="736" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Installation:
&lt;/h3&gt;

&lt;p&gt;1) &lt;strong&gt;Installation:&lt;/strong&gt; Open your terminal and enter the following command to install Zsh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install zsh

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

&lt;/div&gt;



&lt;p&gt;2) &lt;strong&gt;Set Zsh as Your Default Shell:&lt;/strong&gt; Make Zsh your default shell using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chsh -s /bin/zsh

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

&lt;/div&gt;



&lt;p&gt;3) &lt;strong&gt;Log out first, then reopen the terminal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  .zshrc
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;.zshrc&lt;/code&gt; File: Your Personalized Shell Guidebook&lt;/p&gt;

&lt;p&gt;The .zshrc file acts as a manual for your Zsh shell, allowing you to customize your shell environment. You can create shortcuts (aliases), modify your prompt's appearance, and add extra features (plugins) through this file.&lt;/p&gt;

&lt;p&gt;zshrc is typically located in the user's home directory.&lt;/p&gt;

&lt;p&gt;1) To edit the zshrc&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gedit ~/.zshrc

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

&lt;/div&gt;



&lt;p&gt;2) To reload your shell to apply changes made in the .zshrc file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exec .zshrc

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

&lt;/div&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing Oh My Zsh:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftm1ryu6asvqrk5a6cptg.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%2Ftm1ryu6asvqrk5a6cptg.png" alt="ZSH website" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oh My Zsh&lt;/strong&gt; is a tool that makes using the Zsh shell easier and more customizable. &lt;strong&gt;It provides a collection of themes, plugins, and functions&lt;/strong&gt; that enhance your command-line experience. In simple words, it's like a toolbox that helps you customize and improve how you interact with your computer using the command line.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation Guide for Oh My Zsh
&lt;/h4&gt;

&lt;p&gt;To install Oh My Zsh, simply visit the &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;official website&lt;/a&gt; and locate the provided script. Copy this script, then open your terminal and paste it there to initiate the installation process&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Must-Have Plugins
&lt;/h2&gt;

&lt;p&gt;Oh My Zsh opens the door to a universe of plugins, each catering to specific needs and enhancing your workflow. Here are some essential plugins to consider:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Git: Streamlining Version Control&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This plugin provides many aliases and functions that make working with Git from the command line easier.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usage:
&lt;/h4&gt;

&lt;p&gt;For detailed usage, you can refer to the &lt;a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;p&gt;1) The git plugin comes bundled with Oh My Zsh.&lt;br&gt;
2) To install it, append git to the plugin list in your &lt;code&gt;.zshrc&lt;/code&gt;file in your home directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
    git
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Sudo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The sudo plugin helps to add 'sudo' in front of previous commands by pressing the escape button twice.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The sudo plugin comes bundled with Oh My Zsh.&lt;/li&gt;
&lt;li&gt;To install it, append sudo to the plugin list in your &lt;code&gt;.zshrc&lt;/code&gt;file in your home directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
    sudo
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Zsh-autosuggestions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This plugin provides fish-like autosuggestions for zsh.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;p&gt;1) First, clone the zsh-autosuggestions repository into &lt;code&gt;~/.oh-my-zsh/custom/plugins&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

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

&lt;/div&gt;



&lt;p&gt;2) Then, append zsh-autosuggestions to the plugin list in your &lt;code&gt;.zshrc&lt;/code&gt; file in your home directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
    zsh-autosuggestions
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;History&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This plugin provides several commands to work with your command history.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usage:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;h&lt;/strong&gt;: Prints your command history.&lt;br&gt;
&lt;strong&gt;hs&lt;/strong&gt;: Use grep to search your command history.&lt;br&gt;
&lt;strong&gt;hsi&lt;/strong&gt;: Use grep to do a case-insensitive search of your command history.&lt;/p&gt;
&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;p&gt;1) The &lt;code&gt;history&lt;/code&gt; plugin comes bundled with Oh My Zsh.&lt;br&gt;
2) To install it, append &lt;code&gt;history&lt;/code&gt; to the plugin list in your &lt;code&gt;.zshrc&lt;/code&gt; file in your home directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
    history
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. &lt;strong&gt;Copypath&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;copypath&lt;/code&gt; plugin allows you to copy the current directory path to your system clipboard.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;p&gt;1) The copypath plugin comes bundled with Oh My Zsh.&lt;br&gt;
2) To install it, append copypath to the plugin list in your .zshrc file in your home directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
   copypath
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. &lt;strong&gt;Copyfile&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;copyfile&lt;/code&gt; plugin allows you to copy the contents of a file to your system clipboard.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;p&gt;1) The copyfile plugin comes bundled with Oh My Zsh.&lt;br&gt;
2) To install it, append copyfile to the plugin list in your .zshrc file in your home directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
   copyfile
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. &lt;strong&gt;Copybuffer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;copybuffer&lt;/code&gt; plugin lets you copy the current command line to your system clipboard.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The copybuffer plugin comes bundled with Oh My Zsh.&lt;/li&gt;
&lt;li&gt;To install it, append copybuffer to the plugin list in your .zshrc file in your home directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
   copybuffer
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. &lt;strong&gt;Dirhistory&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;dirhistory&lt;/code&gt; plugin provides commands for navigating directory history.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The dirhistory plugin comes bundled with Oh My Zsh.&lt;/li&gt;
&lt;li&gt;To install it, append dirhistory to the plugin list in your .zshrc file in your home directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
   copybuffer
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. &lt;strong&gt;JsonTools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;jsonTools&lt;/code&gt; plugin provides commands for validating and formatting JSON.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;The jsonTools plugin comes bundled with Oh My Zsh.&lt;/li&gt;
&lt;li&gt;To install it, append jsonTools to the plugin list in your .zshrc file in your home directory.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=( 
   jsonTools
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>zsh</category>
      <category>linux</category>
      <category>terminal</category>
      <category>bash</category>
    </item>
    <item>
      <title>Removing Applications Installed via dpkg: A Step-by-Step Guide</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Tue, 31 Oct 2023 03:45:07 +0000</pubDate>
      <link>https://forem.com/messenger1012/removing-applications-installed-via-dpkg-a-step-by-step-guide-1cl9</link>
      <guid>https://forem.com/messenger1012/removing-applications-installed-via-dpkg-a-step-by-step-guide-1cl9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;Installing software packages on Linux systems using the dpkg command is a common practice. However, sometimes you might need to uninstall these applications. This guide outlines the steps to remove applications installed via dpkg in a straightforward manner.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to Uninstall an Application Installed via dpkg:
&lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  1. Identify the Package Name:
&lt;/h4&gt;

&lt;p&gt;First, you need to find the exact name of the package you want to uninstall. Use the following command to list all installed packages containing a specific keyword (replace PACKAGE_NAME with the actual keyword, e.g., skype):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dpkg -l | grep PACKAGE_NAME&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
For example, to find Skype packages:&lt;br&gt;
&lt;code&gt;dpkg -l | grep skype&lt;/code&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  2. Remove the Application:
&lt;/h5&gt;

&lt;p&gt;Once you've identified the correct package name, use the following command to remove the application:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo dpkg -r skype-package-name&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Replace skype-package-name with the actual name of the package you found in the previous step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8pdanfp4ph3kn3nodrg.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%2Fg8pdanfp4ph3kn3nodrg.png" alt="example" width="732" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dpkg</category>
      <category>linuxtips</category>
      <category>softwareremoval</category>
      <category>linuxcommands</category>
    </item>
    <item>
      <title>Torrent to Google Drive Uploader</title>
      <dc:creator>MUHAMMED YAZEEN AN</dc:creator>
      <pubDate>Tue, 12 Sep 2023 15:21:00 +0000</pubDate>
      <link>https://forem.com/messenger1012/torrent-to-google-drive-uploader-50b6</link>
      <guid>https://forem.com/messenger1012/torrent-to-google-drive-uploader-50b6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jwxpkwm24j5u7abqkc0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jwxpkwm24j5u7abqkc0.jpg" alt="Thumb Nail" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Torrent to Google Drive Uploader is a Google Colab script that simplifies the process of uploading torrented content directly to your Google Drive. &lt;/p&gt;

&lt;p&gt;With this script, you can conveniently add multiple torrent files or magnet links, and they will be downloaded and securely stored on your Google Drive.the Script has significant advantage in terms of speed comparing other free alternatives. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/imessenger98/Torrent-To-Google-Drive-uploader" rel="noopener noreferrer"&gt;Github Repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>community</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
