<?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: Mohammadjavad Raadi</title>
    <description>The latest articles on DEV Community by Mohammadjavad Raadi (@mjraadi).</description>
    <link>https://dev.to/mjraadi</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%2F142971%2F864a6477-6968-4768-8634-e6d56b92b431.jpeg</url>
      <title>DEV Community: Mohammadjavad Raadi</title>
      <link>https://dev.to/mjraadi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mjraadi"/>
    <language>en</language>
    <item>
      <title>Run a Scalable Magento Webshop with User Content Moderation on AWS using CDK and Python</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Sun, 14 Nov 2021 19:22:16 +0000</pubDate>
      <link>https://dev.to/mjraadi/run-a-scalable-magento-webshop-with-user-content-moderation-on-aws-using-cdk-and-python-mdg</link>
      <guid>https://dev.to/mjraadi/run-a-scalable-magento-webshop-with-user-content-moderation-on-aws-using-cdk-and-python-mdg</guid>
      <description>&lt;p&gt;The AWS CDK is a software development framework from AWS with the sole purpose of making it easy to define cloud infrastructure in your favorite programming language and deploy it using AWS CloudFormation. You can easily provision many resource stacks on AWS and destroy them when you're done.&lt;/p&gt;

&lt;p&gt;We're going to build an infrastructure and the required resources to run a flexible, scalable and cost-effective Magento webshop on top of AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS Account &amp;amp; User - &lt;a href="https://cdkworkshop.com/15-prerequisites/200-account.html"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS CLI Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/100-awscli.html"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node.js Installed - &lt;a href="https://cdkworkshop.com/15-prerequisites/300-nodejs.html"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS CDK Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/500-toolkit.html"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Python 3 Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/600-python.html"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project Architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A VPC that spans two Availability Zones. Each Availability Zone is configured with a private, isolated, and a public subnet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In a public subnet, a bastion host to provide Secure Shell (SSH) access to the Magento web servers and the internal RDS MySQL database for troubleshooting purposes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS-managed network address translation (NAT) gateways deployed into the public subnets and configured with an Elastic IP address for outbound internet connectivity. The NAT gateways are used for internet access for all EC2 instances launched within the private network.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An Amazon RDS for MySQL database engine deployed via Amazon RDS in the isolated subnet. If you choose Multi-AZ deployment, a synchronously replicated secondary database is deployed in the second isolated subnet. This provides high availability and built-in automated failover from the primary database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EC2 web server instances launched in the private subnets. Elastic Load Balancing deployed to automatically distribute traffic across the multiple web server instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User data scripts to automatically install the required packages and perform the required configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Elastic Load Balancing deployed to automatically distribute traffic across the multiple web server instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auto Scaling enabled to automatically increase capacity if there is a demand spike, and to reduce capacity during low traffic times.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A CloudFront distribution is provisioned in front of the Application Load Balancer to provide caching at edge and to require encrypted web traffic through HTTPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An S3 bucket to be used by the Magento installation to store users' media content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Lambda function that is triggered by media content S3 bucket create item notifications. This function uses Amazon Rekognition &lt;code&gt;DetectModerationLabels&lt;/code&gt; API to check for inappropriate content uploaded by users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IAM instance roles with fine-grained permissions for access to AWS services necessary for the resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appropriate security groups for each instance or function to restrict access to only necessary protocols and ports. For example, access to HTTP server ports on Amazon EC2 web servers is limited to Elastic Load Balancing. The security groups also restrict access to Amazon RDS DB instances by web server instances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PGSEgEZn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmmtbxk3xh9hnof9h3dz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PGSEgEZn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmmtbxk3xh9hnof9h3dz.jpg" alt="Scalable Magento Webshop on AWS" width="880" height="947"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Configuration
&lt;/h3&gt;

&lt;p&gt;The project implements the use of CDK runtime contexts to dynamically create per-environment configurations and resources.&lt;br&gt;
The project defines two &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt; environments and resources are configured depending on that. For example, the project creates an RDS MySQL instance with minimum configuration for testing on the &lt;code&gt;dev&lt;/code&gt; environment, and creates a powerful and highly available database on the &lt;code&gt;prod&lt;/code&gt; environment. &lt;/p&gt;

&lt;p&gt;Learn more about CDK runtime contexts &lt;a href="https://dev.to/aws-builders/aws-cdk-per-environment-configuration-patterns-48m6"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;Here's the project repository. Please be sure to go through the &lt;a href="https://github.com/mjraadi/cdk-magento-webshop/blob/main/README.md"&gt;README&lt;/a&gt; file to get started and let me know if you have any comments or feedback. Enjoy!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mjraadi"&gt;
        mjraadi
      &lt;/a&gt; / &lt;a href="https://github.com/mjraadi/cdk-magento-webshop"&gt;
        cdk-magento-webshop
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is a CDK app to provision the required resources to run a flexible, scalable, and cost-effective Magento webshop on top of AWS.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Magento Webshop AWS CDK Project with Python&lt;/h1&gt;
&lt;p&gt;This is an AWS CDK app to provision the required resources to run a flexible, scalable and cost-effective Magento webshop on top of AWS.&lt;/p&gt;
&lt;h3&gt;
Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AWS Account &amp;amp; User - &lt;a href="https://cdkworkshop.com/15-prerequisites/200-account.html" rel="nofollow"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS CLI Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/100-awscli.html" rel="nofollow"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node.js Installed - &lt;a href="https://cdkworkshop.com/15-prerequisites/300-nodejs.html" rel="nofollow"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS CDK Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/500-toolkit.html" rel="nofollow"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Python 3 Installed &amp;amp; Configured - &lt;a href="https://cdkworkshop.com/15-prerequisites/600-python.html" rel="nofollow"&gt;Get help here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Project Architecture&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A VPC that spans two Availability Zones. Each Availability Zone is configured with a private, isolated, and a public subnet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a public subnet, a bastion host to provide Secure Shell (SSH) access to the Magento web servers and the internal RDS MySQL database for troubleshooting purposes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS-managed network address translation (NAT) gateways deployed into the public subnets and configured with an Elastic IP address for outbound internet connectivity. The NAT gateways are used for…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mjraadi/cdk-magento-webshop"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
      <category>devops</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What was your win/loss this year? What important lesson did you learn?</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Wed, 25 Dec 2019 18:30:11 +0000</pubDate>
      <link>https://dev.to/mjraadi/what-was-your-win-loss-this-year-what-important-lesson-did-you-learn-1pm6</link>
      <guid>https://dev.to/mjraadi/what-was-your-win-loss-this-year-what-important-lesson-did-you-learn-1pm6</guid>
      <description>&lt;p&gt;2019 is coming to an end and it's time for a new beginning. It was a very good year for me overall, I started blogging, gave a little back to the community, learned lots of new tools and technologies, landed my first fully remote job and visited two countries. &lt;br&gt;
