<?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: Ibrar Hussain</title>
    <description>The latest articles on DEV Community by Ibrar Hussain (@ibrarturi).</description>
    <link>https://dev.to/ibrarturi</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%2F286347%2F3697684f-a159-4a47-855b-e25b706fd022.jpeg</url>
      <title>DEV Community: Ibrar Hussain</title>
      <link>https://dev.to/ibrarturi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ibrarturi"/>
    <language>en</language>
    <item>
      <title>Efficient Webhook Handling in Laravel Using Unique Jobs</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Mon, 15 Jul 2024 07:06:31 +0000</pubDate>
      <link>https://dev.to/ibrarturi/efficient-webhook-handling-in-laravel-using-unique-jobs-3fk3</link>
      <guid>https://dev.to/ibrarturi/efficient-webhook-handling-in-laravel-using-unique-jobs-3fk3</guid>
      <description>&lt;p&gt;One of the Laravel projects I'm working on connects to multiple third-party applications, and we use webhooks to sync data between them.&lt;/p&gt;

&lt;p&gt;Recently, I encountered an issue where our Laravel application was receiving multiple webhook calls from a third-party application for the same object within 10 seconds. Processing each of these calls individually is inefficient because it updates the same data in the database multiple times, draining our server and database resources, especially under high traffic.&lt;/p&gt;

&lt;p&gt;To optimize this, we want to process only a single webhook call out of the multiple received within a 10-second window. Laravel has a built-in feature called &lt;a href="https://laravel.com/docs/8.x/queues#unique-jobs" rel="noopener noreferrer"&gt;Unique Jobs&lt;/a&gt; that can help us achieve this.&lt;/p&gt;

&lt;p&gt;Here’s how we can use this feature:&lt;/p&gt;

