<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hozefa</title>
    <description>The latest articles on Forem by Hozefa (@hozefaj).</description>
    <link>https://forem.com/hozefaj</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%2F136641%2F265fb458-98e6-40bf-9dcb-da71ba307749.jpeg</url>
      <title>Forem: Hozefa</title>
      <link>https://forem.com/hozefaj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hozefaj"/>
    <language>en</language>
    <item>
      <title>Investing setup for software engineers</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Sat, 09 Jan 2021 20:48:53 +0000</pubDate>
      <link>https://forem.com/hozefaj/investing-setup-for-software-engineers-4l44</link>
      <guid>https://forem.com/hozefaj/investing-setup-for-software-engineers-4l44</guid>
      <description>&lt;p&gt;Before we get started here, I want to call out that this post applies mostly to software engineers. But the basic principles can be used by anyone earning a salary greater than $75k per year.&lt;/p&gt;

&lt;p&gt;As software engineers, we are very adept at writing code. This helps folks earn a good living. In order to secure our family's future, it's important to make sure we invest the excess cash we have. The idea here is a "Set up once and forget".&lt;/p&gt;

&lt;p&gt;Below I have outlined some steps that have worked well for me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emergency Fund&lt;/strong&gt;: You should have about 6-9 months of your expenses, which would include your house payment or rent, property tax(if applicable), kids schooling, food, car payments/expenses, etc. The disadvantage with holding liquid cash is that it's a depreciating asset against inflation. You can use a high yielding saving account or any other safe and liquid investment vehicle to balance against inflation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;401k&lt;/strong&gt;: 401k is an employer-sponsored retirement plan. If your employer offers one, you should contribute to it. If your employer matches a certain percentage of the amount (typically companies do a dollar to dollar match up to a certain % of contributions), you should maximize and take full advantage of the match amount. IRS sets the maximum limit that you can invest every year, try to max it out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backdoor Roth IRA&lt;/strong&gt;: A Roth IRA is a retirement account where you pay taxes on money going into your account, and then all future withdrawals are tax-free. If your employer offers a 401k and depending upon your income, you might NOT be eligible to invest in an IRA. In that case, a backdoor Roth IRA is a great investment vehicle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;529 Plan&lt;/strong&gt;: If you have kids, opening a 529 account for your kid(s) is definitely something I would recommend. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post-tax money is put into the account, however, the withdrawals are tax-free provided they are used for educational purposes. &lt;/li&gt;
&lt;li&gt;Set up regular recurring contributions like bi-weekly or monthly. This also helps to balance out any big changes in the market&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brokerage Account&lt;/strong&gt;: My advice is not to invest in individual stocks. I have tried it and it's not worth the time and energy. Keep investing in low-cost index funds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delegate this to robo advisors like Wealthfront or Betterment to invest for you. They offer portfolio rebalancing, tax-loss harvesting, diversified portfolio at a very reasonable fee(0.25%). Invest in recurring cadence. &lt;em&gt;Don't try to time the market&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If you want to get your hands dirty with individual stocks trades, limit yourself to not doing so beyond 10% of your worth.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HSA&lt;/strong&gt;: HSA is a Health Saving Account offered when you take a high deductible plan for your health insurance. If you are young, in good health, and don't foresee any big medical expenses in near future my recommendation is to take on an HSA.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can contribute pre-tax dollars to your HSA account.&lt;/li&gt;
&lt;li&gt;HSA is portable, which means that if an employee changes jobs, they can still keep their HSA. In addition, an HSA plan can be transferred to a surviving spouse tax-free upon the death of the account holder&lt;/li&gt;
&lt;li&gt;Medical expenses can be paid using the HSA account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a high-level overview of the saving/investment side of things. There is another aspect of spending which I will cover in another post.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am not a Certified Investment Advisor
This is information based on personal research and experience.
Please do your own independent research and / or consult a Financial Advisor as you see fit.
This is focused on US retirement account structures &amp;amp; taxes. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>finance</category>
      <category>investing</category>
      <category>money</category>
      <category>retirement</category>
    </item>
    <item>
      <title>Common Git Alias</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Thu, 28 May 2020 05:42:24 +0000</pubDate>
      <link>https://forem.com/hozefaj/common-git-alias-4da7</link>
      <guid>https://forem.com/hozefaj/common-git-alias-4da7</guid>
      <description>&lt;p&gt;This posts will help you understand what a &lt;code&gt;git&lt;/code&gt; alias is and some of the basic ones I use.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's a &lt;code&gt;git&lt;/code&gt; alias?