Aside from almost losing my dad and getting cut off from the rest of the world (internet shutdown in Iran), everything else went great.&lt;br&gt;
The important lessons for me were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never underestimate the power of your will 💪💪&lt;/li&gt;
&lt;li&gt;Remote job is difficult but its advantages outweighs its disadvantages.(at least for me)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I always like to hear stories and learn from others so please share your thoughts. I'd love to hear them.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>yearlyretro</category>
    </item>
    <item>
      <title>If You Don't Know, Now You Know - GitHub Is Restricting Access For Users From Iran And A Few Other Embargoed Countries</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Sat, 27 Jul 2019 19:11:10 +0000</pubDate>
      <link>https://dev.to/mjraadi/if-you-don-t-know-now-you-know-github-is-restricting-access-for-users-from-iran-and-a-few-other-embargoed-countries-5ga9</link>
      <guid>https://dev.to/mjraadi/if-you-don-t-know-now-you-know-github-is-restricting-access-for-users-from-iran-and-a-few-other-embargoed-countries-5ga9</guid>
      <description>&lt;h3&gt;
  
  
  Here's something you may &lt;strong&gt;never&lt;/strong&gt; have to see in your lifetime:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquwa56766gr81qejaoc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquwa56766gr81qejaoc7.png" width="775" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not something new to me and many others. In fact these sort of discriminations have happened to me so much that I'm very sad to have gotten used to it. Let me catch you up on what's going on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update 1 - 28/7/19
&lt;/h3&gt;

&lt;p&gt;It is now possible to make your private repositories public.&lt;/p&gt;

&lt;p&gt;A few days ago, I received an email from GitHub which stated that my GitHub account has been restricted due to "Trade Control Laws Restrictions". Opening my GitHub profile, I found out that I can't access my private repositories. It also had stopped publishing my GitHub Pages sites. I was pretty upset and disappointed to see this happen again.&lt;/p&gt;

&lt;p&gt;I understand that GitHub may be innocent and simply obligated to comply by the US government laws and regulations but here's the sad part, it's not the governments who suffer. It's us. We have to pay the price just because governments and politicians don't get along.&lt;/p&gt;

&lt;p&gt;I do appreciate GitHub providing free private repository hosting for us, but I do believe it was absolutely unprofessional and unethical to block our access to our private assets without any prior notice. &lt;/p&gt;

&lt;p&gt;You might think, "what's the big deal?! there are many alternatives out there." Yeah, I know but this is not what it's about. It's about being constantly overlooked and discriminated against and not being able to have the same right to access the tools and resources as your fellow DEVs. 😔 &lt;/p&gt;

&lt;p&gt;How would you feel like if you wake up tomorrow and see that &lt;a class="mentioned-user" href="https://dev.to/ben"&gt;@ben&lt;/a&gt; is blocking your access to this great community of amazing developers for a stupid reason?&lt;/p&gt;

&lt;p&gt;Please make sure to checkout this repo for more information and see how you can help us.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/1995parham" rel="noopener noreferrer"&gt;
        1995parham
      &lt;/a&gt; / &lt;a href="https://github.com/1995parham/github-do-not-ban-us" rel="noopener noreferrer"&gt;
        github-do-not-ban-us
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GitHub do not ban us from open source world 🇮🇷
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;A Message to GitHub&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://gitspo.com/mentions/1995parham/github-do-not-ban-us" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/44f009d8ebc3d46c88d77e0f647b3a6e31e406168c2b0a1c96f2f6c7551a4933/68747470733a2f2f67697473706f2e636f6d2f6261646765732f6d656e74696f6e732f3139393570617268616d2f6769746875622d646f2d6e6f742d62616e2d75733f7374796c653d666c61742d737175617265" alt="GitSpo Mentions"&gt;&lt;/a&gt;
&lt;a href="https://cloud.drone.io/1995parham/github-do-not-ban-us" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/51cb47235bdac9ad7fef21612feb9013299e8ee6db6b613458d3bf6819505c09/68747470733a2f2f696d672e736869656c64732e696f2f64726f6e652f6275696c642f3139393570617268616d2f6769746875622d646f2d6e6f742d62616e2d75732e7376673f7374796c653d666c61742d737175617265" alt="Drone (cloud)"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;English | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-ES.md" rel="noopener noreferrer"&gt;Español &lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-GR.md" rel="noopener noreferrer"&gt;Ελληνικά&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-IT.md" rel="noopener noreferrer"&gt;Italiano&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-RU.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-PER.md" rel="noopener noreferrer"&gt;فارسی&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-FR.md" rel="noopener noreferrer"&gt;Français &lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-DE.md" rel="noopener noreferrer"&gt;Deutsch&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-HY.md" rel="noopener noreferrer"&gt;Հայերէն&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-SR.md" rel="noopener noreferrer"&gt;Српски&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-AR.md" rel="noopener noreferrer"&gt;العربية&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-TR.md" rel="noopener noreferrer"&gt;Türkçe&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-PT-BR.md" rel="noopener noreferrer"&gt;Português do Brasil&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-NL.md" rel="noopener noreferrer"&gt;Nederlands&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-KO.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-JA.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-NP.md" rel="noopener noreferrer"&gt;नेपाल&lt;/a&gt; | &lt;a href="https://github.com/1995parham/github-do-not-ban-us./README-TW.md" rel="noopener noreferrer"&gt;繁體中文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention!&lt;/strong&gt;
We are so thankful for your support. This repository always shows that people are all together against unfortunate happening around the world
As GitHub revised some of the previous restrictions, we decided to reduce this repository's activity. Of course, it does not mean that we agree with the sanctions and the GitHub
We will post a conclusion and explain more soon, please wait for that.
The campaign will be terminated &lt;strong&gt;Thursday 1 August 23:59 (Tehran Time GMT +4:30)&lt;/strong&gt;. After this time we won't merge any new PR.
Once again thanks for your support and kindness
Please wait for our final conclusion&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/1995parham/github-do-not-ban-us./message.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zIIATJcL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/1995parham/github-do-not-ban-us./message.png" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can use &lt;/del&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/1995parham/github-do-not-ban-us" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>discuss</category>
      <category>webdev</category>
      <category>news</category>
    </item>
    <item>
      <title>I just took couple of LinkedIn quizzes and was wondering do they even matter?! 🤔</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Thu, 20 Jun 2019 16:19:38 +0000</pubDate>
      <link>https://dev.to/mjraadi/i-just-took-couple-of-linkedin-quizzes-and-was-wondering-do-they-even-matter-3i1m</link>
      <guid>https://dev.to/mjraadi/i-just-took-couple-of-linkedin-quizzes-and-was-wondering-do-they-even-matter-3i1m</guid>
      <description>&lt;p&gt;Apparently, Linkedin is using their resources at Linkedin Learning (formerly Lynda) to create pass/fail tests with adaptive questions for specific skills. If you pass the timed test and find yourself in the 70th percentile you receive a badge. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rh9ohabpeb3de8hp10i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rh9ohabpeb3de8hp10i.jpg" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can choose whether you’d like to display this badge on your profile to represent that you’ve passed the assessment for that given skill. If you don’t pass an assessment for a given skill, you’ll be able to retake it one more time after three months and failed tests are not displayed on your profile.&lt;/p&gt;