&lt;p&gt;First, let's define our queue job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UpdateProductFromWebhook&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dispatchable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;InteractsWithQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Queueable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Create the event listener for this class.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Execute the job.
     *
     * @return void
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Logic here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;To make this job unique, we need to implement the &lt;code&gt;ShouldBeUnique&lt;/code&gt; interface. We also need to set the &lt;code&gt;uniqueFor&lt;/code&gt; property to 10 seconds and define the &lt;code&gt;uniqueId&lt;/code&gt; method to use the product ID as the unique identifier. Here’s the updated job class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UpdateProductFromWebhook&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ShouldBeUnique&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dispatchable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;InteractsWithQueue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Queueable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

     &lt;span class="cd"&gt;/**
     * The number of seconds after which the job's unique lock will be released.
     *
     * @var int
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$uniqueFor&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="c1"&gt;// 10 seconds&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * The unique ID of the job.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;uniqueId&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Product::%s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Create the event listener for this class.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Execute the job.
     *
     * @return void
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Logic here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;With these changes, the job will be unique for 10 seconds. If multiple webhook calls for the same product are received within this period, only the first one will be processed, and the rest will be ignored, thus conserving server and database resources.&lt;/p&gt;

&lt;p&gt;This concept can be applied to your application's existing queue jobs to prevent duplicate processing and improve efficiency. By ensuring that jobs are unique within a specific time frame, you can reduce unnecessary load on your server and database, leading to better performance and resource utilization.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>laravel</category>
      <category>queuejob</category>
      <category>webhook</category>
    </item>
    <item>
      <title>Installing PHP 8.0 on MacOS: Overcoming Disabled Versions</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Tue, 06 Feb 2024 00:35:06 +0000</pubDate>
      <link>https://dev.to/ibrarturi/installing-php-80-on-macos-overcoming-disabled-versions-1hio</link>
      <guid>https://dev.to/ibrarturi/installing-php-80-on-macos-overcoming-disabled-versions-1hio</guid>
      <description>&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt; is advancing rapidly, and now with &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;8.3&lt;/code&gt; in play, &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;8.0&lt;/code&gt; is no longer supported and not easy to install in the usual way. For instance, if you're a &lt;strong&gt;Valet&lt;/strong&gt; user, you might face issues with commands like &lt;code&gt;valet install php@8.0&lt;/code&gt; or &lt;code&gt;valet use php@8.0&lt;/code&gt;, and via &lt;strong&gt;brew&lt;/strong&gt;, a message might appear, indicating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: php@8.0 has been disabled because it is a versioned formula!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For projects still relying on &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;8.0&lt;/code&gt;, follow these steps for a solution:&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap shivammathur/php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;shivammathur/php/php@8.0 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the following result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PHP 8.0.30 (cli) (built: Nov  7 2023 03:00:28) ( NTS )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need older versions, like &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;7.3&lt;/code&gt;, you can follow the same steps.&lt;/p&gt;

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

&lt;p&gt;For &lt;strong&gt;Valet&lt;/strong&gt; users, linking &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;8.0&lt;/code&gt; is crucial. Use 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;valet &lt;span class="nb"&gt;link &lt;/span&gt;php@8.0 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This links &lt;strong&gt;PHP&lt;/strong&gt; &lt;code&gt;8.0&lt;/code&gt; to &lt;strong&gt;Valet&lt;/strong&gt;, enabling you to switch between &lt;strong&gt;PHP&lt;/strong&gt; versions seamlessly. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;valet use php@8.0 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope this guide proves helpful for you.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shivammathur/homebrew-php"&gt;https://github.com/shivammathur/homebrew-php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laravel.com/docs/10.x/valet"&gt;https://laravel.com/docs/10.x/valet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>howto</category>
      <category>php</category>
      <category>macos</category>
    </item>
    <item>
      <title>RDS MySQL vs. Aurora: A Comprehensive Performance Guide</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Wed, 17 Jan 2024 07:33:22 +0000</pubDate>
      <link>https://dev.to/ibrarturi/rds-mysql-vs-aurora-a-comprehensive-performance-guide-1njh</link>
      <guid>https://dev.to/ibrarturi/rds-mysql-vs-aurora-a-comprehensive-performance-guide-1njh</guid>
      <description>&lt;p&gt;Whenever we create a new Laravel application, MySQL (community edition) is our default choice, and it might be yours too. It's easy to use and performs well. However, if your project involves substantial and growing data, you might have noticed increased response times in your APIs. In a recent effort to optimize our project and reduce API response times, we explored AWS Aurora (MySQL-Compatible) and decided to use it instead of MySQL for our production server.&lt;/p&gt;

&lt;p&gt;Aurora is a fully managed relational database engine compatible with MySQL and PostgreSQL.&lt;/p&gt;

&lt;p&gt;Here's a brief comparison of RDS MySQL and Aurora:&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Read and Write Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance depends on the selected instance type.&lt;/li&gt;
&lt;li&gt;Read scalability is achieved through read replicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aurora&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outperforms MySQL in read and write operations.&lt;/li&gt;
&lt;li&gt;Its distributed architecture enhances both read and write scalability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Replication
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication is available, but it may impact overall performance.&lt;/li&gt;
&lt;li&gt;Read replicas operate asynchronously.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aurora&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aurora Replicas provide low-latency, high-throughput read scalability.&lt;/li&gt;
&lt;li&gt;Storage-based replication boosts overall performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Considerations for Cost Efficiency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost-effective for smaller workloads.&lt;/li&gt;
&lt;li&gt;Suitable for applications with moderate performance requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aurora&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High performance can justify the higher cost.&lt;/li&gt;
&lt;li&gt;Cost-efficient for large-scale, high-traffic scenarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing Between RDS MySQL and Aurora
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Consider Your Workload&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL might be more cost-effective for smaller workloads.&lt;/li&gt;
&lt;li&gt;Aurora is suitable for demanding applications with high-performance requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Evaluate Your Budget&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL is more budget-friendly but may have limitations in performance.

&lt;ul&gt;
&lt;li&gt;Aurora's higher cost may be justified for applications demanding top-notch performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scalability Requirements&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If seamless scalability is crucial, Aurora's automatic scaling capabilities could make it the preferred choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choosing between MySQL and Aurora comes down to your application needs and budget requirements. The auto load balancing feature in Aurora adds an extra layer of reliability by seamlessly transitioning to a replica in case the main Writer instance goes down. This dynamic adaptability sets Aurora apart, ensuring uninterrupted service.&lt;/p&gt;

&lt;p&gt;I hope this comprehensive guide provides you with the insights needed to make an informed decision aligned with your business goals.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mysql</category>
      <category>aws</category>
    </item>
    <item>
      <title>Setup DynamoDB Docker Container for Local Development</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Fri, 12 Jan 2024 20:41:30 +0000</pubDate>
      <link>https://dev.to/ibrarturi/setup-dynamodb-docker-container-for-local-development-130d</link>
      <guid>https://dev.to/ibrarturi/setup-dynamodb-docker-container-for-local-development-130d</guid>
      <description>&lt;p&gt;DynamoDB is a powerful NoSQL database service provided by AWS. If you're developing applications that use DynamoDB, having a local environment for testing is crucial. Docker makes setting up a local DynamoDB instance for your development needs easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Docker Desktop
&lt;/h3&gt;

&lt;p&gt;If you don't have Docker Desktop installed, follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Download Docker Desktop:&lt;/strong&gt;&lt;br&gt;
Visit the &lt;a href="https://www.docker.com/products/docker-desktop/"&gt;Docker Desktop website&lt;/a&gt; and download the appropriate version for your operating system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Docker Desktop:&lt;/strong&gt;&lt;br&gt;
Follow the installation instructions for your operating system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Set Up DynamoDB with Docker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Folder&lt;/strong&gt;:
&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;mkdir &lt;/span&gt;docker-workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to the Folder&lt;/strong&gt;:
&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;cd &lt;/span&gt;docker-workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Docker Compose File&lt;/strong&gt;:
&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;docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open &lt;code&gt;docker-compose.yml&lt;/code&gt; and Add the Following Content&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.7"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# DynamoDB Server&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-jar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;DynamoDBLocal.jar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sharedDb&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-dbPath&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;./data"&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amazon/dynamodb-local:latest"&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dynamodb&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./docker/dynamodb:/home/dynamodblocal/data"&lt;/span&gt;
    &lt;span class="na"&gt;working_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/dynamodblocal&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker_workspace_network&lt;/span&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save and Close the File.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start Docker Containers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access DynamoDB Local Console
&lt;/h3&gt;

&lt;p&gt;Once the Docker container is up and running, you can access the DynamoDB interface by downloading AWS NoSQL Workbench &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.html"&gt;here&lt;/a&gt; for your operating system. Follow the instructions &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.install.html"&gt;here&lt;/a&gt; for installation. On successful installation, you can add a new connection in the &lt;code&gt;Operation builder&lt;/code&gt; section for your DynamoDB local.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using DynamoDB in Your Application
&lt;/h3&gt;

&lt;p&gt;Now that you have a local DynamoDB instance running, you can configure your application (in my case Laravel application) to use it. Update your application's DynamoDB configuration to point to &lt;code&gt;localhost:8000&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;DYNAMODB_HOST=http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, you can develop and test your application locally with DynamoDB.&lt;/p&gt;

&lt;p&gt;Refer to the &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html"&gt;official DynamoDB Local documentation&lt;/a&gt; for more advanced configurations and details.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>docker</category>
      <category>dynamodb</category>
      <category>laravel</category>
    </item>
    <item>
      <title>Setup Redis Docker Container to Use with Laravel App</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Fri, 12 Jan 2024 11:07:19 +0000</pubDate>
      <link>https://dev.to/ibrarturi/setup-redis-docker-container-to-use-with-laravel-app-4cl1</link>
      <guid>https://dev.to/ibrarturi/setup-redis-docker-container-to-use-with-laravel-app-4cl1</guid>
      <description>&lt;p&gt;If you are working on Laravel project optimization, you might have considered using cache, with Redis being a popular choice. Laravel provides support for multiple cache drivers, including Redis.&lt;/p&gt;

&lt;p&gt;To start using Redis, you'll first need to install the &lt;code&gt;phpredis&lt;/code&gt; package. You can do this by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require predis/predis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, update your &lt;code&gt;.env&lt;/code&gt; file and change the &lt;code&gt;CACHE_DRIVER&lt;/code&gt; value to redis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's set up Redis using a Docker container. If you don't have Docker Desktop installed, follow these steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Docker Desktop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Download Docker Desktop&lt;/strong&gt;:&lt;br&gt;
Visit the &lt;a href="https://www.docker.com/products/docker-desktop/"&gt;Docker Desktop website&lt;/a&gt; and download the appropriate version for your operating system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Docker Desktop&lt;/strong&gt;:&lt;br&gt;
Follow the installation instructions for your operating system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Set Up Redis with Docker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Folder&lt;/strong&gt;:
&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;mkdir &lt;/span&gt;docker-workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigate to the Folder&lt;/strong&gt;:
&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;cd &lt;/span&gt;docker-workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a Docker Compose File&lt;/strong&gt;:
&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;docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open &lt;code&gt;docker-compose.yml&lt;/code&gt; and Add the Following Content&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.7"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Redis Server for Cache&lt;/span&gt;
  &lt;span class="na"&gt;redis-cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis-server --save 20 1 --loglevel warning&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;cache:/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save and Close the File.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start Docker Containers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, you now have a Redis server running in a Docker container, ready to be used for caching in your Laravel application.&lt;/p&gt;

&lt;p&gt;For a more detailed guide on setting up Docker containers for other services like MySQL and Mailhog, you can refer to my previous articles (&lt;a href="https://dev.to/ibrarturi/setup-docker-container-for-mailhog-to-use-it-with-laravel-app-4g00"&gt;Mailhog&lt;/a&gt;, &lt;a href="https://dev.to/ibrarturi/setup-docker-container-for-mysql-to-use-it-with-laravel-app-4a95"&gt;MySQL&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>laravel</category>
      <category>docker</category>
      <category>redis</category>
    </item>
    <item>
      <title>Debugging Laravel: Printing SQL Queries with Ease</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Mon, 08 Jan 2024 20:47:01 +0000</pubDate>
      <link>https://dev.to/ibrarturi/debugging-laravel-printing-sql-queries-with-ease-40ek</link>
      <guid>https://dev.to/ibrarturi/debugging-laravel-printing-sql-queries-with-ease-40ek</guid>
      <description>&lt;p&gt;As developers working on Laravel projects, there are moments when we need to delve into the inner workings of SQL queries. Printing the SQL query along with its bindings becomes crucial for debugging or running queries in SQL editors like &lt;code&gt;Sequel Ace&lt;/code&gt; to verify expected results.&lt;/p&gt;

&lt;p&gt;Laravel, although not having this feature out of the box (as of Laravel 9), provides methods like &lt;code&gt;toSql()&lt;/code&gt; for printing queries without bindings and &lt;code&gt;getBindings()&lt;/code&gt; for printing bindings separately. Let's explore how to print them together using a simple example:&lt;/p&gt;

&lt;h4&gt;
  
  
  Example Query:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$query = UserModel::where('email', 'name@example.com');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Using &lt;code&gt;toSql()&lt;/code&gt; and &lt;code&gt;getBindings()&lt;/code&gt;:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$rawQuery = str_replace('?', "'?'", $query-&amp;gt;toSql());
logger()-&amp;gt;info(vsprintf(str_replace('?', '%s', $rawQuery), $query-&amp;gt;getBindings()));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; select * from `users` where `email` = 'name@example.com' and `users`.`deleted_at` is null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Macroable Trait for Convenience:
&lt;/h4&gt;

&lt;p&gt;For a more convenient and reusable approach, you can create a Macroable Trait. In your &lt;code&gt;AppServiceProvider&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;Builder::macro('toSqlWithBindings', function () {
    $rawQuery = str_replace('?', "'?'", $this-&amp;gt;toSql());

    return vsprintf(str_replace('?', '%s', $rawQuery), $this-&amp;gt;getBindings());
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can use it seamlessly in your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UserModel::where('email', 'name@example.com')-&amp;gt;toSqlWithBindings(); 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output the same SQL query as before.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion:
&lt;/h4&gt;

&lt;p&gt;By incorporating these techniques, you can easily print SQL queries with bindings, empowering you to debug and optimize your Laravel applications effectively.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Simplifying Amazon Q Setup in PhpStorm</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Sat, 30 Dec 2023 03:57:03 +0000</pubDate>
      <link>https://dev.to/ibrarturi/simplifying-amazon-q-setup-in-phpstorm-3b3o</link>
      <guid>https://dev.to/ibrarturi/simplifying-amazon-q-setup-in-phpstorm-3b3o</guid>
      <description>&lt;p&gt;Engaging with generative AI-powered chatbots has never been easier! Amazon Q, a dynamic alternative to ChatGPT, seamlessly integrates into PhpStorm, offering an intuitive solution for problem-solving, content generation, and taking actions within both your AWS account and favorite editor. Let's embark on the journey of setting up Amazon Q in PhpStorm with these straightforward steps:&lt;/p&gt;

&lt;p&gt;Today, we will go through the process of how to setup Amazon Q with PhpStorm, following are the steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open PhpStorm Settings
&lt;/h3&gt;

&lt;p&gt;Navigate to the top-left menu in PhpStorm, click on &lt;strong&gt;PhpStorm&lt;/strong&gt;, and select &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QJr8PO1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4l7sk73g2bagskdon6xq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QJr8PO1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4l7sk73g2bagskdon6xq.png" alt="PhpStorm settings" width="266" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Access Marketplace in Plugins
&lt;/h3&gt;

&lt;p&gt;Within the Settings, choose the &lt;strong&gt;Marketplace&lt;/strong&gt; in the &lt;strong&gt;Plugins&lt;/strong&gt; section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5uFoKXCu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1uderkaoav6se4tm9noc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5uFoKXCu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1uderkaoav6se4tm9noc.png" alt="Plugins -&amp;gt; Marketplace" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Install AWS Toolkit
&lt;/h3&gt;

&lt;p&gt;Search for &lt;strong&gt;AWS Toolkit&lt;/strong&gt; and click &lt;strong&gt;Install&lt;/strong&gt;. After successful installation, restart PhpStorm when prompted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iiAPH3GS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1q7tsi0vbe54j3d6uk0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iiAPH3GS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1q7tsi0vbe54j3d6uk0h.png" alt="Search for Aws Toolkit" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Step 4: Sign into AWS Toolkit
&lt;/h3&gt;

&lt;p&gt;After restarting, click on the AWS icon in the top-left panel, go to &lt;strong&gt;Developer Tools&lt;/strong&gt;, and click &lt;strong&gt;Sign in to get started&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lIjNVEoF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oztyvecuf0n5ic3wsm0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lIjNVEoF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oztyvecuf0n5ic3wsm0q.png" alt="Sign in to get started" width="800" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Create AWS Builder ID
&lt;/h3&gt;

&lt;p&gt;Create an AWS Builder ID for free and click on &lt;strong&gt;Connect&lt;/strong&gt;. Follow the on-screen instructions to proceed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fJONZP2t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61v54y9ujw7ztyiocqy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fJONZP2t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61v54y9ujw7ztyiocqy4.png" alt="AWS Builder ID" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Confirm in Browser
&lt;/h3&gt;

&lt;p&gt;A code will be generated; click &lt;strong&gt;Proceed To Browser&lt;/strong&gt;, confirm the code in the browser, and click &lt;strong&gt;Confirm and continue&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Step 7: Create AWS Builder Account
&lt;/h3&gt;

&lt;p&gt;Follow the steps to create an AWS Builder Account. Once created, allow AWS Toolkit for JetBrains to access your data by clicking &lt;strong&gt;Allow&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Completion: Amazon Q Integration in PhpStorm
&lt;/h3&gt;

&lt;p&gt;Upon success, you'll see the Amazon Q panel in PhpStorm. Check Amazon Q status under &lt;strong&gt;Developer Tools&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;You can confirm Amazon Q status by clicking on the &lt;strong&gt;AWS&lt;/strong&gt; icon, then &lt;strong&gt;Developer Tools&lt;/strong&gt;, and you should see the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kuhhB4F3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bul6syhly1s3v6y1by5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kuhhB4F3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bul6syhly1s3v6y1by5l.png" alt="Amazon Q status under Developer Tools" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You're all set! Click on Chat with Q to open the chat window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lhZzjd7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3jdeisnv8qa519o59oo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lhZzjd7V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3jdeisnv8qa519o59oo.png" alt="Amazon Q chat window" width="800" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Begin your conversational journey with Amazon Q effortlessly integrated into your PhpStorm environment!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>amazonq</category>
      <category>howto</category>
      <category>php</category>
    </item>
    <item>
      <title>Setting Up Amazon CodeWhisperer: Your GitHub Copilot Alternative in PhpStorm</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Thu, 19 Oct 2023 06:57:07 +0000</pubDate>
      <link>https://dev.to/ibrarturi/setting-up-amazon-codewhisperer-your-github-copilot-alternative-in-phpstorm-19kf</link>
      <guid>https://dev.to/ibrarturi/setting-up-amazon-codewhisperer-your-github-copilot-alternative-in-phpstorm-19kf</guid>
      <description>&lt;p&gt;As a developer, the constant task of writing code can become tiresome. To alleviate this, having a personal assistant that aids in writing code more efficiently becomes essential. This is where AI-based coding tools like GitHub Copilot and Amazon CodeWhisperer come into play.&lt;/p&gt;

&lt;p&gt;GitHub Copilot is an excellent tool, but it comes with a paid subscription. On the other hand, its alternative, Amazon CodeWhisperer, offers two tiers: "Individual tier" and "Professional tier," with the "Individual tier" being free.&lt;/p&gt;

&lt;p&gt;Today, we'll walk through the steps of installing the free version of Amazon CodeWhisperer in PhpStorm. Here are the steps:&lt;/p&gt;

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

&lt;p&gt;In PhpStorm, click on the top-left menu &lt;strong&gt;PhpStorm&lt;/strong&gt;, and then select &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&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%2F4l7sk73g2bagskdon6xq.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%2F4l7sk73g2bagskdon6xq.png" alt="PhpStorm settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2:
&lt;/h3&gt;

&lt;p&gt;Choose the &lt;strong&gt;Marketplace&lt;/strong&gt; in the &lt;strong&gt;Plugins&lt;/strong&gt; section.&lt;/p&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%2F1uderkaoav6se4tm9noc.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%2F1uderkaoav6se4tm9noc.png" alt="Plugins -&amp;gt; Marketplace"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Search for &lt;strong&gt;AWS Toolkit&lt;/strong&gt; and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&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%2F1q7tsi0vbe54j3d6uk0h.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%2F1q7tsi0vbe54j3d6uk0h.png" alt="Search for Aws Toolkit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After successful installation, restart the IDE when prompted.&lt;/p&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%2F4fxrtjy19gnezcku9da7.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%2F4fxrtjy19gnezcku9da7.png" alt="Restart IDE"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;After restarting, click on the &lt;strong&gt;AWS&lt;/strong&gt; icon in the top-left panel, navigate to &lt;strong&gt;Developer Tools&lt;/strong&gt;, and double-click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/p&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%2Ff521rplruma1ivb55vvf.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%2Ff521rplruma1ivb55vvf.png" alt="Aws Developer Tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A window will appear; select the first option and click the &lt;strong&gt;Connect&lt;/strong&gt; button.&lt;/p&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%2Fky4qpcjg2kbbygt8ybib.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%2Fky4qpcjg2kbbygt8ybib.png" alt="Connection Option"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In the window, a code will be displayed. Click on &lt;strong&gt;Proceed to Browser&lt;/strong&gt;.&lt;/p&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%2Fxmcfsuhw6rv7ipnc2l65.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%2Fxmcfsuhw6rv7ipnc2l65.png" alt="Proceed to Browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new window should open in a browser. Confirm that it's displaying the same code as shown in the previous window and then click &lt;strong&gt;Confirm and Continue&lt;/strong&gt;.&lt;/p&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%2F4n55jws83q0unb0fxprb.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%2F4n55jws83q0unb0fxprb.png" alt="Confirm the code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be prompted to create an AWS Builder Account.&lt;/p&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%2Fm9m0045w0srbw7eqdw34.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%2Fm9m0045w0srbw7eqdw34.png" alt="AWS Builder Account"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the steps to create your account. Once the account is successfully created, you'll be asked to allow AWS Toolkit for JetBrains to access your data. Click &lt;strong&gt;Allow&lt;/strong&gt;.&lt;/p&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%2Fjh1zfgqvm2cb4g7hufsf.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%2Fjh1zfgqvm2cb4g7hufsf.png" alt="Allow AWS Toolkit to access JetBrains data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upon success, you'll see the following message:&lt;/p&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%2Fl715vvqu6vyhpf4rxg96.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%2Fl715vvqu6vyhpf4rxg96.png" alt="Success message"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6:
&lt;/h3&gt;

&lt;p&gt;Back in &lt;strong&gt;PhpStorm&lt;/strong&gt;, you'll see a message asking you to stay connected to CodeWhisperer. Click &lt;strong&gt;Yes&lt;/strong&gt;.&lt;/p&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%2Fxdj2lgr4ewry2cb1teh2.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%2Fxdj2lgr4ewry2cb1teh2.png" alt="Stay connected to CodeWhisperer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can confirm CodeWhisperer status by clicking on the &lt;strong&gt;AWS&lt;/strong&gt; icon, then &lt;strong&gt;Developer Tools&lt;/strong&gt;, and you should see the following message:&lt;/p&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%2Fxwt7cezpt2cl6wes0bjv.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%2Fxwt7cezpt2cl6wes0bjv.png" alt="CodeWhisperer status"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/codewhisperer/latest/userguide/setting-up.html" rel="noopener noreferrer"&gt;Setting up CodeWhisperer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Z3ZAJoi4x6Q" rel="noopener noreferrer"&gt;Getting started with Amazon CodeWhisperer with IntelliJ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/getting-started.html" rel="noopener noreferrer"&gt;Getting started with the AWS Toolkit for JetBrains&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>codewhisperer</category>
      <category>howto</category>
      <category>php</category>
    </item>
    <item>
      <title>Resolving SSH Permission Denied Errors Due to OpenSSH Version Vulnerabilities</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Sat, 25 Feb 2023 10:44:00 +0000</pubDate>
      <link>https://dev.to/ibrarturi/resolving-ssh-permission-denied-errors-due-to-openssh-version-vulnerabilities-3mjh</link>
      <guid>https://dev.to/ibrarturi/resolving-ssh-permission-denied-errors-due-to-openssh-version-vulnerabilities-3mjh</guid>
      <description>&lt;p&gt;If you have encountered errors while using SSH, such as the ones below:&lt;/p&gt;

&lt;p&gt;Example 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foo@12.34.56.789: Permission denied &lt;span class="o"&gt;(&lt;/span&gt;publickey&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sign_and_send_pubkey: no mutual signature supported
foo@12.34.56.789: Permission denied &lt;span class="o"&gt;(&lt;/span&gt;publickey&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's possible that you may be using an older version of OpenSSH on your server that is vulnerable to the SHA-1 algorithm, which was disabled in OpenSSH version 8.8 (2021-09-26). If you're certain that you've correctly added the public key to your server, this could be the cause of the error messages.&lt;/p&gt;

&lt;p&gt;To determine your local OpenSSH version, enter the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-vv&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result should look like this:&lt;/p&gt;

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

&lt;p&gt;To resolve the issue, add &lt;code&gt;PubkeyAcceptedKeyTypes +ssh-rsa&lt;/code&gt; to your Host entry in the ~/.ssh/config file. It should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Host fooServer
PubkeyAcceptedKeyTypes +ssh-rsa
Hostname 12.34.56.789
User forge
&lt;span class="nv"&gt;IdentityFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After making these changes, try again and the issue should be resolved.&lt;/p&gt;

</description>
      <category>openai</category>
      <category>api</category>
      <category>terminal</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Optimizing Bitbucket Pipelines with Custom Docker Images</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Thu, 16 Feb 2023 02:27:00 +0000</pubDate>
      <link>https://dev.to/ibrarturi/optimizing-bitbucket-pipelines-with-custom-docker-images-5dp</link>
      <guid>https://dev.to/ibrarturi/optimizing-bitbucket-pipelines-with-custom-docker-images-5dp</guid>
      <description>&lt;p&gt;In this article, we will discuss the process of customizing an existing &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; image, installing the required libraries and packages, building the new image, and pushing it to your &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; account.&lt;/p&gt;

&lt;p&gt;Suppose your project requires the &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; image &lt;a href="https://hub.docker.com/layers/library/php/8.0.26-cli/images/sha256-00b971a0e1ffbd9c13cfa819638130da9a5b22ac0092369780bfa98868861d5c"&gt;&lt;code&gt;php:8.0.26-cli&lt;/code&gt;&lt;/a&gt; for your Bitbucket pipeline, but the installation of required libraries and packages, such as &lt;code&gt;composer&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;rsync&lt;/code&gt;, &lt;code&gt;zip&lt;/code&gt;, &lt;code&gt;mysql-client&lt;/code&gt;, &lt;code&gt;gd&lt;/code&gt;, and &lt;code&gt;grpc&lt;/code&gt;, is taking too long. In such a situation, you need to create a custom image and pre-install all the required packages, which will reduce the pipeline build time.&lt;/p&gt;

&lt;p&gt;Here are the steps to create a custom Docker image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure that you have installed &lt;a href="https://docs.docker.com/get-started/overview/#the-docker-client"&gt;Docker Client&lt;/a&gt;, if not, then you need to install it first.&lt;/li&gt;
&lt;li&gt;Create a new folder &lt;code&gt;foo-custom-image&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Inside this folder create a new file &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the &lt;code&gt;Dockerfile&lt;/code&gt; and add the following:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;From php:8.0.26-cli

RUN apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-qy&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        unzip &lt;span class="se"&gt;\&lt;/span&gt;
        git &lt;span class="se"&gt;\&lt;/span&gt;
        curl &lt;span class="se"&gt;\&lt;/span&gt;
        rsync &lt;span class="se"&gt;\&lt;/span&gt;
        libmcrypt-dev &lt;span class="se"&gt;\&lt;/span&gt;
        libzip-dev &lt;span class="se"&gt;\&lt;/span&gt;
        zip &lt;span class="se"&gt;\&lt;/span&gt;
        default-mysql-client &lt;span class="se"&gt;\&lt;/span&gt;
        libfreetype6-dev &lt;span class="se"&gt;\&lt;/span&gt;
        libjpeg62-turbo-dev &lt;span class="se"&gt;\&lt;/span&gt;
        libpng-dev &lt;span class="se"&gt;\&lt;/span&gt;
        zlib1g-dev

RUN curl &lt;span class="nt"&gt;-sSLf&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/install-php-extensions &lt;span class="se"&gt;\&lt;/span&gt;
        https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/install-php-extensions &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    install-php-extensions grpc-1.45.0

RUN docker-php-ext-configure gd &lt;span class="nt"&gt;--with-freetype&lt;/span&gt; &lt;span class="nt"&gt;--with-jpeg&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker-php-ext-install pdo_mysql zip gd

RUN curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | php &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Save and close the file.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Login to your &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; account using the command &lt;code&gt;docker login&lt;/code&gt;. This command will ask for your credentials, and if all goes well, then you will get a success message&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build the docker image using the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64 &lt;span class="nt"&gt;-t&lt;/span&gt; foobar/custom-cicd-php-8-cli:1.0.0 ./
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;foobar&lt;/code&gt; should be replaced with your &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; account username.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;custom-cicd-php-8-cli&lt;/code&gt; is the name of the image, which can be changed to anything.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1.0.0&lt;/code&gt; is the tag version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This command can take up to 45 minutes, as &lt;code&gt;grpc&lt;/code&gt; take quite a long time to install.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once build is successfully finished, you can push the image to your &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; account using the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push foobar/custom-cicd-php-8-cli:1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Upon successful push, confirm the changes in &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can delete your local docker image(s) by following these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;docker images&lt;/code&gt; to list the images on your local machine.&lt;/li&gt;
&lt;li&gt;From the list, copy the Image ID for your docker image that you want to delete.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker rmi [Image ID]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This command should delete the docker image with provided &lt;code&gt;Image ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once everything is ready, now you can use this custom image in your Bitbucket pipeline and test your pipeline for build time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>howto</category>
      <category>docker</category>
      <category>bitbucket</category>
    </item>
    <item>
      <title>How to Upgrade MySQL 5.7 to 8.0 on Mac</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Tue, 10 Jan 2023 22:54:29 +0000</pubDate>
      <link>https://dev.to/ibrarturi/how-to-upgrade-mysql-57-to-80-on-mac-8ho</link>
      <guid>https://dev.to/ibrarturi/how-to-upgrade-mysql-57-to-80-on-mac-8ho</guid>
      <description>&lt;p&gt;As new versions of MySQL are coming out, at one point you will need to upgrade your MySQL version as well.&lt;/p&gt;

&lt;p&gt;In this article, we will assume that we are using MySQL 5.7 for your local development on Mac and want to upgrade it the latest version (MySQL 8.0).&lt;/p&gt;

&lt;p&gt;Followings are the steps to follow:&lt;/p&gt;

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

&lt;p&gt;Make sure to do database dump for all of your databases, as you will need these to re-import it again when MySQL is successfully upgraded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step # 2
&lt;/h3&gt;

&lt;p&gt;Confirm that your running MySQL 5.7 via the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew services list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this should show the &lt;code&gt;mysql&lt;/code&gt; with &lt;code&gt;5.7&lt;/code&gt; version running.&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%2Fvkjxx0ek0y1xaisrsh84.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%2Fvkjxx0ek0y1xaisrsh84.png" alt="brew services list with mysql" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you start upgrading process, make sure to double-check that your existing MySQL 5.7 setup ticks all the boxes on the sanity checklist before upgrading to MySQL 8.0.&lt;/p&gt;

&lt;p&gt;You can do it by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqlcheck &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--all-databases&lt;/span&gt; &lt;span class="nt"&gt;--check-upgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command should &lt;code&gt;OK&lt;/code&gt; for all without any errors.&lt;/p&gt;

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

&lt;p&gt;Check for MySQL processes via the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps &lt;span class="nt"&gt;-ax&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;mysql
&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%2Fnmfj2n2fi9r9fg028d3m.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%2Fnmfj2n2fi9r9fg028d3m.png" alt="list of processes with PID" width="800" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop and kill any MySQL processes via the following command:&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;kill&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;PID&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Take a backup of &lt;code&gt;my.cnf&lt;/code&gt; located at: &lt;code&gt;/usr/local/etc/my.cnf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and remove this file via command: &lt;code&gt;rm /usr/local/etc/my.cnf&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Uninstall MySQL via the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew remove mysql
brew cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can confirm the uninstall by running &lt;code&gt;brew services list&lt;/code&gt; and there should not be &lt;code&gt;mysql&lt;/code&gt; listed&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%2Fxjlvg8dj51luonbjeisn.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%2Fxjlvg8dj51luonbjeisn.png" alt="brew services list not including mysql" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step # 6
&lt;/h3&gt;

&lt;p&gt;Install latest version 8.0 of the MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;mysql
brew services start mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once done, you can confirm the version of the MySQL by running the command: &lt;code&gt;mysql --version&lt;/code&gt; which should show the latest version of the MySQL&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%2Fxz5lmljp93f07el3msje.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%2Fxz5lmljp93f07el3msje.png" alt="mysql version" width="800" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step # 7
&lt;/h3&gt;

&lt;p&gt;Setup default root password with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should prompt you steps like the following screenshot:&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%2Fuewldo3bp0ynq2hieaio.jpeg" 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%2Fuewldo3bp0ynq2hieaio.jpeg" alt="set mysql password" width="800" height="1006"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Connect to &lt;code&gt;mysql&lt;/code&gt; via &lt;code&gt;Sequel Ace&lt;/code&gt;&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%2F84q41iauhg8d7wfwc6ib.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%2F84q41iauhg8d7wfwc6ib.png" alt="sequel ace connection settings for mysql" width="800" height="813"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and create any relevant databases and import them from your previous backup dump.&lt;/p&gt;

</description>
      <category>gratitude</category>
      <category>community</category>
    </item>
    <item>
      <title>How to fix Nginx symlink caching issue</title>
      <dc:creator>Ibrar Hussain</dc:creator>
      <pubDate>Tue, 13 Dec 2022 07:17:59 +0000</pubDate>
      <link>https://dev.to/ibrarturi/how-to-fix-nginx-symlink-caching-issue-3loe</link>
      <guid>https://dev.to/ibrarturi/how-to-fix-nginx-symlink-caching-issue-3loe</guid>
      <description>&lt;p&gt;Let's assume that you have a &lt;code&gt;Laravel&lt;/code&gt; application running through &lt;code&gt;nginx&lt;/code&gt; and pointing to the &lt;code&gt;current&lt;/code&gt; folder which is &lt;code&gt;symlink&lt;/code&gt; of the latest release folder you have.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root /home/foo/domain.com.au/current/public&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you update your &lt;code&gt;symlink&lt;/code&gt; for the &lt;code&gt;current&lt;/code&gt; to a new release, your application will still be point to the older release.&lt;/p&gt;

&lt;p&gt;To resolve this, add the following lines to your &lt;code&gt;nginx&lt;/code&gt; file after &lt;code&gt;include fastcgi_params;&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;fastcgi_param SCRIPT_FILENAME &lt;span class="nv"&gt;$realpath_root$fastcgi_script_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
fastcgi_param DOCUMENT_ROOT &lt;span class="nv"&gt;$realpath_root&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it should look this:&lt;/p&gt;

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

&lt;p&gt;Now, if you change/update the &lt;code&gt;symlink&lt;/code&gt; it should be working properly, and point to the correct release folder.&lt;/p&gt;

</description>
      <category>gratitude</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