&lt;/h3&gt;

&lt;p&gt;In the computer science domain, alias means an alternative name or label that refers to a file, command, address, or other items, and can be used to locate or access it.&lt;/p&gt;

&lt;p&gt;So, basically with &lt;code&gt;git&lt;/code&gt; alias, the idea is that you create shorter alias for the most commonly used commands, to reduce the amount of typing that you do.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use them?
&lt;/h3&gt;

&lt;p&gt;To use them, add the commands to your &lt;code&gt;.bash_profile&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.gitconfig&lt;/code&gt; file. Once you add them run the &lt;code&gt;source .bash_profile&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;You can add them by using &lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases"&gt;command line&lt;/a&gt; also, but would not recommend it as it would be very verbose and difficult to manage over time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git config --global alias.co checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias gc='git checkout'
alias gcm='git commit -m'
alias gs='git status'
alias ga='git add --all'
alias gp='git pull --rebase'
alias gb='git branch -vv'
alias gr='git remote -v'
alias grt='git reset --hard'
alias gpub='git push origin master'
alias grp='git rebase master'
alias gd='git branch -D'
alias gm='git merge'
alias gmx='git merge -X theirs'
alias gk='gitk &amp;amp;'
alias gda='git branch | grep -v "develop" | grep -v "release" | xargs git branch -D'
alias gf='git fetch'
alias gl='git log -3'

# cleans all branches locally that have already been merged.
alias gcmb="git branch --merged | grep -Ev '(^\*|develop)' | xargs git branch -d"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another good resource here to enable a quicker workflow I also use the &lt;a href="https://github.com/tj/git-extras"&gt;&lt;code&gt;git-extras&lt;/code&gt;&lt;/a&gt;. It allows an abstraction on more complicated git workflows.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>My Home Office setup</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Mon, 18 May 2020 20:30:05 +0000</pubDate>
      <link>https://forem.com/hozefaj/my-home-office-setup-3hdh</link>
      <guid>https://forem.com/hozefaj/my-home-office-setup-3hdh</guid>
      <description>&lt;p&gt;With the current situation for COVID-19, we all working from home there is now a need to set up proper workstations. It is not possible to have a makeshift place anymore. Not only it helps with productivity but it also will prevent any ergonomic issues.&lt;/p&gt;

&lt;p&gt;For my workstation, along with utility I have tried to keep it economical as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table
&lt;/h3&gt;

&lt;p&gt;I am using SHW Electric Height Adjustable Computer Desk that I got from Amazon. It has a good range of motion and feels sturdy. As I am trying to keep costs down, this is a basic model I went with. &lt;em&gt;Plus it had good reviews also.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/SHW-Electric-Height-Adjustable-Computer/dp/B07GVRKCWP/ref=as_li_ss_il?dchild=1&amp;amp;keywords=Tresanti&amp;amp;qid=1589832486&amp;amp;sr=8-16&amp;amp;linkCode=li3&amp;amp;tag=ummuld04-20&amp;amp;linkId=3623f33188211a7e2dbb41eb37190c4c&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07GVRKCWP&amp;amp;Format=_SL250_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a5TsYUAL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07GVRKCWP" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a5TsYUAL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07GVRKCWP" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another way of creating a standing desk is using a wooden counter table top(&lt;a href="https://www.ikea.com/us/en/p/saeljan-countertop-oak-effect-laminate-80439214/"&gt;IKEA&lt;/a&gt; one is popular) and then either placing it on cabinet unit or you can get a &lt;a href="https://amzn.to/2zclwgH"&gt;desk frame&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chair
&lt;/h3&gt;

&lt;p&gt;It's an ergonomic chair with variety of adjustments for personal preference. Have used the same chair at my office also, so petty comfortable with it. It's great value for money.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Office-Star-FreeFlex-Adjustable-Multi-Function/dp/B00450P182/ref=as_li_ss_il?dchild=1&amp;amp;keywords=office+star+pro-line+ii+deluxe+adjustable+airgrid+back&amp;amp;qid=1589778804&amp;amp;sr=8-1&amp;amp;th=1&amp;amp;linkCode=li3&amp;amp;tag=ummuld04-20&amp;amp;linkId=04140fdf96c75609ea68b64947d974a7&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B00450P182&amp;amp;Format=_SL250_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---G7F3r8E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB00450P182" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---G7F3r8E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB00450P182" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitor
&lt;/h3&gt;