&lt;p&gt;This re-imagination of skills is far more reliable than someone checking a box on your profile to endorse a skill. I do like the idea that skills on LinkedIn profiles are becoming reliable but &lt;strong&gt;will recruiters take the time to consider this&lt;/strong&gt;? There hasn't been much discussion about this on the web. Please let me know what you think.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>Sanity Tip For JavaScript Devs: Learn to Run Asynchronous Functions in Array.map()</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Thu, 13 Jun 2019 10:08:07 +0000</pubDate>
      <link>https://dev.to/mjraadi/sanity-tip-for-javascript-devs-learn-to-run-asynchronous-functions-in-array-map-44b7</link>
      <guid>https://dev.to/mjraadi/sanity-tip-for-javascript-devs-learn-to-run-asynchronous-functions-in-array-map-44b7</guid>
      <description>&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;I was writing some API code recently using Node.js, and came across a place where I needed to use &lt;code&gt;Array.map()&lt;/code&gt; with an &lt;code&gt;async&lt;/code&gt; function on each item. I was briefly surprised when my map call did not work right. Logging the output of the map function would show this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  Promise { &amp;lt;pending&amp;gt; },
  Promise { &amp;lt;pending&amp;gt; },
  Promise { &amp;lt;pending&amp;gt; },
  Promise { &amp;lt;pending&amp;gt; },
  Promise { &amp;lt;pending&amp;gt; },
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I was expecting to get an array of objects which each would be returned from an asynchronous API call inside the map function, but got this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use Asynchronous Function Inside &lt;code&gt;Array.map()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Array.map()&lt;/code&gt; is a synchronous operation and runs a function on each element in the array resulting in a new array with the updated items. There are situations where you want to run asynchronous functions within map, e.g. updating a list of models and push the changed information back to the database or request information from an API that you want to use for further operations.&lt;br&gt;
Let’s solve the problem of running an asynchronous operation in a synchronous function!&lt;/p&gt;
&lt;h3&gt;
  
  
  The Solution: &lt;code&gt;Promise.all&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;An approach to perform async actions in &lt;code&gt;array.map()&lt;/code&gt; is to return a promise for each item which then resolve outside the map function. Because map won’t wait for the promise to resolve, it’ll return a pending promise.&lt;/p&gt;

&lt;p&gt;You need to take care of all promises in the array returned from map to resolve before using their results. Do this with &lt;code&gt;Promise.all(&amp;lt;array-of-promises&amp;gt;)&lt;/code&gt;. The result of waiting for all promises to finish is another array containing the results.&lt;/p&gt;

&lt;p&gt;Let’s visualize the idea with an example:&lt;br&gt;
&lt;/p&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;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;//...an array filled with values&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;functionWithPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//a function that returns a promise&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;anAsyncFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;functionWithPromise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&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;getData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;anAsyncFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getData&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt; is one of my favorite new features in JavaScript as it makes asynchronous JavaScript code much more readable. If you’re like me, you’ll find &lt;code&gt;Promise.all&lt;/code&gt; incredibly helpful while working with &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The main thing to notice is the use of &lt;code&gt;Promise.all()&lt;/code&gt;, which resolves when all it’s promises are resolved. &lt;code&gt;list.map()&lt;/code&gt; returns a list of promises, so in result we’ll get the value when everything we ran is resolved. Remember, we must wrap any code that calls &lt;code&gt;await&lt;/code&gt; in an &lt;code&gt;async&lt;/code&gt; function.&lt;br&gt;
I hope this has been helpful to you. Please make sure to leave a comment or any questions you may have down below.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented and professional freelance developers, where we provide custom web application development services based on cutting-edge technologies, tailored to client's unique business needs.  &lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out my portfolio website at &lt;a href="https://www.bitsnbytes.ir/portfolio"&gt;https://www.bitsnbytes.ir/portfolio&lt;/a&gt; or contact me at &lt;a href="mailto:raadi@bitsnbytes.ir"&gt;raadi@bitsnbytes.ir&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>Discuss - UX/UI Design Considerations and Challenges for the Elderly</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Tue, 28 May 2019 16:28:25 +0000</pubDate>
      <link>https://dev.to/mjraadi/discuss-ux-ui-design-considerations-and-challenges-for-the-elderly-2i50</link>
      <guid>https://dev.to/mjraadi/discuss-ux-ui-design-considerations-and-challenges-for-the-elderly-2i50</guid>
      <description>&lt;p&gt;When was the last time you sat down with your (grand)parents and tried to help them learn how to use a new app? Everyone who’s been there can recognize the fascinating (and frustrating) experience in which an elderly user enters this new technological world, and requires explanations for things we deem self-explanatory.&lt;/p&gt;

&lt;p&gt;When it comes to using mobile devices, senior people may have technology anxiety. They may also face some challenges due to vision problems, complex user interface, lack of support system etc.&lt;/p&gt;

&lt;p&gt;I've recently had an idea for a side project which would target senior citizens, elderly people and not so tech savvy individuals. I've been studying and planning for it for a while and I would like to ask you to please share your knowledge, experience and challenges regarding crafting the UX and UI for this audience.&lt;/p&gt;

&lt;p&gt;I would very much appreciate it if you could also reference me to an already-implemented web/mobile application or a design system with the main focus on elders to get a better understanding. &lt;/p&gt;

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

</description>
      <category>discuss</category>
      <category>ux</category>
      <category>ui</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Don't let that huge codebase scare you! Tips and tools to make sense of other people's code</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Sun, 19 May 2019 19:55:35 +0000</pubDate>
      <link>https://dev.to/mjraadi/don-t-let-that-huge-codebase-scare-you-tips-and-tools-to-make-sense-of-other-people-s-code-3lgb</link>
      <guid>https://dev.to/mjraadi/don-t-let-that-huge-codebase-scare-you-tips-and-tools-to-make-sense-of-other-people-s-code-3lgb</guid>
      <description> Image: Cherlat.com, Getty Images/iStockphoto 

&lt;p&gt;There comes a time in every developer's life when they start a new job, join a development team or decide to contribute to an open source project and you’re faced with a new, large, unfamiliar codebase and a bug to fix. The codebase is something of a size you’ve never really seen before but don't worry, I am going to share a few tips and tools for how you can make sense of other people's code without going crazy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You Don't Necessarily Need to Know Everything 🤯&lt;/p&gt;

&lt;p&gt;It was a game changer for me to realize that I simply can’t understand everything. Lots of beginner engineers are ambitious and want to read everything. The spirit is good; however, no, you simply can’t, period. It is important to prioritize what code you want to understand, and what code to skip.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read the Docs 📖&lt;/p&gt;

&lt;p&gt;The first place I start with a new project is reading over any available documentation or README files. This allows me to become familiar with the setup, functions, style, and other important parts of the codebase. Some parts of the documentation might be out of date, but seeing the evolution of code can also help to understand the project’s history. Unfortunately, sometimes, the documentation isn't complete and it may be wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Command Line Search Tools 🔍&lt;/p&gt;

&lt;p&gt;It is not always easy to be immediately effective when you dig for the first time into a codebase containing several thousand of lines. But my secret weapon to find my way through so many lines of code is command line search tools like &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;ack&lt;/code&gt;. Searching for a unique string or keyword is an excellent way to find out where a functionality is located without jumping into a text editor. I'll demonstrate how I use this handy method to immediately find out what file(s) I need to look at to fix a bug. &lt;/p&gt;
&lt;h3&gt;
  
  
  A Practical Takeaway
&lt;/h3&gt;

&lt;p&gt;I've recently started contributing to the DEV source code and I highly recommend everyone to do so as well. It has quite a large &lt;a href="https://github.com/thepracticaldev/dev.to"&gt;codebase&lt;/a&gt; and the maintainers are extremely welcoming. I believe it is a perfect place for junior developers to contribute to the open source and put their knowledge into practice. &lt;br&gt;
I identified a bug and &lt;a href="https://github.com/thepracticaldev/dev.to/issues/2673"&gt;reported the issue&lt;/a&gt;, and I wanted to try to fix the issue myself. Consider that DEV's backend is developed with &lt;code&gt;Ruby&lt;/code&gt; and I am not a Ruby developer but what I needed to fix was the HTML code that was returned to the browser. I had no idea what file I needed to look at or where the function was. &lt;/p&gt;
&lt;h3&gt;
  
  
  Grep
&lt;/h3&gt;