&lt;p&gt;Its a HP Pavilion 27-inch LED monitor. It has a resolution of 1920 x 1080p @ 60 Hz. For day to day usage it works well for things like email, coding and watching Youtube or Netflix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/HP-Pavilion-27-inch-Backlight-27xw/dp/B0199W9UMS/ref=as_li_ss_il?ie=UTF8&amp;amp;linkCode=li3&amp;amp;tag=&amp;amp;linkId=68e6ec0ea3a07fde2beda9f45adc2830&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B0199W9UMS&amp;amp;Format=_SL250_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hGHnrQ71--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3D%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB0199W9UMS" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hGHnrQ71--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3D%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB0199W9UMS" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With monitors there are tons of choices, but I recommend buying at a minimum a 27". &lt;/p&gt;

&lt;h3&gt;
  
  
  USB Hub
&lt;/h3&gt;

&lt;p&gt;Anker 5-1 USB-C hub. It adds 2 USB-A ports, 1 HDMI port, a micro SD card slot, and an SD card slot to your MacBook — all from a single USB-C port.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/gp/product/B07H4VQ4BZ/ref=as_li_ss_il?ie=UTF8&amp;amp;psc=1&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=0da64864c9b68532750f8d3a5ac6a08f&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07H4VQ4BZ&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kpge6AUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07H4VQ4BZ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kpge6AUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07H4VQ4BZ" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laptop Stand
&lt;/h3&gt;

&lt;p&gt;This allows the laptop and monitor to be at the same height. I use the laptop for meetings where I need video.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/gp/product/B07D74DT3B/ref=as_li_ss_il?pf_rd_r=HJE8ZCXYA5H17E5WBXYF&amp;amp;pf_rd_p=edaba0ee-c2fe-4124-9f5d-b31d6b1bfbee&amp;amp;linkCode=li3&amp;amp;tag=ummuld04-20&amp;amp;linkId=cb56677ca6da6bdd006d244100451c1e&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07D74DT3B&amp;amp;Format=_SL250_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VqzFRHI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07D74DT3B" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VqzFRHI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07D74DT3B" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Keyboard
&lt;/h3&gt;

&lt;p&gt;Standard Apple Magic keyboard. Much better typing experience than with the magic keyboard on the macbook pro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Apple-Keyboard-Wireless-Rechargable-English/dp/B016QO64FI/ref=as_li_ss_il?crid=1ZUOD13HJT91A&amp;amp;dchild=1&amp;amp;keywords=magic+keyboard&amp;amp;qid=1589779044&amp;amp;s=electronics&amp;amp;sprefix=magic+,electronics,209&amp;amp;sr=1-4&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=4f055e06d45dc99f93a09c068a960224&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B016QO64FI&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HY4kU3Z3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB016QO64FI" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HY4kU3Z3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB016QO64FI" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Trackpad
&lt;/h3&gt;

&lt;p&gt;I love Apple Trackpad over their mouse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Apple-Magic-Trackpad-Wireless-Rechargable/dp/B016QO5YWC/ref=as_li_ss_il?crid=2KOI81L93MGM1&amp;amp;dchild=1&amp;amp;keywords=trackpad&amp;amp;qid=1589779089&amp;amp;s=electronics&amp;amp;sprefix=trackpad,electronics,231&amp;amp;sr=1-3&amp;amp;th=1&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=5a287bcada377fa4214781236c41261a&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B016QO5YWC&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gE27dbbP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB016QO5YWC" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gE27dbbP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB016QO5YWC" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Airpods
&lt;/h3&gt;

&lt;p&gt;Given I am on the Apple eco-system(iPhone, macbook) it made sense to get them. Like how well they are integrated into the iCloud eco-system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/Apple-AirPods-Charging-Latest-Model/dp/B07PXGQC1Q/ref=as_li_ss_il?dchild=1&amp;amp;keywords=airpods&amp;amp;qid=1589779127&amp;amp;s=electronics&amp;amp;sr=1-3&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=b7b5f8c22a03b018a09e57ce28493d8b&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07PXGQC1Q&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y824AxpU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07PXGQC1Q" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y824AxpU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB07PXGQC1Q" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Footrest
&lt;/h3&gt;

&lt;p&gt;A textured surface massages the soles of your feet for stress reduction. Two-position height adjustment with tilting platform allows for optimum comfort.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/gp/product/B00006I62X/ref=as_li_ss_il?ie=UTF8&amp;amp;psc=1&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=3d012aab46a8efae4182dfa76b1bf80b&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B00006I62X&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CqtV6-sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00006I62X" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CqtV6-sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB00006I62X" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  iPhone Stand
&lt;/h3&gt;