&lt;p&gt;I opened up the dev tools and realized that the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; element in question has a class name of &lt;code&gt;ltag__twitter-tweet__video&lt;/code&gt;. Running the string through &lt;code&gt;grep&lt;/code&gt; I found three files I needed to look at:&lt;br&gt;
&lt;/p&gt;
&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iRl&lt;/span&gt; &lt;span class="s2"&gt;"ltag__twitter-tweet__video"&lt;/span&gt; app/
app/assets/stylesheets/ltags/TweetTag.scss
app/views/liquids/_tweet.html.erb
app/liquid_tags/tweet_tag.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cool, right? The nice benefit of using &lt;code&gt;grep&lt;/code&gt; is that it’s available on pretty much any ‘nix distribution you might use. Its utility is powerful in many different contexts. To learn more about grep, make sure to check out &lt;a href="https://linuxhandbook.com/grep-command-examples"&gt;this post&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://beyondgrep.com"&gt;Ack&lt;/a&gt; is “a tool like grep, optimized for programmers.” It searches recursively by default (i.e., your project) while ignoring VCS directories like .git and has convenient tools that help you explore code with fewer keystrokes. &lt;br&gt;
Taking the same grep example, here’s how we would search for “ltag_&lt;em&gt;twitter-tweet&lt;/em&gt;_video”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ack &lt;span class="s2"&gt;"ltag__twitter-tweet__video"&lt;/span&gt; app/
app/assets/stylesheets/ltags/TweetTag.scss
44:  .ltag__twitter-tweet__video&lt;span class="o"&gt;{&lt;/span&gt;

app/views/liquids/_tweet.html.erb
9:        &amp;lt;div &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ltag__twitter-tweet__video'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

app/liquid_tags/tweet_tag.rb
30:          el.getElementsByClassName&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ltag__twitter-tweet__video"&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;0]   .style.display &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"block"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ack is my trusty search tool of choice and I think you will get a lot of value in using it as a grep replacement. I would highly recommend learning how to use ack. Consider reading &lt;a href="http://conqueringthecommandline.com/book/ack_ag"&gt;this&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Ask! 🙋&lt;/p&gt;

&lt;p&gt;Finally, if you’re still stuck… then ask! A great way to gain knowledge of a project when starting out is to pair with a developer on your team who is more familiar with the codebase. This person can provide high-level insight about particular design patterns, testing, processes, and third-party code that are relevant to the project. They can also give you more historical context about the project and why certain choices were originally made. &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And those are my tips! Hopefully this helps with the daunting task of unfamiliar code. Please try not to stress. Breath, remember these and you’ll be fine!&lt;br&gt;
What ones do you have? I'd love to hear your tips and tricks as well. &lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented and professional freelance developers, where we provide custom web application development services based on cutting-edge technologies, tailored to client's unique business needs.  &lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out my portfolio website at &lt;a href="https://www.bitsnbytes.ir/portfolio"&gt;https://www.bitsnbytes.ir/portfolio&lt;/a&gt; or contact me at &lt;a href="mailto:raadi@bitsnbytes.ir"&gt;raadi@bitsnbytes.ir&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Planning a Real-World Web Application &amp; Key Considerations(Part 1: Project Management)</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Sun, 21 Apr 2019 14:11:59 +0000</pubDate>
      <link>https://dev.to/mjraadi/planning-a-real-world-web-application-key-considerations-part-1-project-management-5f6j</link>
      <guid>https://dev.to/mjraadi/planning-a-real-world-web-application-key-considerations-part-1-project-management-5f6j</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;Planning a non-trivial web application that performs some sort of functionality is something you may have done in the past or are in the midst of doing. However, there are many moving pieces to building a real-world modern web application.&lt;br&gt;
As you get started with your next project, you can save yourself some time and stress by making a proper plan before you even lay a finger on your keyboard. This series of posts document a high-level process to use when planning a modern web application, from project organization, collaboration considerations and tooling choices during development, all the way through deployment and performance strategies. It offers a high-level outline of the main decisions you may have to make, based on solid application-building practices.&lt;br&gt;
There are absolutely many options to choose from for each stage, but I'm going to introduce the most popular ones. This post is going to be highly opinionated so feel free to share your thoughts and correct me if I'm wrong. 🙂&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Considerations
&lt;/h3&gt;

&lt;p&gt;Here's a high-level list of the most important things you need to take into consideration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project Management&lt;/li&gt;
&lt;li&gt;Development Process Methodology&lt;/li&gt;
&lt;li&gt;Accessibility &amp;amp; Internationalization&lt;/li&gt;
&lt;li&gt;Tooling &amp;amp; Development&lt;/li&gt;
&lt;li&gt;Frontend &amp;amp; UX&lt;/li&gt;
&lt;li&gt;Backend API&lt;/li&gt;
&lt;li&gt;Content Management&lt;/li&gt;
&lt;li&gt;Testing &amp;amp; Error Tracking&lt;/li&gt;
&lt;li&gt;Cross-Platform Targeting&lt;/li&gt;
&lt;li&gt;State Management&lt;/li&gt;
&lt;li&gt;Deployment &amp;amp; Performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To have a smooth process when building your application, it’s essential to think ahead and choose options that best support your team and the goals of the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flopginfsuq05lw8unmpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flopginfsuq05lw8unmpd.jpg" width="614" height="368"&gt;&lt;/a&gt;&lt;br&gt;
Do not start writing code before you know what the code needs to accomplish! First, you need to decide how you’re going to get things set up. No matter how exciting it is to start working on a new project, there are still many hurdles the developers and the entire working team have to overcome. As business grows and projects mount, things can easily get out of hand. Many different challenges may arise. Instead of reaching the desired goals, developers might get overwhelmed by the challenges and eventually face the prospect of failure. Developers who are aiming at ambitious projects need to focus on high-quality work and operate under schedule. To make sure that everything runs smoothly, they usually opt for a robust and client-friendly management system tool that will segment the tasks and help the team bridge potential gaps. Here are a few reasons why project management software is useful for business of any size:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Team Collaboration&lt;/p&gt;

&lt;p&gt;When managing a large project, each member is designated with individual tasks in the team. To make sure everyone is on the same page, a project management solution helps in simplifying team collaboration. When a member has inquiries or concerns, he/she can immediately get the right response through communicating with the team internally—with the right people in the right project—without looking for other sources. This reduces time lost in searching for answers. It also optimizes sharing of documents, timelines, and status updates to notify everyone of important information such as how much work is done and how much is left to be finished.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scheduling and Planning&lt;/p&gt;

&lt;p&gt;Without a system in place, it can be difficult for your team to stay within schedule because of the lack of a set guideline on what should be accomplished by who and when. Time is lost when employees report to work without knowing the tasks they should be doing. This often affects one’s productivity. Utilizing the software outlines tasks and makes them visible. Setting deadlines and priorities, along with scheduling, avoids misunderstandings and overlapping of tasks and schedules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Budget management&lt;br&gt;
Each project comes with a cost which is included in a budget along with contingencies and profit. A project manager’s goal is to keep the actual cost below, or at least at, the estimated cost in order to maximize the profit earned by the company for the project. To manage expenses efficiently, simply creating an Excel spreadsheet won’t do the job.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Businesses that are not yet utilizing a PM software are likely to do more work while gaining less profit because of the time wasted on juggling little tasks. If these tasks are taken care of, you and your team will have more time to focus on core operations to complete your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of Project Management Software
&lt;/h3&gt;

&lt;p&gt;There are a lot of PM software programs available that focuses on key features such as tracking and organizing the project management process. Knowing the features you need for your own business is essential in choosing a product to implement in your daily business operations. &lt;a href="https://www.atlassian.com/software/jira" rel="noopener noreferrer"&gt;JIRA&lt;/a&gt;, &lt;a href="https://activecollab.com" rel="noopener noreferrer"&gt;ActiveCollab&lt;/a&gt;, &lt;a href="https://www.wrike.com" rel="noopener noreferrer"&gt;Wrike&lt;/a&gt;, &lt;a href="https://clickup.com" rel="noopener noreferrer"&gt;ClickUp&lt;/a&gt; to name a few.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;If you want to keep your team organised, deliver the best results within desired timelines and budget, and triumph on your next development cycle, having an efficient project management tool is a big help to achieve that goal. It really doesn't matter which tools you choose, it’s essential that your team adopt and use the tools you select. Also, don’t be afraid to monitor the use of these tools and improve your workflow if opportunities for improvement arise. New tools are released all the time and you may wish to adopt emerging tools that provide features that are missing in your current process. It’s natural to adopt different tools as your team matures and your application grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir" rel="noopener noreferrer"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented and professional freelance developers, where we provide custom web application development services based on cutting-edge technologies, tailored to client's unique business needs.  &lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out my portfolio website at &lt;a href="https://www.bitsnbytes.ir/portfolio" rel="noopener noreferrer"&gt;https://www.bitsnbytes.ir/portfolio&lt;/a&gt; or contact me at &lt;a href="mailto:raadi@bitsnbytes.ir"&gt;raadi@bitsnbytes.ir&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>k8h3d Trojan/Botnet Explained &amp; How It Disrupts the Entire Network - Check Your Computers NOW!</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Fri, 12 Apr 2019 05:28:39 +0000</pubDate>
      <link>https://dev.to/mjraadi/k8h3d-trojan-botnet-explained-how-it-disrupts-the-entire-network-check-your-computers-now-48d4</link>
      <guid>https://dev.to/mjraadi/k8h3d-trojan-botnet-explained-how-it-disrupts-the-entire-network-check-your-computers-now-48d4</guid>
      <description>&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;In this post, I will share with you my recent experience troubleshooting a major disruption in my client's network, analyzing &lt;code&gt;k8h3d&lt;/code&gt; Trojan footprints on Microsoft Windows computers, how to defeat it and some practical tips to protect your organization against cyber attacks and avoid becoming a victim of a botnet. &lt;/p&gt;

&lt;h3&gt;
  
  
  What Was the Problem?
&lt;/h3&gt;

&lt;p&gt;Recently my team and I were hired to troubleshoot a client's network to understand why they were having constant unstable Internet connectivity issue and high latency response time. The company was highly dependent on the Internet connectivity and employees were complaining that their computers were very slow and for them to experience these issues were major loss in terms of revenue. They wanted us to fix the problem immediately so we began digging.&lt;/p&gt;

&lt;h3&gt;
  
  
  First Clue
&lt;/h3&gt;

&lt;p&gt;At first, we started by inspecting their network equipment. We carefully went through each switch, access point, firewall and router and they all seemed to be working as expected. However, we noticed a strange amount of connections from TCP port &lt;code&gt;65533&lt;/code&gt; to a certain IP address on the Internet. The high number of connections would cause the routers to become unresponsive and crash repeatedly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Second Clue
&lt;/h3&gt;

&lt;p&gt;Some employees reported that they are suddenly seeing a new user account with the name of &lt;code&gt;k8h3d&lt;/code&gt; on their login screen. It led us to believe that the network might had been compromised by a Trojan malware and it had spread itself across the entire network. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvgxlhx1ax6o3bekk8m72.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%2Fvgxlhx1ax6o3bekk8m72.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting The Dots
&lt;/h3&gt;

&lt;p&gt;We suspected that the computers might had been compromised so we tried to separate the infected hosts from the rest of the network to see if it makes any difference and it did. Everything would go back to normal once they were cut off the network. We then took one of the infected computers to the lab to analyze the malware further. Taking our findings and looking them up on the Internet, we realized that the Trojan first must have had arrived on the system by visiting a malicious website and downloading and executing an Office document. Then it had spread itself via SMB (TCP/445) or MS SQL (TCP/1433) by exploiting the &lt;a href="https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010" rel="noopener noreferrer"&gt;MS17-010&lt;/a&gt; vulnerabilities in Microsoft Windows SMB Server. It would turn the host into a &lt;code&gt;zombie&lt;/code&gt; and would try to spread itself as much as possible to extend its botnet.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a Botnet?
&lt;/h3&gt;

&lt;p&gt;While you can’t get a botnet, you can be part of one without you even knowing it. At their most basic, botnets are made up of large networks of "zombie" computers all obeying one master computer called "Command and Control Center". Once those things are in place, a botnet should be ready to go cause some mayhem. When the the computer is infected by a Trojan, it’ll open up a “backdoor” that will allow the hacker to access and control certain aspects of the connected device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dangers of a Botnet
&lt;/h3&gt;

&lt;p&gt;Your machine and the network will slow down, sometimes significantly. The tasks that botnets usually perform require lots of CPU power and bandwidth, which can make even basic web browsing feel sluggish. Botnet attacks can use basically any system resource, too, meaning you’re sharing your performance with a criminal. The goal isn’t to harm you, but that’s often a consequence. Instead, it’s to use you to harm others.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Defeat &lt;code&gt;k8h3d&lt;/code&gt; Malware
&lt;/h3&gt;

&lt;p&gt;I'm really not sure what this malware is called since I didn't find much information about it, but I just call it &lt;code&gt;k8h3d&lt;/code&gt; malware. The good news is that removing this malware isn't very difficult. All you need to do is to scan and clean your computer by an up to date anti-malware software, remove a few firewall rules, remove some registry keys and clean up some scheduled tasks. You can read more about it &lt;a href="https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/Trojan.Win32.MIMIKATZ.ADU" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Did It Happen?
&lt;/h3&gt;

&lt;p&gt;As we were analyzing the network we found significant number of outdated and un-patched Windows computers connected to the Internet without any protection software. The &lt;a href="https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010" rel="noopener noreferrer"&gt;MS17-010&lt;/a&gt; vulnerability has been around for quite some time now and it's crucial to patch those security holes. I believe that the black hat hackers are almost always one step ahead and the least we can do is to take cyber security seriously and make sure we enforce reasonable security policies.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Stay Safe and Protected
&lt;/h3&gt;

&lt;p&gt;Educating yourself against the threats on the Internet is one of the best lines of defense in your personal cyber security. While traditional Internet Security software programs can catch a lot of the threats before they get to you, it can’t catch all of them. cyber criminals will try any tactic to try to get your personal information, including non-digital methods such as tech support phone scams, tax fraud and social engineering. Here are some tips and best practices for you to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid pop-ups, unknown emails, and links&lt;/li&gt;
&lt;li&gt;Use strong password protection and authentication&lt;/li&gt;
&lt;li&gt;Connect to secure Wi-Fi&lt;/li&gt;
&lt;li&gt;Install security software updates and back up your files&lt;/li&gt;
&lt;li&gt;Enable firewall protection at work and at home&lt;/li&gt;
&lt;li&gt;Invest in security systems&lt;/li&gt;
&lt;li&gt;Consult with your IT department&lt;/li&gt;
&lt;li&gt;Avoid using the same password for every login&lt;/li&gt;
&lt;li&gt;Keep your operating system fully patched and updated&lt;/li&gt;
&lt;li&gt;Keep your personal and private information locked down&lt;/li&gt;
&lt;li&gt;Use a VPN software provider who won't keep a log of your traffic&lt;/li&gt;
&lt;li&gt;And finally take security seriously&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  You Can Be a Hero
&lt;/h3&gt;

&lt;p&gt;Having the right knowledge can help minimize your company’s breach surface. &lt;strong&gt;Remember: just one click on a corrupt link could let in a hacker and one failure to fix a flaw quickly could leave you vulnerable to a cyber attack.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you think I missed a tip or you have a similar story as well, share it with me and the community in the comments section.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a security consultant, full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir" rel="noopener noreferrer"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented professionals, with over 10 years of experience in systems administration, Linux administration, cloud deployments, virtualization, server monitoring, performance tuning and high availability.&lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out &lt;a href="https://www.bitsnbytes.ir/portfolio/sysadmin" rel="noopener noreferrer"&gt;my portfolio website&lt;/a&gt; or contact me at raadi[at]bitsnbytes.ir.&lt;/p&gt;

</description>
      <category>security</category>
      <category>discuss</category>
      <category>tips</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Things You Should Do to Prevent Computer Eye Strain, Personal Health Is Just As Important As Deadlines</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Fri, 05 Apr 2019 17:48:44 +0000</pubDate>
      <link>https://dev.to/mjraadi/things-you-should-do-to-prevent-computer-eye-strain-personal-health-is-just-as-important-as-deadlines-5fe6</link>
      <guid>https://dev.to/mjraadi/things-you-should-do-to-prevent-computer-eye-strain-personal-health-is-just-as-important-as-deadlines-5fe6</guid>
      <description>&lt;p&gt;Think about it — when was the last time you gave the health of your eyes any thought? I’ll confess I never thought, someday eye pain could have an unsettling impact on my productivity and my daily life. Staring at code on a screen or reading through your server's logs for most of the day isn’t quite natural for the human eye, and this is my body’s way of telling me to change my habits. If you are someone like me who won't rest until you fix that damn bug, I found some helpful ways to help me stay healthier and a few apps to make me relax my eyes more throughout the day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adjust Your Lighting
&lt;/h3&gt;

&lt;p&gt;Making sure that your work-space is properly lighted is important for your mood as well as your eyes. Try and work in natural light whenever possible, ideally with the window to your side instead of directly in front or behind you, and use blinds to reduce glare. I used to work in a somewhat low-light place without any natural light and it caused me constant headaches and eye pain. I'm glad those days are over.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adjust Your Monitor’s Position
&lt;/h3&gt;

&lt;p&gt;For optimal comfort, your screen should be between 20–30 inches away from your eyes. Also, the top of your monitor should be at eye level. It will also help you prevent neck pain in the long run. If you're using your laptop as your main development computer, make sure you put it on a stand and push it a little away from you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Splash Cold Water on your Eyes
&lt;/h3&gt;

&lt;p&gt;This will relax your eyes and remove any dryness that might have set in. I found this very useful since it makes me get up, get away from my desk, stretch a little and make my eyes feel rested.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practice the 20–20–20 Rule
&lt;/h3&gt;

&lt;p&gt;I'm sure you've heard about this and this in fact is a helpful method to give your eyes a small break. The rule suggests that after every 20 minutes of using the computer, take at least 20 seconds to look at objects that are 20 feet away from you. Although, It's not always possible to find an object 20 feet away, I believe what it all comes down to is giving your eyes a break every once in a while. &lt;/p&gt;

&lt;h3&gt;
  
  
  Finally, Use a Break Reminder App
&lt;/h3&gt;

&lt;p&gt;So it’s a good idea to take breaks regularly, but when you’re in the thick of something it can be easy to forget. Happily, there are very good break reminders out there for you to use. Some offer notifications, some make a sound and some just prevent you from getting on with your work for a short time. Here are two free and open source break reminders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/slgobinath/SafeEyes" rel="noopener noreferrer"&gt;Safe Eyes&lt;/a&gt; (Available For Linux)&lt;/p&gt;

&lt;p&gt;This is my absolute favorite because I was looking for something more enforcing than just a notification or a sound. Check out &lt;a href="https://github.com/slgobinath/SafeEyes" rel="noopener noreferrer"&gt;their GitHub page&lt;/a&gt; for instructions on how to install it. There is instruction on every major Linux distribution.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhutwsnpsirc97rlswt30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhutwsnpsirc97rlswt30.png" alt="SafeEyes" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/hovancik/stretchly" rel="noopener noreferrer"&gt;Stretchly&lt;/a&gt; (Available For Linux/Mac/Windows)&lt;/p&gt;

&lt;p&gt;Stretchly is a cross-platform electron app which is designed to be easy to use. Here's their &lt;a href="https://github.com/hovancik/stretchly" rel="noopener noreferrer"&gt;GitHub page&lt;/a&gt; to check it out.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlzpsrylzejwvabw7epn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlzpsrylzejwvabw7epn.png" alt="Stretchly" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully this has helped you understand how easy (and important) it is to look after your eyes as part of your overall health. If you liked this post, please share it with others to help them stay healthier. If you have any other tips or ways that work for you, feel free to let me know in the comments section.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir" rel="noopener noreferrer"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented and professional freelance developers, where we provide custom web application development services based on cutting-edge technologies, tailored to client's unique business needs.  &lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out my portfolio website at &lt;a href="https://www.bitsnbytes.ir/portfolio" rel="noopener noreferrer"&gt;https://www.bitsnbytes.ir/portfolio&lt;/a&gt; or contact me at &lt;a href="mailto:raadi@bitsnbytes.ir"&gt;raadi@bitsnbytes.ir&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>advice</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Updated] Simplify the require/import paths in your project and avoid ../../../  circles of hell</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Fri, 29 Mar 2019 17:41:11 +0000</pubDate>
      <link>https://dev.to/mjraadi/simplify-the-require-import-paths-in-your-project-and-avoid-circles-of-hell-51bj</link>
      <guid>https://dev.to/mjraadi/simplify-the-require-import-paths-in-your-project-and-avoid-circles-of-hell-51bj</guid>
      <description>&lt;p&gt;Do you hate seeing ../../../ everywhere in your code? Come along and I'll show you why you should use &lt;code&gt;babel-plugin-module-resolver&lt;/code&gt; to work faster and write cleaner code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Update 1 (3/31/19):
&lt;/h4&gt;

&lt;p&gt;As Pavel Lokhmakov suggested, I've created a new GitHub repo &lt;a href="https://github.com/mjraadi/babel-plugin-module-resolver-customize-cra"&gt;here&lt;/a&gt; to achieve the functionality explained in this post without the need to &lt;code&gt;eject&lt;/code&gt; the app. &lt;br&gt;
&lt;a href="https://github.com/timarney/react-app-rewired"&gt;&lt;code&gt;react-app-rewired&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/arackaf/customize-cra"&gt;&lt;code&gt;customize-cra&lt;/code&gt;&lt;/a&gt; are both libraries which let you tweak the &lt;code&gt;create-react-app&lt;/code&gt; webpack/babel config(s) without using 'eject'.&lt;br&gt;
Simply install these packages as dev dependencies and create a new file called &lt;code&gt;config-overrides.js&lt;/code&gt; in the project's root directory and put your custom config there. Then all you have to do is to update your npm scrips according to &lt;code&gt;react-app-rewired&lt;/code&gt; docs.&lt;/p&gt;
&lt;h4&gt;
  
  
  The Inspiration
&lt;/h4&gt;

&lt;p&gt;I never liked writing code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;NavBar&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../components/NavBar&lt;/span&gt;&lt;span class="dl"&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 me it seemed very confusing, not clean and not maintainable. Imagine somewhere down the line, you needed to alter your project's directory structure. You would have to go through every file and update your code to reflect your changes. Talk about non-maintainabilty!&lt;br&gt;
But I loved the way I would import packages from the &lt;code&gt;node_modules&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ES6 import syntax&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Fragment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// CommonJS require syntax&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nodemailer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&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;nodemailer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I was eager to find a way to import/require my custom modules/components just like this. &lt;a href="https://github.com/tleunen/babel-plugin-module-resolver"&gt;&lt;code&gt;babel-plugin-module-resolver&lt;/code&gt;&lt;/a&gt; to the rescue!&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;You can find the GitHub repos associated with this article:&lt;br&gt;
&lt;a href="https://github.com/mjraadi/babel-plugin-module-resolver-test-app"&gt;https://github.com/mjraadi/babel-plugin-module-resolver-test-app&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/mjraadi/babel-plugin-module-resolver-customize-cra"&gt;https://github.com/mjraadi/babel-plugin-module-resolver-customize-cra&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  What does it do?
&lt;/h4&gt;

&lt;p&gt;I'll let the plugin author explain:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This plugin can simplify the require/import paths in your project. For example, instead of using complex relative paths like &lt;code&gt;../../../../utils/my-utils&lt;/code&gt;, you can write &lt;code&gt;utils/my-utils&lt;/code&gt;. It will allow you to work faster since you won't need to calculate how many levels of directory you have to go up before accessing the file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In case you don't know what &lt;code&gt;babel&lt;/code&gt; is, it's a JavaScript compiler which is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments. If you're building an app with &lt;code&gt;create-react-app&lt;/code&gt; or similar libraries, they're using babel behind the scene.&lt;/p&gt;
&lt;h4&gt;
  
  
  Let's get started
&lt;/h4&gt;

&lt;p&gt;Here I will show you how you can use this plugin in an app created by &lt;code&gt;create-react-app&lt;/code&gt;. Create a new app with the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ create-react-app babel-plugin-module-resolver-test-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;create-react-app&lt;/code&gt; encapsulates the project setup and all the configurations and gives you tools to create production ready apps. Since we need to change babel configuration we need to &lt;code&gt;eject&lt;/code&gt; our app. Ejecting will move &lt;code&gt;create-react-app&lt;/code&gt;’s configuration files and dev/build/test scripts into you app directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: this is a one-way operation. Once you &lt;code&gt;eject&lt;/code&gt;, you can’t go back!&lt;/strong&gt;&lt;br&gt;
It's fine for our use case because we're building a test app. Go ahead and run the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm run eject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm and continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: at the time of writing this post, there is a bug with &lt;code&gt;create-react-app&lt;/code&gt; explained &lt;a href="https://github.com/facebook/create-react-app/issues/6099"&gt;here&lt;/a&gt;. The workaround is to remove the &lt;code&gt;node_modules&lt;/code&gt; directory and reinstall the dependencies again.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install &lt;code&gt;babel-plugin-module-resolver&lt;/code&gt; plugin by executing the following command in your project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install --save-dev babel-plugin-module-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;package.json&lt;/code&gt; file and look for babel config. This is how it looks like after eject:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;babel&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;presets&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-app&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="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to tell babel to use our module resolver and define our root directory and aliases. Edit your babel config section to make it look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;babel&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;presets&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-app&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="s2"&gt;plugins&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="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module-resolver&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src&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="s2"&gt;alias&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dir1&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="s2"&gt;./src/Dir1&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="s2"&gt;dir2&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="s2"&gt;./src/Dir2&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="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create two directories in &lt;code&gt;src&lt;/code&gt; directory called &lt;code&gt;Dir1&lt;/code&gt; and &lt;code&gt;Dir2&lt;/code&gt;. Our defined aliases will point to these directories respectively. &lt;/p&gt;

&lt;p&gt;Create a component file called &lt;code&gt;ComponentA.js&lt;/code&gt; in &lt;code&gt;Dir1&lt;/code&gt; directory and put the code below in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ComponentB&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dir2/ComponentB&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;ComponentA&lt;/span&gt; &lt;span class="o"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;Hello&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ComponentB&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ComponentA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create &lt;code&gt;ComponentB.js&lt;/code&gt; in &lt;code&gt;Dir2&lt;/code&gt; directory with the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&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;ComponentB&lt;/span&gt; &lt;span class="o"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; 
    &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.bitsnbytes.ir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_blank&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noopener noreferrer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;Bits&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="nx"&gt;Bytes&lt;/span&gt; &lt;span class="nx"&gt;Dev&lt;/span&gt; &lt;span class="nx"&gt;Team&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ComponentB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now edit the &lt;code&gt;App.js&lt;/code&gt; file in the &lt;code&gt;src&lt;/code&gt; direcory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logo&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./logo.svg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ComponentA&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dir1/ComponentA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App-logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ComponentA&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/header&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that I didn't have to go up one directory or down another directory to import my components. We're now ready to run our app, run the command bellow in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your app in the browser without any problem. If you have any questions or problems, feel free to comment.&lt;/p&gt;

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

&lt;p&gt;Custom module resolvers will save you time and the frustration of dealing with ../ splattered everywhere. They take a bit to setup and ensure full cooperation with existing tooling, but the result and visual satisfaction of never having to see ../../../../../.. is well worth the initial outlay on big projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  About Me
&lt;/h3&gt;

&lt;p&gt;I am a full stack web developer and co-founder of &lt;a href="https://www.bitsnbytes.ir"&gt;Bits n Bytes Dev Team&lt;/a&gt;, a small group of highly talented and professional freelance developers, where we provide custom web application development services based on cutting-edge technologies, tailored to client's unique business needs.  &lt;/p&gt;

&lt;p&gt;I'm available for hire and you can check out my portfolio website at &lt;a href="https://www.bitsnbytes.ir/portfolio"&gt;https://www.bitsnbytes.ir/portfolio&lt;/a&gt; or contact me at &lt;a href="mailto:raadi@bitsnbytes.ir"&gt;raadi@bitsnbytes.ir&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>babel</category>
      <category>react</category>
    </item>
    <item>
      <title>I'm a web developer who turned a learning side project into his 😍-looking portfolio website. Ask me anything!</title>
      <dc:creator>Mohammadjavad Raadi</dc:creator>
      <pubDate>Sat, 23 Mar 2019 15:15:31 +0000</pubDate>
      <link>https://dev.to/mjraadi/im-a-web-developer-who-turned-a-learning-side-project-into-his--looking-portfolio-website-ask-me-anything-4m3h</link>
      <guid>https://dev.to/mjraadi/im-a-web-developer-who-turned-a-learning-side-project-into-his--looking-portfolio-website-ask-me-anything-4m3h</guid>
      <description>&lt;p&gt;&lt;a href="https://i.giphy.com/media/26xBG8u7iC4PAO4ne/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26xBG8u7iC4PAO4ne/giphy.gif" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All right, all right, all right!🙂 It's a bit long overdue but I finally had enough time to do it. I've been a web developer for almost 3 years now and during this time, I've had the opportunity of learning and building different web applications for variety of clients. I've been mostly using Vue.js for front-end development and Laravel framework for the back-end API. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Inspiration
&lt;/h4&gt;

&lt;p&gt;Last year I decided to learn react.js and see for myself what all the fuss is about and I have to tell you it's been an amazing journey. &lt;br&gt;
The inspiration for learning react and building my multilingual website came from &lt;a href="https://blockchain.com"&gt;Blockchain website&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  How Could They?!!!
&lt;/h4&gt;

&lt;p&gt;The first thing I noticed was that it was developed with react.js but how in the world were they able to make it SEO-friendly, I asked myself. I tried to view the source of the web page and I saw a lot of HTML markup, CSS and JavaScript code. I asked myself if this is an SPA, then what's with all this code? 🤔&lt;/p&gt;

&lt;h4&gt;
  
  
  Digging Deep
&lt;/h4&gt;

&lt;p&gt;At the time, I didn't have any knowledge of &lt;strong&gt;Server Side Rendering&lt;/strong&gt; and all of its glory so I began searching through the Internet and got myself familiar with the idea. Then I found a few boilerplates on GitHub and started building a side-project which in the end resulted in my portfolio website. &lt;/p&gt;

&lt;h4&gt;
  
  
  Thank You Open Source
&lt;/h4&gt;

&lt;p&gt;I would like to give a big shout-out to the developer team at &lt;a href="https://www.creative-tim.com/product/material-kit-react"&gt;Creative Tim&lt;/a&gt; for providing an open source version of their UI kit based on &lt;a href="https://material-ui.com"&gt;Material UI&lt;/a&gt; library.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;Please have a look at what I've built and let me know what you think:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.bitsnbytes.ir"&gt;https://www.bitsnbytes.ir&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Here's a list of everything I've learned or used in this project:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;react.js&lt;/li&gt;
&lt;li&gt;redux&lt;/li&gt;
&lt;li&gt;react router&lt;/li&gt;
&lt;li&gt;node.js&lt;/li&gt;
&lt;li&gt;webpack&lt;/li&gt;
&lt;li&gt;react-intl&lt;/li&gt;
&lt;li&gt;material-ui&lt;/li&gt;
&lt;li&gt;express&lt;/li&gt;
&lt;li&gt;formik&lt;/li&gt;
&lt;li&gt;yup&lt;/li&gt;
&lt;li&gt;react-helment&lt;/li&gt;
&lt;li&gt;jss&lt;/li&gt;
&lt;li&gt;nodemailer&lt;/li&gt;
&lt;li&gt;deployment&lt;/li&gt;
&lt;li&gt;pm2&lt;/li&gt;
&lt;li&gt;SEO best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Have something to say or got any questions? Then go on ahead!
&lt;/h4&gt;

</description>
      <category>react</category>
      <category>portfolio</category>
      <category>ama</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