&lt;p&gt;I also use an iPhone to house the phone while working. Added benefit is that it gets charged(its not wireless though 😉).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/gp/product/B014INJCT4/ref=as_li_ss_il?ie=UTF8&amp;amp;psc=1&amp;amp;linkCode=li2&amp;amp;tag=ummuld04-20&amp;amp;linkId=b741e6d621cb7c9f61a1860b6f5e444f&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B014INJCT4&amp;amp;Format=_SL160_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oWueAlZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB014INJCT4" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oWueAlZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli2%26o%3D1%26a%3DB014INJCT4" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pegboard + container
&lt;/h3&gt;

&lt;p&gt;I also added a &lt;a href="https://www.ikea.com/us/en/search/products/?q=skadis%20pegboard"&gt;pegboard&lt;/a&gt; &amp;amp; &lt;a href="https://www.ikea.com/us/en/p/skadis-container-assorted-colors-90456463/"&gt;container&lt;/a&gt; to store cables and other random things around.&lt;/p&gt;

&lt;h3&gt;
  
  
  Printer
&lt;/h3&gt;

&lt;p&gt;With WFH for an extended period of time, I went ahead and bought a printer also. I use it for printing any official documents. Another use I am getting out it is printing worksheets for my kids.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com/HP-DeskJet-Wireless-Printing-Replenishment/dp/B07H4V9R4D/ref=as_li_ss_il?dchild=1&amp;amp;keywords=HP+DeskJet+3755&amp;amp;qid=1591291657&amp;amp;sr=8-3&amp;amp;linkCode=li3&amp;amp;tag=ummuld04-20&amp;amp;linkId=f6d576655fa8bfb01bcb007b2ced0891&amp;amp;language=en_US"&gt;&lt;img src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;amp;ASIN=B07H4V9R4D&amp;amp;Format=_SL250_&amp;amp;ID=AsinImage&amp;amp;MarketPlace=US&amp;amp;ServiceVersion=20070822&amp;amp;WS=1&amp;amp;tag=ummuld04-20&amp;amp;language=en_US"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aac63QNI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07H4V9R4D" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aac63QNI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ir-na.amazon-adsystem.com/e/ir%3Ft%3Dummuld04-20%26language%3Den_US%26l%3Dli3%26o%3D1%26a%3DB07H4V9R4D" alt="" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other things I keep handy are a notepad and stickes to take quick notes.&lt;/p&gt;

</description>
      <category>workstations</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Fully Accessible Accordion with HTML &amp; CSS(no JS)</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Sat, 24 Aug 2019 17:31:49 +0000</pubDate>
      <link>https://forem.com/hozefaj/fully-accessible-accordion-with-html-css-no-js-59n9</link>
      <guid>https://forem.com/hozefaj/fully-accessible-accordion-with-html-css-no-js-59n9</guid>
      <description>&lt;p&gt;Recently I came across &lt;code&gt;details&lt;/code&gt; and &lt;code&gt;summary&lt;/code&gt; HTML tags. Their basic use is to create an accordion-type UX out of the box.&lt;/p&gt;

&lt;p&gt;I have previously worked on creating an accordion-like structure using &lt;code&gt;div&lt;/code&gt; and &lt;code&gt;span&lt;/code&gt; and JS to handle opening and closing. On the JS there is logic to keep track which element is open if the user clicks on another one close all and open clicked one. Over time this can get complicated.&lt;/p&gt;

&lt;p&gt;Having discovered these tags, I worked a prototype to achieve the functionality with plain HTML &amp;amp; CSS&lt;/p&gt;

&lt;p&gt;Let's go over the steps for that&lt;/p&gt;

&lt;p&gt;&lt;code&gt;details&lt;/code&gt; tag is the parent, where the below 2 tags are enclosed.&lt;br&gt;
&lt;code&gt;summary&lt;/code&gt; tag is where the headline users see by default(like a question for FAQ's) is held.&lt;br&gt;
&lt;code&gt;p&lt;/code&gt; or &lt;code&gt;div&lt;/code&gt; can be the response(answer for FAQ's) or more details around the headline.&lt;/p&gt;

&lt;p&gt;Every browser supports the accordion-style arrow out of the box. The good part here is that using CSS we can style it however we choose.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fovmpr3bdtauaizikgt6u.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fovmpr3bdtauaizikgt6u.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let try to style it how we choose. I decided to do see if I can replicate the pattern we have at PayPal.&lt;/p&gt;

&lt;p&gt;To do this, we first need to hide the browser's default &lt;code&gt;marker&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="nd"&gt;::-webkit-details-marker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&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;Next step, in my case, add styles for open &amp;amp; close arrows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;creates&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;close&lt;/span&gt; &lt;span class="nt"&gt;arrow&lt;/span&gt;
&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;45deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="m"&gt;0.3s&lt;/span&gt; &lt;span class="n"&gt;ease-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#cbd2d6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#cbd2d6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;creates&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;open&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;inverted&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;arrow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;open&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-135deg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&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;On the &lt;code&gt;details&lt;/code&gt; tag, there is also an option to have it open by default. Use the &lt;code&gt;open&lt;/code&gt; attribute to do that. Goes like &lt;code&gt;&amp;lt;details open&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/accordion-with-details-tag-vqwsb"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Other than Edge &amp;amp; IE(of course) all other &lt;a href="https://caniuse.com/#search=details" rel="noopener noreferrer"&gt;browsers support these tags&lt;/a&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4rybcsci0hoiks60blwd.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4rybcsci0hoiks60blwd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is basic(getting starter) guide. For more detailed and advanced examples I recommend &lt;a href="https://css-tricks.com/quick-reminder-that-details-summary-is-the-easiest-way-ever-to-make-an-accordion/" rel="noopener noreferrer"&gt;this article&lt;/a&gt; on CSS Tricks.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>semantic</category>
      <category>accessible</category>
    </item>
    <item>
      <title>JS 2019 features I am excited about</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Fri, 09 Aug 2019 23:23:59 +0000</pubDate>
      <link>https://forem.com/hozefaj/js-2019-features-i-am-excited-about-39n8</link>
      <guid>https://forem.com/hozefaj/js-2019-features-i-am-excited-about-39n8</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/tc39/proposals"&gt;TC39&lt;/a&gt; over the past few years have been giving yearly updates to the JS. This works much better than throwing a ton of updates very years. This gives developers an opportunity to learn in a better and even from the browser point of view making the features available. &lt;/p&gt;

&lt;p&gt;From the 2019 feature set, below are a few that I am most excited about.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;trimStart()&lt;/code&gt; and &lt;code&gt;trimEnd()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Added on the &lt;code&gt;String&lt;/code&gt; prototype&lt;/p&gt;

&lt;p&gt;This allows trimming of whitespace at the start and end of a string. We already have the &lt;code&gt;trim()&lt;/code&gt; function but this does it at both ends. There can be a use case where you might keep the whitespace at either end.&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;paddedStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; How new trim functions work &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;paddedStr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trimStart&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// prints 'How new trim functions work '&lt;/span&gt;
&lt;span class="nx"&gt;paddedStr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trimEnd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// prints ' How new trim functions work'&lt;/span&gt;
&lt;span class="nx"&gt;paddedStr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// prints 'How new trim functions work'&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;code&gt;flat()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Added on the &lt;code&gt;Array&lt;/code&gt; prototype&lt;/p&gt;

&lt;p&gt;This helps with flattening of multi-dimensional arrays. It takes an optional parameter that tells the function how many levels deep we want to flatten. The default value is 1.&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;oneLevelNesting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bread&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="s1"&gt;peanut butter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jelly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bread&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;oneLevelNesting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// ['bread', 'peanut butter', 'jelly', 'bread']&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;twoLevelNesting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bread&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="s1"&gt;peanuts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oil&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="s1"&gt;strawberries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sugar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bread&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;twoLevelNesting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;//  ['bread', ['peanuts', 'oil'], ['strawberries', 'sugar'], 'bread']&lt;/span&gt;
&lt;span class="nx"&gt;twoLevelNesting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ['bread', 'peanuts', 'oil', 'strawberries', 'sugar', 'bread']&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Optional &lt;code&gt;catch&lt;/code&gt; binding
&lt;/h3&gt;

&lt;p&gt;Optional catch binding allows you to write a try/catch without having to use the error parameter with &lt;code&gt;catch&lt;/code&gt;.&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;//before&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not using the error parameter here but have to include it&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// after&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;doSomethingElse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No param? No Problem!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are other features other than these like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap"&gt;&lt;code&gt;flapMap()&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries"&gt;&lt;code&gt;Object.fromEntries&lt;/code&gt;&lt;/a&gt;, another one is adding a description to &lt;code&gt;Symbol&lt;/code&gt; property. Personally, I have not found the need for these in my experience.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For a deeper understanding of all these features I recommend watching &lt;a href="https://egghead.io/courses/javascript-es2019-in-practice"&gt;&lt;code&gt;javascript-es2019-in-practice&lt;/code&gt;&lt;/a&gt; on egghead.io.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear thoughts of others on what features are they most excited about.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>es2019</category>
    </item>
    <item>
      <title>Obscure, but useful git commands</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Fri, 22 Mar 2019 05:07:19 +0000</pubDate>
      <link>https://forem.com/hozefaj/obscure-but-useful-git-commands--21nb</link>
      <guid>https://forem.com/hozefaj/obscure-but-useful-git-commands--21nb</guid>
      <description>&lt;p&gt;&lt;code&gt;git&lt;/code&gt; is pretty much the defacto source tool used across the industry. Most engineers either use the &lt;code&gt;git&lt;/code&gt; CLI or GUI based tools like &lt;a href="https://www.gitkraken.com/" rel="noopener noreferrer"&gt;git-kraken&lt;/a&gt; or &lt;a href="https://www.sourcetreeapp.com/" rel="noopener noreferrer"&gt;sourcetree&lt;/a&gt;. Most editors like VSCode have &lt;code&gt;git&lt;/code&gt; functionality out of the box.&lt;/p&gt;

&lt;p&gt;For folks like me who prefer using the CLI for git, most know the common git commands like &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git checkout&lt;/code&gt;, &lt;code&gt;git status&lt;/code&gt; etc...&lt;/p&gt;

&lt;p&gt;Over the years have come across a few &lt;code&gt;git&lt;/code&gt; commands that not widely known but have proven to be useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pretty Git Log
&lt;/h3&gt;

&lt;p&gt;Most folks used &lt;code&gt;git log&lt;/code&gt; to see the recent commit history. But by default, it's not in the most useful format to consume.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4sj60njkv0fji2jab5h2.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4sj60njkv0fji2jab5h2.png" alt="git-log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, tweaking the &lt;code&gt;.gitconfig&lt;/code&gt;* file to set up an alias and pretty format it.&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="c"&gt;# setup alias in the .gitconfig file&lt;/span&gt;
lg &lt;span class="o"&gt;=&lt;/span&gt; log &lt;span class="nt"&gt;--color&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s1"&gt;'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset'&lt;/span&gt; &lt;span class="nt"&gt;--abbrev-commit&lt;/span&gt; &lt;span class="nt"&gt;--branches&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Formatted text after the alias is setup&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fngkq5ryxe6wxmwwn500o.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fngkq5ryxe6wxmwwn500o.png" alt="git-log-pretty"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Force Push to Remote
&lt;/h3&gt;

&lt;p&gt;When working on a feature branch, generally one will &lt;code&gt;rebase&lt;/code&gt; from &lt;code&gt;master&lt;/code&gt; branch. This rewrites the commit history of the feature branch. If the feature branch is already pushed to a &lt;code&gt;remote&lt;/code&gt;, we have to use the &lt;code&gt;git push --force&lt;/code&gt; to push changes to a remote.&lt;/p&gt;

&lt;p&gt;However in this case, if someone else from the team has also pushed any change to the branch it will be lost. Instead of using &lt;code&gt;--force&lt;/code&gt; rather use &lt;code&gt;--force-with-lease&lt;/code&gt;. This will check with someone else pushed commits to the same branch and prevent overwriting of commits.&lt;/p&gt;




&lt;h3&gt;
  
  
  Squash Commits
&lt;/h3&gt;

&lt;p&gt;When working on a feature branch there would be multiple commits before its ready for a PR. However, for the sake of keeping things clean, you do not want these multiple commits to be in the PR. &lt;/p&gt;

&lt;p&gt;Best way to do this is &lt;code&gt;squash&lt;/code&gt; the commits into a single one. Use the command &lt;code&gt;git  rebase -i &amp;lt;sha-id of master&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will open an interactive editor where one can pick which commits to keep and which to squash. Also, the messages for commits can be edited.&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%2Fres.cloudinary.com%2Fdg3gyk0gu%2Fimage%2Fupload%2Fv1550272144%2Ftranscript-images%2Fpolish-my-git-feature-branch-before-merging-or-submitting-for-review-git-rebase.jpg" 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%2Fres.cloudinary.com%2Fdg3gyk0gu%2Fimage%2Fupload%2Fv1550272144%2Ftranscript-images%2Fpolish-my-git-feature-branch-before-merging-or-submitting-for-review-git-rebase.jpg" alt="git-squash"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Stashing
&lt;/h3&gt;

&lt;p&gt;When you need to move to a different while work on the current branch is not complete, &lt;code&gt;git stash&lt;/code&gt; is a good command to use.&lt;/p&gt;

&lt;p&gt;Another time this feature is also very useful when let's say the &lt;code&gt;master&lt;/code&gt; branch has some updates you need on the feature branch. In this case, using &lt;code&gt;git pull master --rebase --autostash&lt;/code&gt; is to be used. This command automatically stashed the code, pulls down latest from master, &lt;code&gt;rebase&lt;/code&gt; aganist it and &lt;code&gt;pop&lt;/code&gt;'s the stash out.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cleanup
&lt;/h3&gt;

&lt;p&gt;With time you could end up multiple feature branches on the repo. Most of the braches are merged with &lt;code&gt;master&lt;/code&gt;. This can cause the local &lt;code&gt;.git&lt;/code&gt; file to become large causing some slow up.&lt;/p&gt;

&lt;p&gt;To prevent aganist this and do some home cleaning use &lt;code&gt;git branch | grep -v "master" | xargs git branch -D&lt;/code&gt;. This command cleans all branches expect the &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Github has also released a feature where you can &lt;a href="https://help.github.com/en/articles/about-pull-request-merges#squash-and-merge-your-pull-request-commits" rel="noopener noreferrer"&gt;squash the commits&lt;/a&gt; while merging a PR. But if using something like Bitbucket or another tool they might not this feature.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;.gitconfig&lt;/code&gt; is located in the root directory(&lt;code&gt;~/.gitconfig&lt;/code&gt;) for Mac.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Another set of useful utilities to checkout are &lt;a href="https://github.com/tj/git-extras" rel="noopener noreferrer"&gt;git-extras&lt;/a&gt;. It has utilites for a bunch of git workflows.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>shell</category>
      <category>dev</category>
    </item>
    <item>
      <title>CSS/JS coverage in Chrome</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Thu, 14 Mar 2019 05:13:57 +0000</pubDate>
      <link>https://forem.com/hozefaj/cssjs-coverage-in-chrome-2j35</link>
      <guid>https://forem.com/hozefaj/cssjs-coverage-in-chrome-2j35</guid>
      <description>&lt;p&gt;From Chrome version 59 onwards, the developer tools expose a new Coverage tab(next to Console). This basically shows that given all the JS/CSS that gets loaded on the how much of it is actually used.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gy3SG-I6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developers.google.com/web/updates/images/2017/04/coverage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gy3SG-I6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developers.google.com/web/updates/images/2017/04/coverage.png" alt="coverage-tab" width="880" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be surprised to see the percent of unused code that gets shipped over the wire. In big projects/teams over time code keeps getting added and no one takes the time to actually check if all what's getting skipped to the user is actually needed. This causes performance bottlenecks and in many cases loss of potential business.&lt;/p&gt;

&lt;p&gt;The great part of the tool is that does not only give a percent of unused code but actually also shows what code it is. Using this information it becomes easy to identify code that can be removed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FT2aeqfY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developers.google.com/web/updates/images/2017/04/coverage-breakdown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FT2aeqfY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developers.google.com/web/updates/images/2017/04/coverage-breakdown.png" alt="source-code" width="880" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each line of code is color-coded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solid green means that line of code executed.&lt;/li&gt;
&lt;li&gt;Solid red means it did not execute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Off course not everything in red can be removed. There will be code that runs on user actions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One simple way to get to it, is &lt;code&gt;shift + cmd + p&lt;/code&gt;(on a mac) and then type &lt;code&gt;coverage&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The command palette has a bunch of pretty useful utilities.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We use this tool pretty often in our development as well as performance tuning. &lt;code&gt;Performance&lt;/code&gt; should not be taken as an afterthought, but rather tackled during the development cycle itself.&lt;/p&gt;

&lt;p&gt;A fellow coworker rights puts its &lt;code&gt;Performance is the new Accessibility&lt;/code&gt; &lt;br&gt;
&lt;/p&gt;
&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--owN21c0l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/956791503354978304/xbbS0o5X_normal.jpg" alt="Reefath Rajali profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Reefath Rajali
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @rajali
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      "Performance Is the New Accessibility" ~ Reefath Rajali&lt;br&gt; Kick starting a new talk series at &lt;a href="https://twitter.com/PayPalEng"&gt;@PayPalEng&lt;/a&gt; to discuss about the importance of performance and making the web accessible to everyone in the world.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      20:43 PM - 12 Mar 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1105570003934273536" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1105570003934273536" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1105570003934273536" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;
 

&lt;p&gt;Let's all chip in to make the web accessible to everyone.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>chrome</category>
      <category>css</category>
    </item>
    <item>
      <title>My team's git workflow</title>
      <dc:creator>Hozefa</dc:creator>
      <pubDate>Tue, 12 Mar 2019 05:59:19 +0000</pubDate>
      <link>https://forem.com/hozefaj/my-teams-git-workflow-1528</link>
      <guid>https://forem.com/hozefaj/my-teams-git-workflow-1528</guid>
      <description>&lt;p&gt;Most teams will have a git(or any source control) workflow that they follow. Detailing the workflow that we follow in my team at PayPal. We have a team of 8 engineers working on multiple apps at the same. Over time we have created this process detailed below:&lt;/p&gt;

&lt;h3&gt;
  
  
  Development Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;We have 3 main branches &lt;code&gt;develop&lt;/code&gt;, &lt;code&gt;release&lt;/code&gt; and &lt;code&gt;master&lt;/code&gt;.  All of them are protected such that no one can directly push commits to these branches. The code has to be added only through PR's.&lt;/li&gt;
&lt;/ol&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqszky26bugv5qr7a9vrs.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fqszky26bugv5qr7a9vrs.png" alt="branches"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;develop&lt;/code&gt; is our working branch and everyone creates a new branch from &lt;code&gt;develop&lt;/code&gt; and then creates a PR to it once they are done. 
&lt;em&gt;On a side note, we follow the &lt;a href="https://github.com/commitizen/cz-cli" rel="noopener noreferrer"&gt;commitizen&lt;/a&gt; of writing commit messages. This helps to automate changelogs.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;We have a CI pipeline that runs the code against &lt;code&gt;tests&lt;/code&gt;, &lt;code&gt;eslint&lt;/code&gt; etc. Every PR is reviewed by a couple of engineers.&lt;/li&gt;
&lt;li&gt;Once PR is approved and passed the CI its merged. We use the &lt;code&gt;Squash and Merge&lt;/code&gt; option.
&lt;em&gt;We then &lt;code&gt;delete&lt;/code&gt; the feature branch.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Once the PR is merged we build and deploy the code to a staging environment to be tested. This is where we can do manual testing and end to end testing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Release Process
&lt;/h3&gt;

&lt;p&gt;We generally release at the end of every sprint(bi-weekly).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When testing is done, we will create a PR from the &lt;code&gt;develop&lt;/code&gt; branch to the &lt;code&gt;release&lt;/code&gt; branch. &lt;em&gt;We also tag this PR with a &lt;code&gt;release-candidate&lt;/code&gt; tag. This helps to in case we need to go back and see what was exactly released in case of an issue.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;On this PR, since we are using &lt;code&gt;commitizen&lt;/code&gt; we generate the changelog using &lt;a href="https://www.npmjs.com/package/standard-version" rel="noopener noreferrer"&gt;standard-version&lt;/a&gt;. We keep all the changes over time within the &lt;code&gt;CHANGELOG.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We then create a build and deploy. Sanity testing is one last time here.&lt;/li&gt;
&lt;li&gt;Then we use the build to deploy to production.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Patch Fixes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Development happens from the &lt;code&gt;develop&lt;/code&gt; branch, in case we need to fix an issue a new branch is cut from &lt;code&gt;release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Changes are made, reviewed and tested. Then the PR is merged to &lt;code&gt;release&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then the build and deploy process takes place.&lt;/li&gt;
&lt;li&gt;As a follow-up, we also merge the same code into &lt;code&gt;develop&lt;/code&gt; to keep both branches in sync.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One thing to add here, everyone in the team has to write access to the main repo. They are free to fork the repo if they choose to. We prefer that all branches be pushed to the main repo so it's easy for anyone to contribute to an existing branch. Once any feature branch is merged, we &lt;code&gt;delete&lt;/code&gt; it.&lt;/p&gt;

&lt;p&gt;Hope this helps any other team looking to get a git workflow going. Curious to see what other teams/companies follow. 👍&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>workflow</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
