<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Learn With Didi]]></title><description><![CDATA[Edidiong Asikpo is a Developer Advocate based in Lagos, Nigeria. She is passionate about sharing her knowledge of DevOps through technical articles, videos, and social media.]]></description><link>https://edidiongasikpo.com</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 13:26:23 GMT</lastBuildDate><atom:link href="https://edidiongasikpo.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[2022: Year in Review]]></title><description><![CDATA[I was very intentional about proclaiming that 2022 would be amazing. It was almost like I could feel it from the very first day of 2022. “This year is going to be dope” I’d say to myself and everyone I talked to at the beginning of the year.
I’m not ...]]></description><link>https://edidiongasikpo.com/2022-year-in-review</link><guid isPermaLink="true">https://edidiongasikpo.com/2022-year-in-review</guid><category><![CDATA[#DevRetro2022]]></category><category><![CDATA[yearinreview]]></category><category><![CDATA[2022]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Sat, 31 Dec 2022 20:58:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1745770089944/499552a9-4680-4a3e-8402-aa1bdc0bcce3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was very intentional about proclaiming that 2022 would be amazing. It was almost like I could feel it from the very first day of 2022. “This year is going to be dope” I’d say to myself and everyone I talked to at the beginning of the year.</p>
<p>I’m not going to lie; 2022 was my best year yet! I mean, don’t get me wrong, every other year has been fantastic, but 2022 was so exceptional that it reminds me of <a target="_blank" href="https://edidiongasikpo.com/2019-the-best-year-of-the-last-decade">2019 - the best year in the last decade</a>.</p>
<p>Of course, 2022 wasn’t just filled with only good things, bad occurrences happened as well. This review will cover the good and the bad. I’ll also share my plans for 2023. So, let’s jump right into it. 💃</p>
<h2 id="heading-i-passed-the-ckad-exam"><strong>I passed the CKAD exam</strong></h2>
<p>If you don’t already know, I transitioned from Web Development to the Cloud Native field in the middle of 2021. I had always been fascinated by Kubernetes and other Cloud Native technologies, so when the opportunity came to make the switch, I thought this was the universe saying, “go for it”.</p>
<p>Transitioning to a new field involves a lot of learning and risk (because things may not always go as planned), and even though learning new things can be great, it can also be exhausting sometimes.</p>
<p>The company I work for is very intentional about the growth of their staff, so they paid for me to take the <a target="_blank" href="https://www.cncf.io/certification/ckad/">CKAD exam</a> to enable me to improve my knowledge of Kubernetes. So, I prepared for the exam, wrote at least <a target="_blank" href="https://blog.getambassador.io/ckad-exam-tips/home">one article every week about my learnings</a>, and eventually took and passed the CKAD exam, making me a Certified Kubernetes Application Developer.</p>
<p><img src="https://miro.medium.com/max/1400/0*p3u-G63QGXfS9oyO" alt /></p>
<p>Passing this exam was a reflection of all the progress I had made since the transition and how much I had learned. It made me very happy, but it also reminded me that I still had a lot more to learn.</p>
<h2 id="heading-i-was-promoted-to-senior-developer-advocate"><strong>I was promoted to Senior Developer Advocate</strong></h2>
<p>If you ask me if there was any day in 2022 that I was literally smiling from the beginning to the end of the day, then it will be that very day my manager told me that I had been promoted.</p>
<p>Becoming a Senior Developer Advocate in 2022 was one of my key goals. Seeing it materialize was literally one of the best things that have happened to me in my career. Aside from the salary increase that comes with a promotion, it is a reflection that your manager and the company at large believe that the work you’ve been doing is valuable and that you deserve to be taken to a new level because of that.</p>
<p>I’m always smiling most of the time, but I smiled a hundred times more throughout that week. 😂</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://mobile.twitter.com/Didicodes/status/1546881001007337473">https://mobile.twitter.com/Didicodes/status/1546881001007337473</a></div>
<p> </p>
<h2 id="heading-i-gave-in-person-tech-talks-in-europe-and-the-united-states-of-america"><strong>I gave in-person tech talks in Europe and the United States of America</strong></h2>
<p>I have spoken at some international conferences, but it’s always been virtual. This year was different. I got to speak in Europe and the United States of America in person!</p>
<p>My first in-person international conference in 2022 was at <a target="_blank" href="https://events.linuxfoundation.org/archive/2022/kubecon-cloudnativecon-europe/">KubeCon EU</a> in Spain. I honestly couldn’t believe that I was going to speak at the world’s largest cloud native conference because it wasn’t even up to a year since the transition. It was almost unbelievable, to be honest, and wouldn’t have been possible without my manager and other amazing colleagues at Ambassador Labs.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672520050214/ea24eb0c-e7ab-4185-96fe-6b03e273e73d.jpeg" alt class="image--center mx-auto" /></p>
<p>The second in-person conference was at <a target="_blank" href="https://2022.allthingsopen.org/">All Things Open</a> in North Carolina. I got the opportunity to talk about two things that I love; <a target="_blank" href="https://www.getambassador.io/products/telepresence">Telepresence</a> and <a target="_blank" href="https://opensource.org/">Open Source</a>. #AllThingsOpen was one of the most organized conferences I’ve been to - everything was set in place, the location was great, and the speakers were absolutely fantastic. I loved every single minute of it. Shout out to the organizers of All Things Open for creating such an excellent conference.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672520228449/d448e681-56b5-4142-8678-251eac35c897.jpeg" alt class="image--center mx-auto" /></p>
<p>The interesting thing about speaking in person at these conferences is that I get to see so many people that have inspired, motivated, and supported me in person.</p>
<h2 id="heading-i-travelled-to-six-countries"><strong>I travelled to six countries</strong></h2>
<p>Most countries and people across the world have a bad stereotype about Nigerians, so it can often be difficult to travel when you have a Nigerian passport. You’ll have to go through the draining process of applying for visas and getting rejected by the embassies. Even when your visa gets approved, you’ll still have to deal with standing in long queues when passing through immigration or getting searched more than every other person by the security just because you are “Nigerian”. Nevertheless, I’ll take the searches and queues over not my visa application getting rejected by the Embassy.</p>
<p>Regardless of these setbacks of being a Nigerian, I was opportune to travel to Europe and the United States of America for the first time this year.</p>
<p>I was only able to get the Schengen visa because I applied with someone who was a frequent traveller. I think my bank statement helped too lol, but considering that my Schengen visa was rejected in 2021, I think this one was approved because my application was tied to theirs.</p>
<p>I think I got my US visa because I had travelled to Europe already, worked for my current company, which is based in the US, for more than a year, and was invited to give tech talks at a conference in the US. I can’t explain why my visa application was approved, but these are my conspiracy theories. I had heard about how many people have been rejected severally, so I was grateful to God that I got the US visa.</p>
<p>Even though I went to 6 countries this year, I visited more than one state in each of those countries. This tweet below by Sultan about my trips made me laugh so hard when I saw it 😂</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/hackSultan/status/1564196308117852160">https://twitter.com/hackSultan/status/1564196308117852160</a></div>
<p> </p>
<p>Anyway, let me briefly break down each trip. 👇</p>
<h3 id="heading-europe-france-spain-amp-greece"><strong>Europe - France, Spain, &amp; Greece</strong></h3>
<p>Before travelling to Paris, I had never gone on a solo trip. Yes, I have travelled to several places before Paris, but it was either for tech conferences where I went with other tech people or on vacation with someone. This time, I left Nigeria alone for the first time. This meant I had to figure out everything myself, from taking pictures, exploring, translating French to English, communicating with the French folks, etc. Doing this solo trip reminded me that I was able to do anything by myself and that I was happy with my own company. Paris was fantastic! I finally got to see the much-talked-about Eiffel tower and the Louvre museum. I ate croissants, walked around the city, made memories, and visited other historical landmarks.</p>
<p>After Paris, I went to Spain for KubeCon EU. I met some of my friends from Nigeria who are now living in European countries. I also met my manager, Daniel, for the first time too, and it was amazing. Daniel is the best manager I’ve ever had, and it was so good to finally see the person I had been working with and speaking to virtually every week in person. I met a couple of other colleagues from Ambassador Labs as well and met some of my Twitter acquaintances in person too.</p>
<p>A couple of months later, I went to Paris (again) and Greece (Santorini and Athens) for vacation. Honestly, Santorini is just as beautiful as they claim it is - you could see the moon up close cause your hotel is on a hill, the water is blue, and the houses are white. Lovely place! Athens was amazing too - they had a lot of fantastic quotes and historical buildings.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672520166559/0434bde9-63d8-4037-8982-831d3aa4c688.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-africa-rwanda-amp-ghana"><strong>Africa - Rwanda &amp; Ghana</strong></h3>
<p>My best friends and I have been talking about going on vacations since forever, but the vacations never left the group chat. This year, we didn't just go to one country, we went to two! My best friends (Somto and Grace) are two of the most important people in my life, so anytime I get to spend with them is always fantastic and filled with great memories, laughter, communication, and peace. They are the best friends anyone could ask for. I love them so much, and I’m grateful I have them in my life.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672520128223/d78abc1e-cf32-40cd-aec7-9bfab51b94f1.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-united-states-of-america-detriot-amp-north-carolina"><strong>United States of America - Detriot &amp; North Carolina</strong></h3>
<p>I got to attend KubeCon NA in Detroit and speak at All Things Open in North Carolina. It was amazing to see what the US looked like in person, hang out with more colleagues from work, meet friends and acquaintances, and just all around have an amazing time.</p>
<p>The weather wasn't as cold as I expected and that was good because the cold and I aren't the best of friends. I plan to return to the US next year for vacation, so I can go to states like New York, San Francisco, Vegas, etc. I honestly can’t wait.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672520092915/ba13eb60-16ed-41b4-98b4-06be5f9dd4f5.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-i-took-a-step-back-from-being-active-in-the-tech-community-amp-twitter"><strong>I took a step back from being active in the tech community &amp; Twitter</strong></h2>
<p>I didn't do much in the tech community this year, but I’m adding it as a good part of 2022 because it was an intentional decision. Throughout my career, I’ve been super active in the tech community, and even though it is great and impactful, it can also be very overwhelming and would sometimes prevent you from doing other things you love because you’ll always have so many things to do every day.</p>
<p>Aside from speaking at All Things Open and KubeCon, I organized OSCAfest with some amazing folks, spoke at my hometown (Google I/O Uyo), and few more virtual tech conferences/events.</p>
<p>Honestly, taking a step back from the tech community and being active on Twitter was very much impactful in my life. It allowed me to do more things I loved, like travelling, watching movies, resting, spending more time with my loved ones, and, most importantly, not having too many things to do every day.</p>
<p>2023 will be different, though; I’d go back to being active on Twitter, hosting tech events, and speaking at more tech conferences, but this time balance it out with the things I love so I don’t feel overwhelmed.</p>
<h2 id="heading-i-partnered-with-some-amazing-tech-companies"><strong>I partnered with some amazing tech companies</strong></h2>
<p>I had partnership engagements with Talent QL, AltSchoolAfrica, Teleport &amp; LinkedIn this year. Given the fact that I wasn't very active in the tech community this year, it was nice to still be able to partner with these companies. I look forward to partnering with more companies and tech communities in 2023.</p>
<h2 id="heading-some-things-didnt-go-as-planned-in-2022"><strong>Some things didn't go as planned in 2022</strong></h2>
<ul>
<li><p>One of the key things I wanted to do in 2022 was to create more video content. But like every other year, 2022 passed without me creating a  YouTube channel or a TikTok page.</p>
</li>
<li><p>I struggled a lot with consistency and maintaining a stable schedule this year. Some things that contributed to this were procrastination, change in time zones when I travelled, etc. I definitely want to be intentional about this next year.</p>
</li>
<li><p>There was a saving goal I wanted to reach this year, but I wasn't able to. Nevertheless, I’m still grateful that I utilized my money effectively this year and used.</p>
</li>
<li><p>I barely wrote an article on my personal blog. In June, I even wrote an article titled <a target="_blank" href="https://edidiongasikpo.com/hey-im-back">Hey! I’m back</a> with the intention of becoming active with writing on my personal blog again, but I only wrote one more article after that. It’s not like I stopped writing completely. I wrote over 15 - 20 articles for my company, but it would have been nice if I also published articles on my personal blog too. I started writing this year in review today, so the year doesn’t end with me publishing only two articles on my blog because three is better than two 😂.</p>
</li>
</ul>
<h2 id="heading-what-will-i-be-doing-in-2023"><strong>What will I be doing in 2023?</strong></h2>
<p>Inspired by 2022, I will start 2023 by proclaiming how it will be my best year yet. I won’t stop making those proclamations, I’ll also set systems to ensure those proclamations get manifested.</p>
<p>Here are some of the key things I want to do or achieve in 2023 👇</p>
<ul>
<li><p>I want to travel to Turkey, Amsterdam, Saudi Arabia, Italy (for my birthday), Morocco, and the US (for Christmas). I need to utilize the full potential of this remote work. Why work in Nigeria when I can be lying down on a beach somewhere and working? 😅</p>
</li>
<li><p>2023 is the year I finally take this video content creation thing seriously. I know it’s going to be hard and out of my comfort zone, but I’m going to push myself to do it.</p>
</li>
<li><p>I love Nigeria, but I’ve finally come to the realization that Nigeria isn't the place I want to live in for the rest of my life. The government has been actively working towards making the country even worse, and I can’t even imagine what the country would look like in the next four years. I want to live a life where I don’t have to worry about power supply, internet service, or even the chance of surviving an accident or illness because of the inadequacy of the hospitals. It is super exhausting. I don’t have anything figured out yet, but I’ll think about the countries I’d like to relocate to and take steps toward making it a reality.</p>
</li>
<li><p>There was a lot of inconsistency with my fitness journey in 2022. It significantly improved in the last few weeks of 2022, so I want to maintain that and even improve in 2023.</p>
</li>
<li><p>Just like every other year, I’ll be working on improving myself. From learning Golang, journaling, improving my Kubernetes and Cloud Native knowledge, video editing, etc.</p>
</li>
</ul>
<h2 id="heading-summary">Summary</h2>
<p>I bet there are so many other wins and losses that I didn't include in this review because I can’t remember them since I started writing this article today, and I want to go back to continue my vacation quickly. But before ending this article, I thought to share that one of the key things I learned from 2022 was the power of positive thinking. The ability to always stay or at least try to see the positive side of every situation you are in, whether it is a good one or not. It can be very beneficial for your mental health, growth, and the people you interact with.</p>
<p>Finally, I want to thank God for everything he has done for me. Honestly, I struggle to find the right words to express my appreciation to God. He made all of this possible, and I’m returning all the glory to him. I also want to thank everyone who has contributed to making 2022 phenomenal for me. And finally, I want to thank me for believing in me.</p>
<h2 id="heading-next-year-will-be-better"><strong>Next year will be better!</strong></h2>
<p>I know this year wasn't the best for most people, so if you are reading this, I want to use this opportunity to tell you to stand strong because 2023 will be better. You have your whole life ahead of you, and the fact that this year wasn't so great doesn't mean other years wouldn't be better.</p>
]]></content:encoded></item><item><title><![CDATA[How to Give Developers Secure Access to Kubernetes Clusters]]></title><description><![CDATA[There's a fantastic show called Klustered on Rawkode's YouTube channel, which is focused on showing its viewers different ways to debug a Kubernetes cluster. The unique thing about this show is that there are usually two teams (or people) trying to d...]]></description><link>https://edidiongasikpo.com/how-to-give-developers-secure-access-to-kubernetes-clusters</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-give-developers-secure-access-to-kubernetes-clusters</guid><category><![CDATA[Devops]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[DevopsWithDidi]]></category><category><![CDATA[Security]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Tue, 05 Jul 2022 12:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1656939333202/OcNCu1X6S.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's a fantastic show called <strong>Klustered</strong> on <a target="_blank" href="https://www.youtube.com/c/Rawkode">Rawkode's</a> YouTube channel, which is focused on showing its viewers different ways to debug a Kubernetes cluster. The unique thing about this show is that there are usually two teams (or people) trying to debug and make the Kubernetes cluster broken by the other team (or person) operational again.</p>
<p>You may be wondering why I'm talking about Klustered when the title of this article is centered around something else. I'll tell you! It's because I discovered <a target="_blank" href="https://goteleport.com/?utm_campaign=eg&amp;utm_medium=partner&amp;utm_source=Edidiong">Teleport</a> during my time as a guest on Klustered. I was in awe of the platform and the things it could help me and my teammates achieve.</p>
<p>After the show, I decided to learn more about the capabilities of Teleport, and that was when I realized that it was more powerful than I had imagined. So, I decided to write an article about how you can use Teleport to give developers secure access to Kubernetes Clusters.</p>
<h2 id="heading-what-is-teleport">What is Teleport?</h2>
<p>The <a target="_blank" href="https://goteleport.com/?utm_campaign=eg&amp;utm_medium=partner&amp;utm_source=Edidiong">creators of Teleport</a> say it is the easiest and most secure way to access infrastructure.</p>
<p>In my opinion, Teleport is an open source multi-protocol access proxy that allows developers and security professionals to unify access for SSH servers, Kubernetes clusters, web applications, and databases across all environments. It consolidates identity-based access to your infrastructures, helps you meet compliance requirements (e.g., MFA, RBAC, etc.), and also gives you full visibility into the access and behaviour of your infrastructures.</p>
<p>Even though Teleport can be used to access different infrastructures anywhere in the world, this article is only focused on explaining how it can be used to give developers (or any other person who needs it) secure access to Kubernetes clusters.</p>
<h2 id="heading-what-are-the-benefits-of-using-teleport">What are the benefits of using Teleport?</h2>
<p>Before getting hands-on with Teleport, I thought to share some benefits of Teleport and include real-life scenarios on how each of these benefits can positively impact the workflow, productivty and security of development teams using Kubernetes.</p>
<h3 id="heading-1-teleport-provides-identity-based-access-to-your-kubernetes-cluster">1. Teleport provides identity-based access to your Kubernetes cluster</h3>
<p>Teleport gives every developer, infrastructure resources (VM, K8s cluster, Database or Windows Server), and application an identity, thereby neutralizing security threats and reducing the impact of breaches.</p>
<p>This means that anybody who doesn't match the identity you've set up will not be granted access to your Kubernetes cluster, and the identity and interactions of those who have access to the Kubernetes cluster can be easily identified &amp; monitored for security reasons.</p>
<p><strong>Scenario:</strong></p>
<p>Most organizations use traditional approaches like passwords or private keys as a means of securing access to their Kubernetes clusters. But this isn't very scalable and secure as it requires manual effort, and the password can be exposed mistakenly. On the other hand, using Teleport to provide secure access to your Kubernetes clusters means that you can implement a single sign-on authentication scheme using GitHub or other <a target="_blank" href="https://goteleport.com/docs/enterprise/sso/">supported SSO providers</a> on your Kubernetes cluster to ensure that only members of a specified team can access the Kubernetes cluster.</p>
<h3 id="heading-2-teleport-gives-you-full-visibility-of-all-activities-performed-on-your-kubernetes-cluster">2. Teleport gives you full visibility of all activities performed on your Kubernetes cluster</h3>
<p>Teleport provides a way for you to see all the activities that have been performed by every single person that accesses your team's Kubernetes cluster. This visibility comes in three formats; session recording, unified audit logs, and a live view.</p>
<p>The session recordings can show you every <code>kubectl</code> session by a developer or service account. The unified audit log shows you all security events across all clusters in a single location, and the live view displays all online clusters, active <code>kubectl</code> sessions, and access requests.</p>
<p><strong>Scenario:</strong></p>
<p>Instead of having a panic attack when trying to figure out why a service in the cluster is down or why something isn't working as it used to, you can use Teleport's audit log, sessions, and live view as a source of truth to view all the activities performed, who carried them out and figure out what most have caused the error or bug. With Teleport, debugging and analyzing bugs is now easier than ever.</p>
<h3 id="heading-3-teleport-helps-you-implement-best-pratices-for-kubernetes-access-easily">3. Teleport helps you implement best pratices for Kubernetes access easily</h3>
<p>In a world where hackers have successfully been able to attack some of the most secured companies, the importance of going the extra mile to secure your team's Kubernetes cluster cannot be over-emphasized.</p>
<p>Teleport uniquely addresses these modern security challenges of today by enforcing the Zero Trust security approach, thereby making it easy for development teams to implement industry best practices for Kubernetes access (e.g., MFA, RBAC, &amp; SSO using identity-based short-lived X.509 certificates for developers and service accounts) with minimal configuration.</p>
<p><strong>Scenario:</strong></p>
<p>If you only want <strong>Developer A</strong> to have edit access and <strong>Developer B</strong> to have only viewing access to the Kubernetes cluster, you can easily do that by either running a few commands on your CLI or directly on the Teleport web user interface with just a click.</p>
<p>You may be thinking "I can set up RBAC without Teleport so what's the essence of using it", but the interesting thing is Teleport just doesnt stop at allowing you set RBAC through a user interface, it also makes the approval process of Kubernetes access less stressful. For instances, if <strong>Developer B</strong> can fix a particular bug but doesn't have access to edit resources on the Kubernetes cluster, all they need to do is click on the request access button on Teleport and it can be approved via Slack or other supported plugins.</p>
<p>And that's not even all. Teleport also supports short-lived access to Kubernetes clusters. This means that <strong>Developer B</strong> can only be given edit access to the Kubernetes cluster for a limited duration of time.</p>
<h3 id="heading-4-teleport-makes-you-more-productive">4. Teleport makes you more productive</h3>
<p>A single login gives developers access to all Kubernetes clusters across all environments. This means you can leave behind configuration complexity, juggling shared credentials and hopping between VPNs and access points.</p>
<h2 id="heading-hands-on-lets-see-teleport-in-action">Hands-on! Let's see Teleport in action</h2>
<p>Now that you know all the fantastic ways Teleport can help boost a development or DevOps team's workflow, productivity, and security, I'll show you how to set up Teleport on a Kubernetes cluster.</p>
<p>Let's dive in. 🧑🏿‍💻👨‍💻</p>
<h3 id="heading-step-1-navigate-to-your-preferred-kubernetes-cluster-amp-install-teleport">Step 1: Navigate to your preferred Kubernetes Cluster &amp; install Teleport</h3>
<p>Most organizations usually have more than one Kubernetes cluster, so the assumption is that you have a certain Kubernetes cluster you want to try using Teleport on. So, navigate to the context of that Kubernetes cluster using your preferred tool. I'm using Kubie in my case.</p>
<p><img src="https://lh4.googleusercontent.com/rbXiK3YfExXWG9nFvInXrLuEdnJzHjJxWSqArTvSSLhn9iyNiH683Mf2y9oIC9PAC4HtrbRc-n8nOlzjn1DiwB48VoNuMxGPrRVI_XeU6xKqB6yonm2I8It8Zzk8oV4gmvTUTNGCepw8Y5LsCQ" alt /></p>
<p>Next, run this command <code>helm repo add teleport https://charts.releases.teleport.dev</code> to add the teleport-agent chart to your charts repository.</p>
<p><img src="https://lh3.googleusercontent.com/sAZBlmgkZaMZUQ4V7EdtXM5AshM0BV0TaNyB-TN_7TUmQY53BmZUzwudtmiRxZ9rEuac60N4e-o_6doVGQg4sxJAzCkXk6RPkJveHCZhRnxWzKC8AxGCHTrRB_y_1qiLpvlNSjJgkf3yvLxdbw" alt /></p>
<p>With the <code>teleport-agent chart</code> now available in the Kubernetes cluster, the next thing you'll be required to do is install a single node <code>teleport-cluster</code>, provision a cert using ACME and switch to the context of the teleport cluster by running the command below on your CLI:</p>
<pre><code class="lang-plaintext">helm install teleport-cluster teleport/teleport-cluster \
--create-namespace \
--namespace=teleport \
--set clusterName=${CLUSTER_NAME?} \
--set acme=true --set acmeEmail=${EMAIL} \
</code></pre>
<p>Don't forget to update the <code>--clusterName</code> with a unique hostname which will serve as the public endpoint to your Kubernetes cluster (we will eventually set this up for DNS later using the teleport-cluster external load balancer IP address) and set the <code>--acmeEmail</code> to use an email address that will be receiving correspondence from the <a target="_blank" href="https://letsencrypt.org/">Letsencrypt</a> certificate authority.</p>
<p><img src="https://lh3.googleusercontent.com/9YPdoORcbTkJnI1_7q9b5L8SuWcx0Vg6p1foW_02_Ly-dWIboWhFvolPUFdlZ38HiFCnvsvO8dAV5AV6BaEnkM6gfvgjDPwxAr7UPqiEAgolLFQimWeQK0HkCRSVcu1SIePFSPpMbDDmyOSAkQ" alt /></p>
<p>For context, the single node <code>teleport-cluster</code> contains:</p>
<ul>
<li><p>The <strong>Teleport Auth Service</strong> which is in charge of issuing certificates &amp; conducting authentication challenges.</p>
</li>
<li><p>The <strong>Teleport Proxy service</strong> which handles user requests, forwards user credentials to the Auth Service &amp; communicates with Teleport instances that enable access to specific resources in your infrastructure.</p>
</li>
</ul>
<h3 id="heading-step-2-setup-dns-for-the-hostname-and-ip-address">Step 2: Setup DNS for the hostname and IP address</h3>
<p>The IP address of the <code>teleport-cluster</code> external load balancer will be used to set up DNS for the hostname you added when you were setting up <code>--clusterName</code>. Confused? Look at the commands in step 1 again. 😃</p>
<p>To confirm the <code>teleport-cluster</code> is running, run this command <code>kubectl get pod</code> and then run the <code>kubectl get services</code> command to view the pod's external IP address.</p>
<p><img src="https://lh3.googleusercontent.com/QHv5Nlo5gT1CuhdlPMr8y9LVJOLIXzLRJ38juUHZ8bKxCG4pcoRtRJu_yXjbzAh2WHpQZ9DfxXY5DVZxIQVwgG59yOITtXBh5mK4XUC0EXRzkMh4anQBCIDoyTKrQFz34B1_06ce76v9s-QpLA" alt /></p>
<p>Copy the external IP address and go over to your DNS provider which is Cloudflare in my case and create a DNS record for the hostname and external IP.</p>
<p><img src="https://lh6.googleusercontent.com/Rq8f1GZo4BXDaCFtY3VkNqM6verRR_5iFLLK0G2ZYePBX7moYYhyr7vdljOHo7n_2MwKTWql0rhLm0CpzRJJvfq0x5jqzWqSf71gnLErNBFcJLecQuJ5CnGh4p8ZC0OG-69IO28j06op_jKLEQ" alt /></p>
<p>This will take a couple of minutes or hours to propagate. But you can use <code>dig</code> to confirm if the DNS records are propagated:</p>
<p><img src="https://lh3.googleusercontent.com/XXxxWBFsMYBhYokjpZmEzaOMSF_a4P31e_ttFUtOlnDmJfxZvY-peUWBqxeDx-sfDpk9TptN_F0ByZKv7J67VT8tB5zjtUkpDvAq1OTdLUeivVXD5tMijuXkxu7964T2r9m4m39sR8XRwtGH_w" alt /></p>
<p>And curl to confirm that Teleport is running:</p>
<p><img src="https://lh3.googleusercontent.com/0cQMtfEUH1C6HZspbHeWBmvVbu92shc8HhlbWBUftGtM48kL026qdOm0jL8q-k0paUHELoSZJvLB8Vd4SA-hDR7269krBYIzQAq3VymPyQKhzWbqsggTTU-dYyo8behBMjw18QuzgVeXBZx2ag" alt /></p>
<h3 id="heading-step-3-create-a-local-user">Step 3: Create a local user</h3>
<p>Even though Teleport allows adding a Single sign-on authentication scheme, it is advisable to create a local user (a Kubernetes role object that can be used to assign roles to your teammates) as it serves as a reliable fallback when an SSO provider is down.</p>
<p>Let's go ahead and create a local user by adding the YAML content below into a <code>local-users.yaml</code> file. For context, the YAML configuration file below contains data that will create a Kubernetes role object named <strong>member</strong>.</p>
<pre><code class="lang-plaintext">kind: role
version: v5
metadata:
  name: member
spec:
  allow:
    kubernetes_groups: ["system:masters"]
    kubernetes_labels:
      '*': '*'
    rules:
    - resources:
      - '*'
      verbs:
      - '*'
</code></pre>
<p>Before creating a role with the <code>local-users.yaml</code> file, run this command <code>POD=$(kubectl get pod -l app=teleport-cluster -o jsonpath='{.items[0].metadata.name}')</code> to get the exact name of teleport-cluster pod and map it to a variable named <strong>POD</strong>.</p>
<p>Now, let's create the role by running this command: <code>kubectl exec -i ${POD?} -- tctl create -f &lt; local-users.yaml</code> and then add a user named "didi" to the role by running this command <code>kubectl exec -ti ${POD?} -- tctl users add didi --roles=member</code>. This will generate a link that we can send to the user we just added to give them access to Teleport.</p>
<p><img src="https://lh4.googleusercontent.com/Ubck65AZEbouHDUc4hY6n2A7Q92KzAeBof9JT17vnwonjTQaUdXMR_cW5H6CD9zn-morKuSpCmutVuWU3KdrXpq4BC6jXmlWV0nNzYT-SFgzL2sPoVWintIWkuDgMO_M9FowtGFCRpy0fgE4Sw" alt /></p>
<p>Anyone who clicks on the link (<code>https://teleport-demo.edidiongasikpo.com</code>) will be directed to the Teleport Welcome page and will need to click on <strong>Get Started</strong> to trigger the account creation process, add the required information and click the <strong>"Create Account"</strong> button to access the team's Kubernetes cluster.</p>
<p><img src="https://lh3.googleusercontent.com/86TcT499uSssR8v1-LhY5oToFJtFiYkUGA8sbKmHn9kwFxrFpqNpXEL2R0JhJQHUCz3Ghcox_Fudfad78RK6YetpGt9-5IqT_AsdyjsuVc-vEP90cqh3aou1qTicj-1Yz-Ha9kz9hqaCHi4nww" alt /></p>
<p>As you can see from the screenshot below, the user "didi" now has access to the Kubernetes cluster via Teleport's web interface in a safe and secured state.</p>
<p><img src="https://lh3.googleusercontent.com/Joust6WjdyxluDr5r6oY3Eukscnjo-n_Wl3WmZhAci2CauEbCgy6cNPdUyZ_omxLWpa1dO-DX197WxAT22hVqNq2XZLeN9jpt9JpP4Sgg0R6QUSgxrq5GWzkkTcx_3oVIp7vwH13_UWOsi2ldg" alt /></p>
<h3 id="heading-step-4-use-githubs-sso-on-teleport">Step 4: Use GitHub's SSO on Teleport</h3>
<p>You've successfully set up one local user, but doing this for your whole team will be time-consuming. Thankfully, Teleport is all about helping your DevOps team move fast while staying secured, so there's an option to connect to various <a target="_blank" href="https://goteleport.com/docs/enterprise/sso/">SSO providers</a>. In this section, I'll show you how to use GitHub's SSO on Teleport.</p>
<p>Go to your team's GitHub organization page -&gt; <strong>Settings</strong> -&gt; <strong>Developer Settings</strong> -&gt; <strong>New OAuth App</strong> -&gt; Add the required information and click the <strong>Register application</strong> button.</p>
<p><img src="https://lh4.googleusercontent.com/MfTvrkvPpcRmWQPD7vVVUF1QNwda-4z7hHwCmp-eYtjSNornDsyjiyLoVx6VpabF2KmAeypJd9wS5bLBJPj9sassH5_jQdloRzb3a1Rip1GEoewtXAkdusZbAH-cXtXid07b51jYimrE23rvRw" alt /></p>
<p>Now, create a file named <code>github.yaml</code> and paste the contents below into it. Remember to update the client id, client secret, redirect URL, and GitHub organization name with that of your team.</p>
<pre><code class="lang-plaintext">kind: github
version: v3
metadata:
  # connector name that will be used with `tsh --auth=github login`
  name: github
spec:
  client_id:  &lt;insert client id here&gt;
  client_secret:  &lt;insert client secret here&gt;
  # This name will be shown on UI login screen
  display: GitHub
  redirect_url: &lt;insert your domain name here&gt;/v1/webapi/github/callback
  # Map github teams to teleport roles
  teams_to_logins:
    - organization: &lt;insert GitHub organization name here&gt; 
      team: admin            # GitHub team name within that organization
      logins: 
        - member
</code></pre>
<p>Then run this command <code>kubectl exec -i ${POD?} -- tctl create -f &lt; github.yaml</code> to create the GitHub authentication connector.</p>
<p><img src="https://lh5.googleusercontent.com/703FisbH7EcWyoq30j73G2ixkxkFGi-XkoRy8gxgPU4BBE0EeGpZai9cvgJLEcOuRV1044euR7a4huW_wWz6eoPIz8jAzMkT7g8jDnPYu2h-kZBVWTRHqIklawkNslNATB1qpWU9cJdQnA6a4Q" alt /></p>
<p>Go back to your Kubernetes cluster's domain name, in my case <code>teleport-demo.edidiongasikpo.com</code> and you'll notice that the GitHub SSO has been added as a sign-in option.</p>
<p><img src="https://lh5.googleusercontent.com/I-YK6Innx5LThhVPQsS_etJLA23TAiI940zArKyXfTBmOCMHcyoJSe9WJmDr-9DDokXnQOzkjHp0uEO0BV_parz7unLblDv39ZTsw0uiTGoCUmuxz-Q5zprIWl9zHB1M39_P1qVEKu557Vyhpg" alt /></p>
<p>Clicking on the GitHub button will direct you to GitHub's Authorization page, where you'll click on the <strong>Authorize</strong> button to gain access to Teleport. With the GitHub SSO setup now completed, any developer who is part of the team you specified in the <code>github.yaml</code> file will now be able to log into Teleport and access the Kubernetes cluster - this increases the level of security and controls who can access your team's Kubernetes cluster.</p>
<h3 id="heading-step-5-connect-to-the-kubernetes-cluster">Step 5: Connect to the Kubernetes cluster</h3>
<p>Now, let's assume user "Didicodes" wanted to access the Kubernetes cluster you've just added to Teleport. She'll typically go to the hostname you gave to the cluster which is <code>teleport-demo.edidiongasikpo.com</code> in our case and sign in using GitHub or as a local user. On the web interface, she'll click on the connect button, which will display a list of commands she needs to run to connect to the Kubernetes cluster.</p>
<p><img src="https://lh6.googleusercontent.com/TP0qAIrLmm1fKN9C99bk28PG294AkVFj8Lgw2Z1vYCHIhwG9paC28IamAybCkINgmZ3E9jnkh6PNvLYEuQ4ECbijzjo6UEbN4BGVclSvVXsLnsS81NFopg14WxtEE4_mvL5EL7PkzECegaIYFA" alt /></p>
<p>She'll have to run these commands on her CLI because Teleport doesn't have a <code>kubectl</code> user interface at the time of this writing. This is good as Didicodes can maintain the existing workflow of running <code>kubectl</code> commands on her CLI. To run these commands, Didicodes needs to download a tool called <a target="_blank" href="https://goteleport.com/docs/installation/">tsh</a> - it allows end-users to interact with Teleport and will download a short-lived kubeconfig for your users.</p>
<p>With <code>tsh</code> now installed on Didicodes computer, she'll run this command to log into Teleport: <code>tsh login --proxy=teleport-demo.edidiongasikpo.com:443 --auth=github</code>.</p>
<p><img src="https://lh4.googleusercontent.com/iwV36aedj8tXXQLqKi-EZECACG6P_2vklYPx9Y1C61ggqz0HYmjrRQZqMhV4bfvXG_7aW13eG5x48Q-hDiehOhtzWT6qu1mdd5vyUP27cCYEvEBmwZEikElqKoRFc4EwBEyatAGFhFxWZ7JnXg" alt /></p>
<p>Didicodes will then run <code>tsh kube ls</code> to list the clusters she is connected to via Teleport and then run <code>tsh kube login teleport-demo.edidiongasikpo.com</code> to connect to the specified cluster. If this works as expected, Didicodes will now be able to access the resources inside the Kubernetes cluster (of course, only the resources she's been given access to by the admin of the K8s cluster).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656934992046/7yXSOP7yc.png" alt="image.png" /></p>
<p>From the image above, you can see that user "Didicodes" has logged into the Kubernetes cluster and can perform her day-to-day activities in the Kubernetes cluster.</p>
<h3 id="heading-step-6-view-the-activities-performed-on-the-kubernetes-cluster">Step 6: View the activities performed on the Kubernetes cluster</h3>
<p>Remember I mentioned that Teleport can show you all activities performed by developers on the Kubernetes cluster for debugging purposes. Let's see that in action👇</p>
<p>Let's assume user Didicodes wanted to perform some interactive <code>kubectl exec</code> commands on the Kubernetes cluster, she uses the <code>kubectl apply -f https://k8s.io/examples/application/shell-demo.yaml</code> command to add the shell demo pod into the cluster. Then runs this command <code>kubectl exec --stdin --tty shell-demo -- /bin/bash</code> to get a shell to the running container. In the shell, she decides to experiment by running other commands without realizing that one of them will impact the Kubernetes cluster negatively.</p>
<p>Didicodes goes out for lunch and a few moments later you get notified that something isn't working as it should on the Kubernetes cluster. You go to your <strong>Teleport Dashboard</strong> -&gt; <strong>Activity</strong> -&gt; <strong>Audit Log</strong> and realize the last person who accessed &amp; performed an activity on the Kubernetes cluster was Didicodes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1656935268035/OxsFQGqh1.png" alt="Teleport Audit Log" /></p>
<p>You want to know exactly what Didicodes did but she has gone out for lunch. Since your Kubernetes cluster is connected to Teleport, you click on <strong>Activity</strong> -&gt; <strong>Session Recordings</strong> -&gt; <strong>Play</strong> to see the activities performed by Didicodes.</p>
<p><img src="https://lh5.googleusercontent.com/ua4bDQZGRhwHLL4J4Non75IJ85VxAT8rJ0GLJIZZ_s4RdPgF7RDcleJ8O4bIrEDw9tTDRxp46il4M7qrrnZrWSwhJ3PxaymgCpqt9z6cWP_k22OjjBQGKiJuokOZVLunmGK3v2UyXeEA9CCpYQ" alt="Teleport Sessions" /></p>
<p>This gives you a clearer picture of what may have gone wrong, you fixed it and made the Kubernetes cluster operational again. Pretty cool, right? I know!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.loom.com/share/d6b84548ed8d43c0a8bc5cf817440fdd">https://www.loom.com/share/d6b84548ed8d43c0a8bc5cf817440fdd</a></div>
<p> </p>
<h2 id="heading-summary">Summary</h2>
<p>In my opinion, <a target="_blank" href="https://goteleport.com/?utm_campaign=eg&amp;utm_medium=partner&amp;utm_source=Edidiong">Teleport</a> is one of the best DevOps tools because it seamlessly grants infrastructure access without compromising engineering productivity or security.</p>
<p>This article only focused on Teleport can be used to give developers secure access to Kubernetes clusters. If you want to learn more about their other offerings, I recommend checking out their <a target="_blank" href="https://goteleport.com/?utm_campaign=eg&amp;utm_medium=partner&amp;utm_source=Edidiong">official website</a>.</p>
<p>Thank you for reading this article. I'm looking forward to hearing what you think about Teleport in the comment section. See ya. 💛</p>
]]></content:encoded></item><item><title><![CDATA[How to use Bulma CSS with React]]></title><description><![CDATA[Designed for mobile first and built using the Flexbox methodology, the Open Source CSS framework Bulma provides ready-to-use frontend components to build responsive web interfaces without JavaScript, making it ideal to use with React.
Bulma follows a...]]></description><link>https://edidiongasikpo.com/how-to-use-bulma-css-with-react</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-use-bulma-css-with-react</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[CSS]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Fri, 06 Aug 2021 07:06:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1628233079420/QpadksJToR.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Designed for mobile first and built using the Flexbox methodology, the Open Source CSS framework Bulma provides ready-to-use frontend components to build responsive web interfaces without JavaScript, making it ideal to use with React.</p>
<p>Bulma follows a strict CSS-only approach making it possible for you to have total control over your components’ functionality and the freedom to write the JavaScript code of your application the way you deem fit instead of being restricted to the framework's opinion of writing JavaScript. </p>
<p>In this tutorial, you will learn about Bulma CSS and how to use it to style your ReactJS applications. </p>
<h1 id="prerequisites">Prerequisites</h1>
<p>This tutorial assumes that you have the following:</p>
<ul>
<li><a target="_blank" href="https://nodejs.org/en/">Node</a> 8.10 or higher installed on your local development machine</li>
<li><a target="_blank" href="https://www.npmjs.com/package/npx">npx</a> 5.2 or higher installed on your local development machine</li>
<li>A basic knowledge of HTML, CSS, JavaScript, and React.</li>
</ul>
<h1 id="what-is-bulma-css">What is Bulma CSS?</h1>
<p>Unlike most CSS frameworks, Bulma isn’t an all-or-nothing framework; it enables you to import and use specific components, such as a breadcrumb or form, without importing the entire framework. It also offers a plethora of already customized <a target="_blank" href="https://bulma.io/documentation/components">components</a>, <a target="_blank" href="https://bulma.io/documentation/elements">elements</a>, <a target="_blank" href="https://bulma.io/documentation/columns">columns</a>, <a target="_blank" href="https://bulma.io/documentation/layout">layouts</a>, and <a target="_blank" href="https://bulma.io/documentation/form">forms</a> for designing websites, letting users get up and running quickly.</p>
<p>Known for having the simplest grid system, Bulma is so smooth that columns automatically resize themselves depending on the screen size of the device being used. </p>
<p>Bulma has browser support on Chrome, Edge, Firefox, Opera, Safari, and Internet Explorer (10+), providing you with CSS classes to help you style your website. </p>
<h1 id="using-bulma-css-in-react">Using Bulma CSS in React</h1>
<p>Now that you've learned more about Bulma CSS, let’s see how we can use different Bulma CSS elements and components with React.</p>
<h3 id="installing-bulma-in-react">Installing Bulma in React</h3>
<p>First, let's spin up a React application by using <a target="_blank" href="https://blog.logrocket.com/getting-started-with-create-react-app-d93147444a27/">Create React App</a> and running the following command:</p>
<pre><code class="lang-javascript">npx create-react-app bulma-tutorial
</code></pre>
<p>Once the React app is installed on your local machine successfully, switch to its directory using the <code>cd bulma-tutorial</code> command, and install the Bulma package into your React project using the <code>npm install bulma</code> command.</p>
<p>After installing Bulma, run <code>npm start</code> to access the app on your browser window via <code>localhost:3000</code>.</p>
<p><img src="https://i.imgur.com/nX66vKg.png" alt="A newly created React application homepage." /></p>
<p>Now, navigate to the <code>src</code> folder, click <code>App.js</code>, and paste the code snippet below:</p>
<pre><code class="lang-javascript">
<span class="hljs-keyword">import</span> <span class="hljs-string">'bulma/css/bulma.min.css'</span>;

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">classname</span>=<span class="hljs-string">"main"</span>&gt;</span> 
          <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"buttons"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-primary"</span>&gt;</span>Primary<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-link"</span>&gt;</span>Link<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-info"</span>&gt;</span>Info<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-success"</span>&gt;</span>Success<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-warning"</span>&gt;</span>Warning<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-danger"</span>&gt;</span>Danger<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-black"</span>&gt;</span>Black<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-white"</span>&gt;</span>White<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-dark"</span>&gt;</span>Dark<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-light"</span>&gt;</span>Light<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
      )
  }

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>By importing Bulma CSS into our project, we can now access Bulma’s components, elements, variables, and more, and utilize Bulma within our project.</p>
<h3 id="stylizing-with-bulma-in-react">Stylizing with Bulma in React</h3>
<p>Here is the created component <code>App</code> with the added parent <code>div</code>. By then exporting the component, we can target it in other sections of the application.</p>
<pre><code class="lang-javascript">
<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">classname</span>=<span class="hljs-string">"main"</span>&gt;</span>
          ...
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
      )
  }

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Here, we added a <code>div</code> containing 10 <code>buttons</code> and styled it with Bulma CSS. </p>
<pre><code class="lang-CSS">
&lt;<span class="hljs-selector-tag">div</span> <span class="hljs-selector-tag">className</span>="<span class="hljs-selector-tag">buttons</span>"&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-primary</span>"&gt;<span class="hljs-selector-tag">Primary</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-link</span>"&gt;<span class="hljs-selector-tag">Link</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-info</span>"&gt;<span class="hljs-selector-tag">Info</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-success</span>"&gt;<span class="hljs-selector-tag">Success</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-warning</span>"&gt;<span class="hljs-selector-tag">Warning</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-danger</span>"&gt;<span class="hljs-selector-tag">Danger</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-black</span>"&gt;<span class="hljs-selector-tag">Black</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-white</span>"&gt;<span class="hljs-selector-tag">White</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-dark</span>"&gt;<span class="hljs-selector-tag">Dark</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
  &lt;<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">button</span> <span class="hljs-selector-tag">is-light</span>"&gt;<span class="hljs-selector-tag">Light</span>&lt;/<span class="hljs-selector-tag">button</span>&gt;
&lt;/<span class="hljs-selector-tag">div</span>&gt;
</code></pre>
<p>Most Bulma elements have <strong><strong><a target="_blank" href="https://bulma.io/documentation/overview/modifiers/">alternative styles</a> </strong></strong>that require using either <strong><strong><code>is-</code> </strong></strong>or <strong><strong><code>has-</code> </strong></strong>to access them<strong>.</strong> For example, in the code snippet above, you’ll notice that each button contains two values: the element’s name, <code>button</code>, that signals to Bulma that this element is a button; and the modifier, <code>is-dark</code>, that accesses the style class property. </p>
<p>So, if you want to color an element of your app turquoise, for example, you’d use the <code>is-primary</code> modifier syntax.</p>
<p>The default color shades that can be used in Bulma are below, with their respective modifiers:</p>
<ul>
<li><code>is-primary</code> is turquoise</li>
<li><code>is-link</code> is blue</li>
<li><code>is-info</code> is cyan</li>
<li><code>is-success</code> is green</li>
<li><code>is-warning</code> is yellow</li>
<li><code>is-danger</code> is red</li>
<li><code>is-white</code> is white</li>
<li><code>is-black</code> is black</li>
<li><code>is-dark</code> is dark</li>
<li><code>is-white</code> is white</li>
</ul>
<p>With the buttons complete, save the code and return to the browser window to view what the updated page looks like. If everything is done correctly, it should look like the screen below:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/embed/dyNmxVE">https://codepen.io/edyasikpo/embed/dyNmxVE</a></div>
<h3 id="altering-sizes-of-elements-and-components">Altering sizes of elements and components</h3>
<p>With the understanding of how to apply colors to elements and components within React, we can continue to manipulate buttons by using Bulma’s modifier classes, <code>is-small</code>, <code>is-medium</code>, and <code>is-large</code>, to resize any element or component.</p>
<p>As each modifier name implies, elements will become smaller by adding <code>is-small</code>, medium by adding <code>is-medium</code>, and large by adding <code>is-large</code> to the element’s property.</p>
<p>Let’s add these properties to the code in our <code>App.js</code> file and see how it plays out:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'bulma/css/bulma.min.css'</span>;

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">classname</span>=<span class="hljs-string">"main"</span>&gt;</span> 
          <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"buttons"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-success is-small"</span>&gt;</span>Small<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-warning is-medium"</span>&gt;</span>Medium<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-danger is-large"</span>&gt;</span>Large<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
      )
  }

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>By adding <code>is-small</code>, <code>is-medium</code>, and <code>is-large</code> to the codebase, your React app should now look like the following:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/embed/ZELozKP">https://codepen.io/edyasikpo/embed/ZELozKP</a></div>
<h3 id="controlling-the-state-of-elements-and-components">Controlling the state of elements and components</h3>
<p>The ability to control the state of an element or component in an application is very important. To do this in a React app, use any of the three Bulma CSS properties below: </p>
<ul>
<li><code>is-outlined</code></li>
<li><code>is-loading</code></li>
<li><code>disabled</code></li>
</ul>
<p>In the code snippet below, the first button’s state is outlined by adding <code>is-outlined</code>, the second button shows a loading wheel by adding <code>is-loading</code>, and the third button becomes disabled by adding <code>is-disabled</code>.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'bulma/css/bulma.min.css'</span>;

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">classname</span>=<span class="hljs-string">"main"</span>&gt;</span> 
          <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"buttons"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-success is-outlined"</span>&gt;</span>Outlined<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-warning is-loading"</span>&gt;</span>Loading<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-danger"</span> <span class="hljs-attr">disabled</span>&gt;</span>Disabled<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
      )
  }

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>You can see the output of this code below:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/embed/ZELozXZ">https://codepen.io/edyasikpo/embed/ZELozXZ</a></div>
<h3 id="utilizing-bulmas-customized-code-snippets">Utilizing Bulma’s customized code snippets</h3>
<p>As mentioned earlier, Bulma offers a collection of already customized components that you can use to quickly customize your React apps instead of styling them from scratch.</p>
<p>For example, if we wanted to spin up a navigation bar, Bulma provides boilerplate code, and we can copy a snippet from their website, paste it into the <code>App.js</code> file, and add a closing tag to the <code>img</code> and <code>hr</code> elements. </p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'bulma/css/bulma.min.css'</span>;
<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
      <span class="hljs-keyword">return</span> (
        <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar"</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"navigation"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"main navigation"</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-brand"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://bulma.io"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://bulma.io/images/bulma-logo.png"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"112"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"28"</span>/&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-burger"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"menu"</span> <span class="hljs-attr">aria-expanded</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">data-target</span>=<span class="hljs-string">"navbarBasicExample"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">aria-hidden</span>=<span class="hljs-string">"true"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">aria-hidden</span>=<span class="hljs-string">"true"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">aria-hidden</span>=<span class="hljs-string">"true"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
              <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

              <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"navbarBasicExample"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-menu"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-start"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                    Home
                  <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

                  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                    Documentation
                  <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

                  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item has-dropdown is-hoverable"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-link"</span>&gt;</span>
                      More
                    <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-dropdown"</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                        About
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                        Jobs
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                        Contact
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">hr</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-divider"</span>/&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                        Report an issue
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-end"</span>&gt;</span>
                  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-item"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"buttons"</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-primary"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>Sign up<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                      <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"button is-light"</span>&gt;</span>
                        Log in
                      <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
              <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
          <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>

      )
  }

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Now we have a navigation bar on my website with a simple copy and paste and can customize it further using the concepts used in this tutorial. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/embed/YzNLdqd">https://codepen.io/edyasikpo/embed/YzNLdqd</a></div>
<h1 id="conclusion">Conclusion</h1>
<p>Although this tutorial covers some of the fundamentals of using Bulma with React, they provide a base to expand upon when styling. You can learn more about how Bulma works, access code snippets, and experiment by visiting their <a target="_blank" href="https://bulma.io/documentation/overview/">official documentation.</a> Feel free to explore these Bulma tutorials that I created on CodePen as well.</p>
<p>If you have any questions, you can leave them in the comments section below.</p>
]]></content:encoded></item><item><title><![CDATA[Getting Started with Cloud Native]]></title><description><![CDATA[Whenever I heard of the term "Cloud native", my thoughts usually would go to Kubernetes. I used to think "Cloud native" was a phrase used for describing just Kubernetes.
But as I delved more into it, I realized my assumption was wrong. Cloud native i...]]></description><link>https://edidiongasikpo.com/getting-started-with-cloud-native</link><guid isPermaLink="true">https://edidiongasikpo.com/getting-started-with-cloud-native</guid><category><![CDATA[Cloud Computing]]></category><category><![CDATA[Kubernetes]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Wed, 21 Jul 2021 16:48:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1626886082294/WTo2ks4_G.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Whenever I heard of the term "Cloud native", my thoughts usually would go to Kubernetes. I used to think "Cloud native" was a phrase used for describing just Kubernetes.</p>
<p>But as I delved more into it, I realized my assumption was wrong. Cloud native isn't just about Kubernetes; it is so much more!</p>
<p>In this article, I will help you understand Cloud native; the cloud computing delivery model, its benefits, architectural principles, and more!</p>
<h2 id="what-is-cloud-native">What is Cloud native?</h2>
<p>Cloud native is an approach to building and running apps that exploit the advantages of the cloud computing delivery model.</p>
<p>The "cloud" is really just the internet, as cliche as it may sound. It is a network of servers where information, software, applications, and services are housed and accessed. So what then is the cloud computing delivery model?</p>
<h3 id="understanding-the-cloud-computing-delivery-model">Understanding the Cloud computing delivery model</h3>
<p>The definition of cloud native above is excellent, but you may be curious to know the meaning of the last four words in the definition - "cloud computing delivery model". At least, I was when I saw it on almost every Cloud native definition on the internet.</p>
<p>First of all, it is helpful to know what cloud computing means to get a better understanding of the cloud computing delivery model.</p>
<p>According to Techopedia, <strong>Computing</strong> is the process of using computer resources (storage, networking, and computing power) to complete a given goal-oriented task.</p>
<p><strong>Cloud computing</strong> offers on-demand availability of these computer resources (mentioned above) without direct active management by the user.</p>
<p>The <strong>Cloud computing delivery model</strong> represents a specific, pre-packaged combination of IT resources offered by a cloud provider. There are a couple of cloud delivery models, but IaaS, PaaS, and SaaS are the most popular and widely used cloud delivery models.</p>
<ul>
<li><p><strong>Infrastructure as a Service (IaaS)</strong> - This cloud computing delivery model focuses on providing infrastructure like servers, networking technology, storage, and data center space as a service to users. This gives users the autonomy to decide what infrastructure is provisioned based on the different needs of their application. Popular examples of IaaS providers are Microsoft Azure and AWS.</p>
</li>
<li><p><strong>Platform as a Service (PaaS)</strong> - This is more focused on the development side of things by providing a platform for developers to deploy their apps to the cloud; notable examples of PaaS providers are Netlify &amp; Heroku. PaaS builds on top of IaaS, but unlike IaaS, it already handles the setup and configuration of the infrastructure your application needs. In cases where users want more control of their infrastructure configurations, IaaS is a preferred model to use.</p>
</li>
<li><p><strong>Software as a Service (SaaS)</strong> - This is the complete software product provided as a service to users in order to enable them to perform different activities. For example, Gmail is a great SaaS cloud native application used by millions of people worldwide. As a user of Gmail, you will most likely not be concerned about how it was built or the underlying infrastructure but you know for sure that you can use this software to send and receive emails.</p>
</li>
</ul>
<p>Want to get more insight into these cloud computing delivery models? Read this <a target="_blank" href="https://www.softwebsolutions.com/resources/cloud-computing-service-models.html">article</a>.</p>
<h2 id="cloud-native-terminologies-is-there-a-difference">Cloud native terminologies - Is there a difference?</h2>
<p>While learning about "Cloud Native", I struggled with understanding the difference between cloud native, cloud native apps, cloud native technologies, and cloud native computing. I felt like they were all using the prefix cloud native but meant the same thing.</p>
<p>In fact, if you search for "What is Cloud native" on Google, you will see over ten resources on the search result page. And out of these ten resources, 4 of them define or talk about Cloud native. The other 4 are either Cloud native application, Cloud native technologies, or Cloud native computing.</p>
<p>And to my surprise, these resources all had interchangeable definitions of what Cloud native meant, which got me confused. Was there a difference? Did these terminologies all mean the same thing? I asked myself.</p>
<p>I asked a couple of people about it and eventually understood the differences. So, here are my findings. 👇🏽</p>
<ul>
<li><p><strong>Cloud native</strong> is an approach to building and running apps that exploit the advantages of the cloud computing delivery model.</p>
</li>
<li><p><strong>Cloud native applications</strong> are independent services, packaged as self-contained, lightweight containers that are portable and can be scaled rapidly based on the demand. They allow you to take advantage of the unique capabilities of the cloud.</p>
</li>
<li><p><strong>Cloud native technologies</strong> are the technologies used to build and scale cloud native applications. Example; Kubernetes, Helm, Docker, etc.</p>
</li>
<li><p><strong>Cloud native computing</strong> and <strong>cloud native</strong> mean the same thing. You can read the "Cloud native" definition above to understand better.</p>
</li>
</ul>
<h2 id="the-architectural-principles-of-cloud-native">The architectural principles of Cloud native</h2>
<p>Cloud native follows four architectural principles to enable businesses to ship products faster, implement their customer's needs quickly, create value faster, and aid collaboration between developers and IT specialists.</p>
<p>Here's an explanation of the four architectural principles. 👇🏽</p>
<ol>
<li><p><strong>Microservices:</strong> In microservices, the code is broken down into independent modules, where each feature is a standalone service, and resources are assigned to the services only when needed. Cloud native apps are built following this architecture.  </p>
</li>
<li><p><strong>Containers:</strong> Cloud native apps are packaged in containers. Containers provide isolation context for microservices making them highly accessible and easier to build, update and scale.</p>
</li>
<li><p><strong>CI/CD:</strong> Cloud native applications run on a continuous delivery model that fosters collaboration between developers and the Operations team to enable them to build, deploy, &amp; release software faster without affecting end-users or developers in other teams.</p>
</li>
<li><p>DevOps: Cloud native adopts DevOps as a practice to make Continuous delivery and continuous integration (CI/CD) possible.</p>
</li>
</ol>
<h2 id="benefits-of-building-cloud-native-apps">Benefits of building Cloud native apps</h2>
<ul>
<li><p><strong>Independence:</strong> Because Cloud native apps use the Microservices architecture, it makes it possible to build cloud native apps independently of each other. This gives businesses the opportunity to build, manage and deploy the different components of an application independently without affecting other components.</p>
</li>
<li><p><strong>Automation:</strong> Cloud native apps run on a continuous delivery model making it possible to ship software updates immediately.</p>
</li>
<li><p><strong>No downtime:</strong> Thanks to container orchestrators such as Kubernetes, you can deploy a software update with essentially zero downtime, because if an instance of the application goes down, Kubernetes will automatically spin up another one for you immediately.</p>
</li>
<li><p><strong>Scalability:</strong> Cloud native apps enable flexible deployment options across the network making it easier to develop, deploy, and iterate on the application.</p>
</li>
<li><p><strong>Standards-based:</strong> Most cloud native services follow a set of standards championed by the <a target="_blank" href="https://www.cncf.io/">CNCF</a> Open Source organization. These standards have been vetted and approved by the community and are used by some of the biggest tech companies across the world. This helps reduce vendor lock-in and ensure that apps are built in the right way.</p>
</li>
</ul>
<h2 id="summary">Summary</h2>
<p>I hope you enjoyed reading this article. If you want to learn more about Cloud native, here are some useful resources for further reading:</p>
<ul>
<li><p><a target="_blank" href="https://www.youtube.com/watch?v=9Ik96SBaIvs">Cloud Native 101</a>, VMware.</p>
</li>
<li><p><a target="_blank" href="https://blog.getambassador.io/how-to-start-your-cloud-native-kubernetes-journey-ee88585d9ff3">How to start your Cloud native Kubernetes journey</a>, Ambassador Labs. </p>
</li>
<li><p><a target="_blank" href="https://www.redhat.com/en/topics/cloud-native-apps">Understanding cloud-native apps</a>, Red Hat.</p>
</li>
<li><p><a target="_blank" href="https://www.papertrail.com/solution/tips/cloud-based-cloud-native-and-cloud-enabled-applications-whats-the-difference/">Cloud-Based, Cloud-Native, and Cloud-Enabled apps---What's the Difference?</a>, PaperTrail.</p>
</li>
<li><p><a target="_blank" href="https://www.oracle.com/cloud/cloud-native/what-is-cloud-native/">What is Cloud Native?</a>, Oracle. </p>
</li>
<li><p><a target="_blank" href="https://tanzu.vmware.com/cloud-native">What are Cloud Native applications?</a>, VMware.</p>
</li>
</ul>
<p>If you have any questions, share them in the comment section below, and I'll reply to every comment. 💛</p>
]]></content:encoded></item><item><title><![CDATA[TypingDNA Verify - A New Way to Authenticate Users]]></title><description><![CDATA[Two-factor authentication (2FA) is a security process in which users provide two authentication factors to verify themselves.
If you think I am referring to the traditional SMS and Email 2FA methods from what you read above, you are wrong. I am actua...]]></description><link>https://edidiongasikpo.com/typingdna-verify-a-new-way-to-authenticate-users</link><guid isPermaLink="true">https://edidiongasikpo.com/typingdna-verify-a-new-way-to-authenticate-users</guid><category><![CDATA[authentication]]></category><category><![CDATA[user experience]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Wed, 02 Jun 2021 08:45:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1621797113662/QBW8rreHo.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two-factor authentication (2FA) is a security process in which users provide two authentication factors to verify themselves.</p>
<p>If you think I am referring to the traditional SMS and Email 2FA methods from what you read above, you are wrong. I am actually referring to a more fascinating technology known as typing biometrics. Believe it or not, your typing behavior is unique enough to act as a substitute for traditional second factors. </p>
<p><a target="_blank" href="https://www.typingdna.com">TypingDNA</a>, a company that provides a free authentication API &amp; managed verification solutions for developers, is a leader in this space - and it’s simple to get started. As the curious developer that I am, I gave <a target="_blank" href="https://www.typingdna.com/verify">TypingDNA Verify</a> a try, and I was impressed at the way it was able to verify me through the way I typed. </p>
<p>In this article, I will tell you everything you need to know about the fascinating TypingDNA Verify and how to use it.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1622642812972/uWl8aDkCL.png" alt="TypingDNA Verify" /></p>
<h2 id="so-what-exactly-is-typingdna-verify">So, what exactly is TypingDNA Verify?</h2>
<p>TypingDNA Verify relies on a state-of-the-art authentication engine using AI-based algorithms to verify typing patterns and select the best key phrases that enable higher matching accuracy on short texts. </p>
<p>This means that your end-users will have to prove their identity by typing generated texts, only deferring to <a target="_blank" href="https://link.springer.com/referenceworkentry/10.1007%2F978-1-4419-5906-5_789#:~:text=Root%20of%20Trust%3A%20A%20system,in%20a%20system%20or%20network.">Root of Trust</a> channels (SMS &amp; Email) when strictly necessary.</p>
<p>While SMS OTP’s revolutionized the security best practices decades ago, the method has reached its limits, especially in the fast-paced world that we now live in and tech industries that value good user experience. </p>
<p>The interesting thing about TypingDNA Verify is that your users can be authenticated without having to search for their phone to see the SMS OTP or use a physical token. Why? That's because users can't forget their fingers or typing behavior behind. 😉  </p>
<p><a target="_blank" href="https://www.typingdna.com/verify"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621055350243/3noglFLh_.png" alt="TypingDNA.png" /></a></p>
<p>With TypingDNA Verify, you can:</p>
<ul>
<li>Recognize trusted users through the way they type.</li>
<li>Minimize the user's effort and friction while producing a visible sense of protection. </li>
<li>Catch fraudsters instantly because a true/false match response will be returned instantly and so much more!</li>
</ul>
<p>Most importantly, the chances of a security break are very slim because your typing pattern is unique to only you! </p>
<blockquote>
<p>At the time of this writing, TypingDNA Verify can only be integrated into a website. However, TypingDNA's Authentication API can be integrated into both a website and mobile application. </p>
</blockquote>
<hr />
<h2 id="using-typingdna-verify-on-your-website">Using TypingDNA Verify on your website</h2>
<p>Now that you understand what TypingDNA Verify offers, follow the steps below to integrate it on a website. </p>
<h3 id="step-1-create-an-account">Step 1: Create an account</h3>
<p>Go to <a target="_blank" href="https://www.typingdna.com/verify">TypingDNA Verify</a> and click on the <strong>Sign up to integrate Verify</strong> button.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621200227932/b279J4oB5.png" alt="TypingDNA Verify" /></p>
<p>Sign up with <strong>Google</strong> or add your <strong>name</strong>, <strong>email</strong>, and <strong>password</strong>, then click on <strong>Continue</strong>  to proceed. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621344577066/AwgKS46_s.png" alt="Signup on TypingDNA Verify" /></p>
<p>On the Client's page, you will be given an option to choose between <strong>Verify</strong> or the <strong>Authentication API</strong>. For the purpose of this tutorial, click on Verify to access your <a target="_blank" href="https://www.typingdna.com/clients/">dashboard</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621200605219/E_wTcphv4.png" alt="Verify" /></p>
<p>On your dashboard, you will see your <strong>Client ID</strong> and <strong>Secret</strong>, a demo of Verify, an option to <strong>set up your first integration</strong> and <strong>configure your account</strong> using any of the recommended connection providers.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621344590918/iHW77ftFe.png" alt="TypingDNA Dashboard" /></p>
<hr />
<h3 id="step-2-configure-your-account">Step 2: Configure your account</h3>
<p>Below are the steps required within the dashboard to configure a Verify account before beginning the integration process:</p>
<p>In order to begin the integration process, you need to configure your account by connecting it to either your <a target="_blank" href="https://www.twilio.com/">Twillo</a> and <a target="_blank" href="https://sendgrid.com/">SendGrid</a> account.</p>
<p>Connecting to Twillo or SendGrid is important because they will be used on your behalf to send a verification code or SMS to your users. Without connecting to any of the aforementioned providers, an error message will be returned.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621347336931/ptrZXWwF-.png" alt="Twillo and Sendgrid" /></p>
<p>As the image above implies, click on <strong>Connect Twillo</strong> if you want your users to receive an SMS verification, then click on <strong>Connect SendGrid</strong> if you want your users to receive an email verification. </p>
<blockquote>
<p>Configuring Twillo and/or Sendgrid serves has a fall-back option for your users. The default 2FA TypingDNA Verify provides is the <strong>typing biometrics</strong>. 😃 </p>
</blockquote>
<hr />
<h3 id="step-3-integrate-typingdna-verify-into-a-website">Step 3: Integrate TypingDNA Verify into a website</h3>
<p>To kickstart the integration process, click on the <strong>Add your first integration</strong> button on your dashboard. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621349139910/_SbNp_XJQ.png" alt="Add your first integration" /></p>
<p>Add the name for your application and the domain URL associated with it, then click on the <strong>Create Integration</strong> button. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1621371975687/lu1Q7wGSS.png" alt="Integrate with TypingDNA" /></p>
<blockquote>
<p>This information will be used to ensure proper and secure communication between the <strong>TypingDNA Verify window</strong> and your <strong>website</strong>.</p>
</blockquote>
<hr />
<h3 id="step-4-integrate-typingdna-verify-into-your-codebase">Step 4: Integrate TypingDNA Verify into your codebase</h3>
<p>After configuring your account and adding the domain URL of your website to your dashboard, the next thing you need to do is integrate TypingDNA Verify into the frontend and backend of that website.</p>
<p>Let's get our hands dirty with code! 👇🏽</p>
<h4 id="a-install-the-typingdna-verify-client">a) Install the TypingDNA Verify client</h4>
<p>The first thing you need to do is install the TypingDNA Verify client using the command below:</p>
<pre><code class="lang-javascript">npm install typingdna-verify-client
</code></pre>
<h4 id="b-initialize-the-client">b) Initialize the client</h4>
<p>After <code>typingdna-verify-client</code> has been installed successfully, go to your backend code and initialize the client using the code below.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> typingDNAVerifyClient = <span class="hljs-keyword">new</span> TypingDNAVerifyClient({ 
    <span class="hljs-attr">clientId</span>: <span class="hljs-string">""</span>,
    <span class="hljs-attr">applicationId</span>: <span class="hljs-string">""</span>,
    <span class="hljs-attr">secret</span>: <span class="hljs-string">""</span>
});
</code></pre>
<p>Replace the empty strings with the value of your <code>clientId</code>, <code>applicationId</code>, and <code>secret</code> available on your <a target="_blank" href="https://www.typingdna.com/clients/">dashboard</a>.</p>
<h4 id="c-add-the-script-to-your-html">c) Add the script to your HTML</h4>
<p>Now, add the TypingDNA Verify CDN below to your frontend code. </p>
<pre><code class="lang-javascript">&lt;script src = <span class="hljs-string">"https://cdn.typingdna.com/verify/typingdna-verify.js"</span>&gt;&lt;/script&gt;
</code></pre>
<p>This script renders the button which opens the <strong>TypingDNA Verify</strong> window. </p>
<h4 id="d-retrieve-the-users-data">d) Retrieve the users data</h4>
<p>We need to call the <code>getDataAttributes</code> JavaScript method to pass the credentials and encrypted user data to the <code>button</code> element we are going to add in our frontend code in the next step.</p>
<p>So, go back to your backend code and paste the code below.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> typingDNADataAttributes = typingDNAVerifyClient.getDataAttributes({ 
    email,
    phoneNumber,
    <span class="hljs-attr">language</span> :  <span class="hljs-string">'en'</span>,
    <span class="hljs-attr">mode</span> : <span class="hljs-string">'standard'</span> <span class="hljs-comment">// 'show_otp' alternatively</span>
});
</code></pre>
<blockquote>
<p>The language and mode are optional parameters, defaulting to ‘EN’ and ‘standard’ respectively.</p>
</blockquote>
<h4 id="e-add-a-button-element-to-your-html">e) Add a button element to your HTML</h4>
<p>Finally, add a button element with a ‘typingdna-verify’ class and the data attributes that correspond to values of the <code>TypingDNADataAttributes</code> object explained above. This will be passed to the TypingDNA Verify window once the button is clicked by an end-user.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">button</span>
      <span class="hljs-attr">class</span> = <span class="hljs-string">"typingdna-verify"</span>
      <span class="hljs-attr">data-typingdna-client-id</span>= <span class="hljs-string">typingDNADataAttributes.clientId</span>
      <span class="hljs-attr">data-typingdna-application-id</span>= <span class="hljs-string">typingDNADataAttributes.applicationId</span>
      <span class="hljs-attr">data-typingdna-payload</span>= <span class="hljs-string">typingDNADataAttributes.payload</span>
      <span class="hljs-attr">data-typingdna-callback-fn</span>= <span class="hljs-string">"callbackFn"</span>&gt;</span> Verify with TypingDNA
<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
</code></pre>
<p>If you followed the steps above correctly, your users should now be able to authenticate themselves using TypingDNA Verify.</p>
<hr />
<h2 id="demo">Demo 👨‍💻 👩‍💻</h2>
<p>You can play around with the <a target="_blank" href="https://verify-demo.typingdna.com/?appId=4a99bca8b982bd6e9b7283da289176c6">demo here</a> to get a better understanding of how TypingDNA Verify works and let me know what you think in the comment section.</p>
<hr />
<h2 id="conclusion">Conclusion</h2>
<p>I believe TypingDNA Verify has a lot of potentials and could be the next big thing in the Two-factor authentication space. So, I'd recommend you give it a try now it is still free for a year. </p>
<p>Want to learn more about how TypingDNA Verify works? You can access code snippets, demos, and more by visiting their <a target="_blank" href="https://verify.typingdna.com/docs">official documentation</a>.</p>
<p>I hope you enjoyed reading this article. If you have any questions, share them in the comment section below, and I'll reply to every comment. 💛  </p>
]]></content:encoded></item><item><title><![CDATA[5 Ways Developers Can Make Money Through Blogging]]></title><description><![CDATA[Blogging is a great way to educate others, reinforce learning and show your expertise to a potential employer. But make no mistake: it can also be a great way to make money, either as a side hustle or a full-time career. 🤑
In this article, I will sh...]]></description><link>https://edidiongasikpo.com/5-ways-developers-can-make-money-through-blogging</link><guid isPermaLink="true">https://edidiongasikpo.com/5-ways-developers-can-make-money-through-blogging</guid><category><![CDATA[Blogging]]></category><category><![CDATA[General Advice]]></category><category><![CDATA[Monetization]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Thu, 06 May 2021 11:50:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1620375697391/OUlUswPbU.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Blogging is a great way to educate others, reinforce learning and show your expertise to a potential employer. But make no mistake: it can also be a great way to make money, either as a side hustle or a full-time career. 🤑</p>
<p>In this article, I will share 5 different ways developers can make money through blogging. </p>
<h2 id="web-monetization">Web Monetization</h2>
<p>Web monetization is the process of making revenue from the traffic coming to your blog. So the higher the traffic on your blog, the higher the money you make. </p>
<p>Web monetization is very easy to set up (all you need is a tag), simple to use, and most importantly, ensures the traffic equals payment (your quality content is rewarded). I believe Web monetization is a great option for people who don't like adding ads to their blogs. If you are one of those people, Web monetization is exactly what you need. </p>
<p>In my case, adding web monetization to my blog was super easy because the platform I use  <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Hashnode</a> supports it. If you want to add web monetization to your blog, read this insightful <a target="_blank" href="https://x.hashnode.dev/web-monetization-on-hashnode-ckdu9umr900jmn0s1gr0r4gis">guide</a> by my friend, <a class="user-mention" href="https://hashnode.com/@hacksultan">Akintunde Sultan</a>.</p>
<h2 id="hashnode-sponsors">Hashnode Sponsors</h2>
<p><a target="_blank" href="https://hashnode.com/sponsors">Hashnode Sponsors</a> is a new way to monetize 💸 your developer blogs. </p>
<p>It is an inbuilt 1:1 micropayment service that lets readers sponsor their favorite bloggers. When someone sponsors your work via Hashnode Sponsors, you will receive the money instantly to your bank account. Amazing right? </p>
<p>Another interesting thing about Hashnode Sponsors is that Hashnode doesn't take any commission from the money your readers send to you. It's basically all yours to take. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/KdXoroiomMU">https://youtu.be/KdXoroiomMU</a></div>
<p>At the time of this writing, <a target="_blank" href="https://hashnode.com/sponsors">Hashnode Sponsors</a> is only accessible to those who own Hashnode powered blogs. So, if you want in on this, go ahead and <a target="_blank" href="https://hashnode.com/@didicodes/joinme">create a blog on Hashnode now</a>. </p>
<h2 id="advertising">Advertising</h2>
<p>Adding ads to your blog is one of the most popular ways to make money via a blog. Having said that, it is important to note that some developers dislike blogs that have ads, especially when the ads do not have anything to do with tech. But here are some solutions 👇</p>
<ol>
<li><p><strong>Advertising using Adsense or Carbon:</strong> If you want to add ads to your blog, consider using Adsense or Carbon because they only show tech-related content. This ensures that your readers see ads that might be useful to them and will not be forced to leave your blog.</p>
</li>
<li><p><strong>Including affiliate links in your articles:</strong> Another interesting way to advertise on your blog is by adding affiliate links to the articles. Here, a person or company will reach out to you and inform you about a product or tool they want your audience (readers) to know about. You'll agree on a price, add a link to the product in your article, and then get paid based on the number of people that click on that link when they read your article. With this type of advertising, you get the benefit of crafting the content in a very natural way that won't come off as advertising/marketing to your readers.</p>
</li>
</ol>
<h2 id="writing-paid-articles">Writing Paid Articles</h2>
<p>You can make money by writing paid articles on a company's blog or your own blog. Here's a detailed explanation on both ways: 👇</p>
<ol>
<li><p><strong>Paid Community writing programs:</strong> Did you know that tons of tech companies and communities pay developers between $100 to $2000 to write technical articles for their blogs? Well, now you do! It is important to note that these companies will only accept you as a writer if you show them that you have prior experience as a tech blogger, so if you've not started blogging yet, <a target="_blank" href="https://hashnode.com/@didicodes/joinme">create a blog with Hashnode</a> and get started immediately. If you already have experience as a tech blogger, here's a list of some <a target="_blank" href="https://github.com/malgamves/CommunityWriterPrograms">paid community writing programs</a> for developers.</p>
</li>
<li><p><strong>Sponsored Articles:</strong> Aside from paid community writing programs, you can also be sponsored by a company to write an article about them on your own blog. Oh yes! That is possible. For instance, if you've always been writing content about React, a company that builds products for React developers can pay for you to write an article about their services on your blog. If you want to explore this method of making money, this <a target="_blank" href="https://catalins.tech/learn-how-to-go-from-0-to-paid-articles">guide</a> by my friend <a class="user-mention" href="https://hashnode.com/@Catalinpit">Catalin Pit</a> will teach you how to go from 0 to paid articles.</p>
</li>
</ol>
<h2 id="community-funding">Community funding</h2>
<p>People can love your content so much that they decide to support you financially for creating those insightful content with platforms like Patreon or Buy Me a Coffee. Here's what you need to do. 👇</p>
<ol>
<li><strong>Write insightful articles:</strong> This is crucial because people need to find your articles useful enough to support you. 😉</li>
<li><strong>Write consistently:</strong> It won't be ideal to write just one article and decide to ask for community funding. When you write consistently, you earn support and trust from the community.</li>
<li><strong>Create a Patreon or Buy Me a Coffee account:</strong> These platforms provide a fast and beautiful way to accept financial support from your audience.</li>
<li><strong>Integrate Patreon or Buy Me a Coffee to your blog:</strong> When you add either or both of these platforms to your blog, people can easily identify that you would love to be supported for your content creation and support you.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>I am glad you are now aware of the different ways to make money from the content you create. Yes, you might be blogging for passion, but you can also make money simultaneously.</p>
<p>If you've not started blogging already, you don't need to create a blog from scratch to start. Create one with <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Hashnode</a> in under 2 minutes, start blogging and make some money! 🤑</p>
]]></content:encoded></item><item><title><![CDATA[Women are Legends!]]></title><description><![CDATA[This article is part of the #ChooseToChallenge campaign by Hashnode. 

I have and will always believe that women are legends. But most people in the world do not appreciate or acknowledge the hard work women put in every day to scale across different...]]></description><link>https://edidiongasikpo.com/women-are-legends</link><guid isPermaLink="true">https://edidiongasikpo.com/women-are-legends</guid><category><![CDATA[#ChooseToChallenge]]></category><category><![CDATA[womenwhocode]]></category><category><![CDATA[IWD2021]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Mon, 01 Mar 2021 13:36:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619974722122/ZHM_SW7GC.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>This article is part of the <a target="_blank" href="https://hashnode.com/iwd2021">#ChooseToChallenge</a> campaign by Hashnode. </p>
</blockquote>
<p>I have and will always believe that <strong>women are legends</strong>. But most people in the world do not appreciate or acknowledge the hard work women put in every day to scale across different areas of lives, so it almost <strong>feels like women are underrated legends</strong>. By underrated legends, I mean women in tech are not rated or highly valued enough like their male counterparts</p>
<p>Don’t believe me? Here’s a brief example. 👇🏾</p>
<p>Sometime in 2019, I collaborated with another team at the company I used to work with to write a technical article on one of our products. I wanted to add a design to the article, so I reached out to the design team. The design team shared the design with the team lead I was working with, and I noticed he didn’t like the design. An ideal approach would have been for him to give his feedback and proposed changes, but he said, and I quote, “ I know it’s a female designer that created this.” That statement showed that he didn’t value the skills of women in the design space and believed they were not good enough. Astonished by his perception, I had to speak up and challenge his perception of the issue until he realized he was wrong. </p>
<p>As I did, we can all choose to challenge and call out gender bias and inequality in the tech ecosystem and the world because biased mindsets will change when we do. </p>
<p>As we celebrate International Women’s Day this year, I stand with everybody lending a voice and <strong>#ChooseToChallenge</strong>:</p>
<ul>
<li>Every system, perception, &amp; ideology portraying women as undervalued and underrated. </li>
<li>People who don’t speak up when they see their colleague or random person say something condescending to women.</li>
<li>People who do not acknowledge the essential value women bring to the world.</li>
<li>People who do not celebrate women's achievements. </li>
</ul>
<p>Collectively, we can all help create an inclusive world. Let’s work together! </p>
]]></content:encoded></item><item><title><![CDATA[I asked 15 developers why they use Hashnode, and here's what they said]]></title><description><![CDATA[Since Hashnode was relaunched as a blogging platform in mid-June 2020, we have seen immense love from the developer ecosystem. Due to this, we are currently growing at a rate of 20% and more on all our major KPIs.
I was curious to know exactly why de...]]></description><link>https://edidiongasikpo.com/why-developers-use-hashnode-to-blog</link><guid isPermaLink="true">https://edidiongasikpo.com/why-developers-use-hashnode-to-blog</guid><category><![CDATA[developers]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[Developer Blogging]]></category><category><![CDATA[Interviews]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Mon, 25 Jan 2021 23:27:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619973644206/WAUmA3KE3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Since Hashnode was relaunched as a blogging platform in mid-June 2020, we have seen immense love from the developer ecosystem. Due to this, we are currently growing at a rate of 20% and more on all our major KPIs.</p>
<p>I was curious to know exactly why developers use Hashnode; was it the in-built dev community, total independence of their content, custom domain mapping, customization, or all of them? </p>
<p>To find out, I reached out to 15 developers across  the world and asked them a couple of questions that evolved around <strong>why they use Hashnode</strong></p>
<p>Read through to find out what they said. 👇🏽</p>
<h2 id="victoria-lo-lo-victoriacomhttpslo-victoriacom">Victoria Lo, <a target="_blank" href="https://lo-victoria.com">lo-victoria.com</a></h2>
<p>Hashnode has taught me about the power of personal branding and the importance of giving back to the community through sharing knowledge.</p>
<p>When I created my blog on Hashnode, I used the default hashnode domain (<a target="_blank" href="victoria.hashnode.dev">victoria.hashnode.dev</a>) because I didn't know the importance of mapping your blog to your domain. Thankfully, Sandeep (the co-founder of Hashnode) reached out to me, offering me my current domain (<a target="_blank" href="http://lo-victoria.com/">lo-victoria.com</a>). And suddenly, my viewers and online following grew beyond what I could have imagined.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1592617052267/KUaHl6HMa.png" alt="Victoria Lo" /></p>
<p>Thanks to developing my personal branding via my Hashnode blog, <strong>I got my current job as a Software Engineer at PayPal.</strong> So why use Hashnode? My answer is: <strong>why not?</strong></p>
<hr />
<h2 id="catalin-pit-catalinstechhttpscatalinstech">Catalin Pit, <a target="_blank" href="https://catalins.tech/">catalins.tech</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599477053426/_9ohW5jxv.jpeg" alt="Catalin Pit" /></p>
<p>I read your blog a few times, and I liked the design and feel of it. I became curious if it's custom-made or you are using a platform. Then I found out that you're using Hashnode, and the rest is history. I jumped on Hashnode too!</p>
<p>In my case, it satisfies all my needs. Using Hashnode is like I asked for a custom-made blog. I like it in all aspects, and what I like more is that you can request features. Surprisingly, they get implemented super fast if they are reasonable and requested by more people.</p>
<p>Hashnode has all I need and more. I wrote a detailed article about why Hashnode is different from other blogging platforms <a target="_blank" href="https://catalins.tech/why-hashnode-is-different-than-other-blogging-platforms">here</a>.</p>
<hr />
<h2 id="ayu-adiati-adiaticomhttpsadiaticom">Ayu Adiati, <a target="_blank" href="https://adiati.com/">adiati.com</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604797579124/fvQzhIN90.jpeg?" alt="Ayu Adiati" /></p>
<p>I discovered Hashnode via a tweet by Catalin Pit. My first impression was it is "different' and offers more features than other blogging platforms. So I gave it a try. </p>
<p>My experience with Hashnode has been excellent; The #2Articles1Week challenge motivated me to write consistently, I can customize the look of my blog, the community on discord is incredible, and the Hashnode team responds fast to complaints.</p>
<p>I use Hashnode because I can map my blog to my domain without worrying about security (SSH) and other things. All I need to do is write, and Hashnode takes care of the rest.</p>
<hr />
<h2 id="nick-bull-blognickbulljscomhttpsblognickbulljscom">Nick Bull, <a target="_blank" href="https://blog.nickbulljs.com/">blog.nickbulljs.com</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1607171582924/-X_mTlN_r.png?" alt="Nick" /></p>
<p>I was looking for a platform that would let me connect with a strong developer community and map my blog to a custom domain. I explored different options like Medium, Ghost, and DEV, but they gave me one of the things I required but not all. Then I heard about a blogging platform called Hashnode on Twitter and decided to check it out. </p>
<p>I glanced through the features, and these were my thoughts. 👇🏻</p>
<ul>
<li>Easy managing content? Check ✅</li>
<li>Can I host it on my domain? Check ✅ </li>
<li>Can you import previous articles from Medium? Check ✅</li>
<li>Comment section? Check ✅ </li>
<li>Design customization? Check ✅ </li>
</ul>
<p>I was very impressed and decided to use Hashnode as my blogging platform. <strong>Hashnode satisfies all my needs. I love it!</strong></p>
<hr />
<h2 id="tapas-adhikary-bloggreenrootsinfohttpsbloggreenrootsinfo">Tapas Adhikary, <a target="_blank" href="https://blog.greenroots.info/">blog.greenroots.info</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1600664833703/2v2e239Ft.jpeg" alt="Tapas" /></p>
<p>I use Hashnode for the following reasons: </p>
<ul>
<li><p><strong>The Power of Ownership:</strong>  I own my domain, and my blog can be accessed using it. The fact that creators have total control of every content they publish on their blogs makes Hashnode unique and different from platforms like DEV, Medium, etc. Hashnode gives my readers and me full freedom.</p>
</li>
<li><p><strong>The Community:</strong> On Hashnode, people encourage each other to write and improve their articles' quality. Hashnode hosts technical writing bootcamps, an active Discord channel, people in the community can help you review your drafts, brainstorm ideas on what to write next, and so much more. Hashnode also shares our articles on multiple social media channels, which gives us a better reach to our readers.</p>
</li>
<li><p><strong>Outstanding features:</strong> When I started a couple of years back, Hashnode had a limited set of features. But look at it now! It has mostly everything to make us a productive author. A simple yet powerful article editor, analytics, draft sharing, customization, static pages, Free SEO, third party integrations, GitHub integration for saving my post and even publishing it, writing challenges to keep the community motivated so much more.</p>
</li>
</ul>
<hr />
<h2 id="ayushi-rawat-ayushirawatcomhttpsayushirawatcom">Ayushi Rawat, <a target="_blank" href="https://ayushirawat.com/">ayushirawat.com</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599334249299/6I83yN5M_.jpeg" alt="Ayushi Rawat" /></p>
<p>Hashnode conducts technical writing bootcamps and exciting writing challenges, which motivate me to write more. I won one of Hashnode's writing challenges and received a fantastic swag kit from Hashnode. </p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1611231106758/ieBrKdAh2.jpeg?auto=compress" alt="Ayushi's Swag" />
Ayushi's Swag Kit from Hashnode</p>
</blockquote>
<p>I use Hashnode because I believe it is an excellent platform with a nice user interface. It's been a few months since I joined Hashnode, and the Community seems to be growing rapidly.</p>
<hr />
<h2 id="braydon-coyer-blogbraydoncoyerdevhttpsblogbraydoncoyerdev">Braydon Coyer, <a target="_blank" href="https://blog.braydoncoyer.dev/">blog.braydoncoyer.dev</a></h2>
<p>When I decided to start blogging, I knew I had a hard decision to make -- which platform do I choose? When I found Hashnode in Q3 of 2020, <strong>I immediately knew it was where I needed to be</strong>. Other platforms can't compare to the features and flexibility that Hashnode provides.</p>
<p>Hashnode has given me the outlet to share my knowledge, findings, and struggles with an ever-growing engaging community. I didn't know I enjoyed writing as much as I do -- this new creative outlet is all thanks to Hashnode!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1602993787902/HZHXjp6jR.jpeg?" alt="Braydon Coyer" /></p>
<p>Getting started with Hashnode is as simple as clicking a few buttons! It is, by far, the easiest way to start blogging in 2021, and I can't recommend it highly enough.</p>
<hr />
<h2 id="francesco-ciulla-francescociullacomhttpsfrancescociullacom">Francesco Ciulla, <a target="_blank" href="https://francescociulla.com/">francescociulla.com</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1607888008934/2qgL3Z4Q7.png?" alt="Francesco Ciulla" /></p>
<p>My very first article on Hashnode was the first in the world to get the badge for "Featured on Hashnode." 😁 That made me so excited and more motivated to write and use the platform.</p>
<p>I love the fact that I can my articles to my domain, add static pages to my blog, preview my drafts and insert images and code easily. </p>
<p>I strongly recommend Hashnode for every developer but especially for developers who don't have time to create their blog and focus on creating content! Just create an account and start writing!</p>
<hr />
<h2 id="omotola-shogunle-blogoshogunlecomhttpsblogoshogunlecom">Omotola Shogunle, <a target="_blank" href="https://blog.oshogunle.com/">blog.oshogunle.com</a></h2>
<p>I use Hashnode because it has a sense of community, the feedback on my post is almost immediate (good/bad), I see the analytics -- my blog performance is finally measurable. I have also read people's stories and formed connections with technical writers like myself, which's excellent. Also, the User Interface is beautiful and easy to use. It makes the job of writing content easier for me.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1590793151781/rKTqDyAXs.png?" alt="Omotola Shogunle" /></p>
<p>I would recommend Hashnode to developers interested in technical blogging in a heartbeat because it is honestly the most straightforward way to set up a blog. And trust me, I have tried a few.</p>
<hr />
<h2 id="idris-olubisi-blogidrisolubisicomhttpsblogidrisolubisicom">Idris Olubisi, <a target="_blank" href="https://blog.idrisolubisi.com/">blog.idrisolubisi.com</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1596502583059/VAFdTi-9b.jpeg" alt="Idris Olubisi" /></p>
<p>When I first heard about hashnode, I thought it was just like every other blogging platform, but I was amazed when I found out that Hashnode gives much more than just a blogging experience.</p>
<p>I use Hashnode because of its uniqueness, analytics, custom domain functionality, markdown experience, audience, custom page layout,<a target="_blank" href="http://daily.dev/">  daily.dev</a> integration, friendly community, etc. I also get to network with amazing people, and I get several messages thanking me for writing great content.</p>
<p>I'm pretty sure that when any developer starts using Hashnode, there won't be any reason to stop.</p>
<hr />
<h2 id="maxi-contieri-maximilianocontiericomhttpsmaximilianocontiericom">Maxi Contieri, <a target="_blank" href="https://maximilianocontieri.com/">maximilianocontieri.com</a></h2>
<p><img src="https://pbs.twimg.com/profile_images/1248350676020797442/PBhPnmo7_400x400.jpg" alt="Maxi Contieri" /></p>
<p>I use Hashnode because it is straightforward to use, customizable, and has a strong and growing community. I like it so much that I decided to map my domain to my Hashnode blog.</p>
<p>I have been writing 3 or 4 articles per week on my blog since October, and the feedback I've received from the developer community on Hashnode has been tremendous.</p>
<hr />
<h2 id="ruth-ikegah-cakebabydevhttpscakebabydev">Ruth Ikegah, <a target="_blank" href="https://cakebaby.dev/">cakebaby.dev</a></h2>
<p><img src="https://avatars.githubusercontent.com/u/62059002?s=460&amp;u=1145c6634325f11f504bde26c9ee3c57cd524ec5&amp;v=4" alt="Ruth Ikegah" /></p>
<p>I use Hashnode because it is not just a blogging platform but has a community of excellent developers where I can get an audience, feedback, and appreciation for my content. Additionally, <strong>Hashnode is the full package</strong> with so many unique features and ease with writing and analyzing contents.</p>
<p>My experience with blogging on Hashnode has been better and keeps getting better. Over time, exciting features are shipped in, and it's not just about what's changed but how it precisely suits the needs of the users of Hashnode.</p>
<hr />
<h2 id="pratham-prasoon-prathamprasooncodeshttpsprathamprasooncodes">Pratham Prasoon, <a target="_blank" href="https://prathamprasoon.codes/">prathamprasoon.codes</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1611476037820/TWdW7rLv8.png" alt="Pratham Prasoon" /></p>
<p>When I created a blog on Hashnode, I was very impressed. I use Hashnode because of the fantastic community, phenomenal interface, and ease of use. </p>
<p>Hashnode makes blogging very simple for me, and I would recommend Hashnode to other developers.</p>
<hr />
<h2 id="adewale-abati-devlogicacekydcomhttpsdevlogicacekydcom">Adewale Abati, <a target="_blank" href="https://devlogic.acekyd.com/">devlogic.acekyd.com</a></h2>
<p>I heard about Hashnode on Twitter, and upon checking it out, it seemed like a lovely community where you can share opinions and content with other developers. </p>
<p>The experience with Hashnode has been smooth. I quickly set up my custom domain - for free and start writing my own articles. The analytics on posts are also great.</p>
<p><img src="https://cloudinary-res.cloudinary.com/image/upload/w_700,c_fill/dpr_auto/Adewale%20Abati.jpg" alt="adewale.jpg" /></p>
<p>I use Hashnode because it provides a blog platform that I don't have to manage myself, and it has a community of developers, which ensures writers get more readership on their articles. </p>
<hr />
<h2 id="ana-vela-bloganaveladevhttpsbloganaveladev">Ana Vela, <a target="_blank" href="https://blog.anavela.dev/">blog.anavela.dev</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599945237596/OvfB0w7u9.jpeg?w=400&amp;h=400&amp;fit=crop&amp;crop=faces&amp;auto=compress" alt="Ana Vela" /></p>
<p>I heard about Hashnode through Twitter when they announced their first technical writing bootcamp. Providing valuable resources for blogging like this made me want to check out the Hashnode platform. I found it easy to set up and start blogging right away.</p>
<p>Hashnode continues to impress me with new features and hackathons to keep developers motivated to write and work on new projects. I'm always learning something new as I browse through articles regularly.</p>
<p>I find Hashnode to be a friendly place to write and learn from other developers. I recommend Hashnode to developers of all levels who want to start blogging.</p>
<hr />
<h2 id="conclusion">Conclusion</h2>
<p>Every single person I interviewed said Hashnode is absolutely worth recommending to other developers. In fact, one of them (Ayushi) has brought over 100+ developers on Hashnode already.</p>
<p>Hashnode is one of the fastest-growing developer blogging platforms. We want you to focus on creating and publishing articles on your blog while we take care of the rest.</p>
<p>I hope reading this article made you see the value Hashnode brings to the lives of developers. <strong>Not on Hashnode yet? <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Learn more &amp; start your personal blog for free</a>.</strong></p>
]]></content:encoded></item><item><title><![CDATA[How to use the GSAP ScrollTrigger plugin in React]]></title><description><![CDATA[Scrollytelling can be complicated to implement on a website without the use of scroll driven animation libraries. These libraries provide a simple interface for creating different interactions on the scroll and improving user experience.
Over the yea...]]></description><link>https://edidiongasikpo.com/using-gsap-scrolltrigger-plugin-in-react</link><guid isPermaLink="true">https://edidiongasikpo.com/using-gsap-scrolltrigger-plugin-in-react</guid><category><![CDATA[React]]></category><category><![CDATA[GSAP]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Thu, 21 Jan 2021 21:22:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619973576438/ixCVguHss.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="https://purplepublish.com/en/scrollytelling/#:~:text=The%20word%20%E2%80%9CScrollytelling%E2%80%9D%20itself%20is,change%20according%20to%20the%20context">Scrollytelling</a> can be complicated to implement on a website without the use of scroll driven animation libraries. These libraries provide a simple interface for creating different interactions on the scroll and improving user experience.</p>
<p>Over the years, there has been a significant improvement in scroll driven animation libraries that power scrollytelling in JavaScript. From the launch of <a target="_blank" href="http://johnpolacek.github.io/scrollorama/">SuperScrollorama</a> by <a target="_blank" href="https://twitter.com/johnpolacek?lang=en">John Polacek</a> in 2013 to <a target="_blank" href="https://scrollmagic.io/">ScrollMagic</a> by <a target="_blank" href="https://twitter.com/janpaepke">Jan Paepke</a> in 2014, and the recent announcement of <a target="_blank" href="https://greensock.com/scrolltrigger/">ScrollTrigger</a> by GSAP in 2020.</p>
<p>ScrollTrigger is the reinvention of scroll-driven animation but in a more suitable and user-friendly way, giving you the ability to control the flow of GSAP animations or any other thing while scrolling. In this tutorial, you will learn about the GSAP ScrollTrigger plugin, how to use it to trigger animations on the scroll in React, and the use cases for it.</p>
<h1 id="heading-prerequisites">Prerequisites</h1>
<p>This tutorial assumes the reader has the following:</p>
<ol>
<li><a target="_blank" href="https://nodejs.org/en/">Node</a> &gt;= 8.10 installed on their local development machine</li>
<li><a target="_blank" href="https://www.npmjs.com/package/npx">npx</a> 5.2 or higher installed on their local development machine</li>
<li>Basic understanding of how to animate elements with GSAP</li>
<li>A basic knowledge of HTML, CSS, JavaScript, and React</li>
</ol>
<h1 id="heading-introducing-the-gsap-scrolltrigger-plugin">Introducing the GSAP ScrollTrigger plugin</h1>
<p>GSAP is an acronym for the GreenSock Animation Platform. It is <a target="_blank" href="https://greensock.com/why-gsap">arguably the best animation library for the web</a> because it can animate DOM elements, canvas, SVG, CSS, WebGL, generic JavaScript objects, and so much more.</p>
<p><a target="_blank" href="https://greensock.com/why-gsap">The creators of GSAP</a> strongly believe it is the fastest full-featured scripted animation tool on the planet.</p>
<p>ScrollTrigger is built on the GSAP and can be used to trigger those intriguing GSAP animations on the scroll with just a few lines of code, excellent performance, cross-browser compatibility, and support from the GSAP community.</p>
<h1 id="heading-use-case-for-scrolltrigger">Use case for ScrollTrigger</h1>
<p>In this section we’ll look at the importance of ScrollTrigger, and when you should use it.</p>
<p>There are three circles in the demo below. The third circle has been animated with GSAP to move along the <code>x-axis</code> of the page for two seconds. The third circle might not be visible to you at first glance, so you need to scroll down.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/RwRdWeE">https://codepen.io/edyasikpo/pen/RwRdWeE</a></div>
<p>On scrolling down, you'll notice that the third circle had already moved towards the <code>x-axis</code> before you reached that section of the page. Yeah, I know. That's not cool.</p>
<p>The good news is, ScrollTrigger solves this problem with its ability to let you trigger the animations when a user reaches a specified viewport while scrolling.</p>
<h1 id="heading-the-possibilities-of-the-gsap-scrolltrigger-plugin">The possibilities of the GSAP ScrollTrigger plugin</h1>
<p>Here are some of the things you can do with ScrollTrigger:</p>
<ul>
<li>Animate anything (DOM, CSS, SVG, WebGL, and Canvas) on the scroll</li>
<li>Toggle playback state or scrub through animations</li>
<li>Automatic resizing on different screens</li>
<li>Support for vertical and horizontal scrolling</li>
<li>Ability to pin elements in place</li>
</ul>
<p>Find out more about these possibilities on <a target="_blank" href="https://greensock.com/scrolltrigger/">ScrollTrigger's website</a>.</p>
<h1 id="heading-scrolltrigger-basics">ScrollTrigger basics</h1>
<p>Before we trigger our animations on the scroll using ScrollTrigger, let's get familiar with the basics.</p>
<blockquote>
<p>This tutorial assumes that the reader has a fair understanding of how to animate using GSAP, so we will only cover the basics of ScrollTrigger. Find a fantastic resource to get you up to speed with GSAP <a target="_blank" href="https://ihatetomatoes.net/get-greensock-101">here</a>.</p>
</blockquote>
<p>The ScrollTrigger basics you will learn in this section will be used in building our project later in this tutorial. You can check out the full list of ScrollTrigger properties and methods in their <a target="_blank" href="https://greensock.com/docs/v3/Plugins/ScrollTrigger">documentation</a>.</p>
<p>If you already know the fundamentals of ScrollTrigger, you can skip this section and jump straight to the project section, where we'll build a simple landing page in React and trigger the animations on the scroll with ScrollTrigger.</p>
<h2 id="heading-trigger">trigger</h2>
<p>The <code>trigger</code> property is used to specify the point we want our animation to start. To add a <code>trigger</code> property, use the syntax below:</p>
<p><code>trigger: "element"</code></p>
<p>With this property, we can make the third circle in our previous demo the trigger point for the animation. This means that the circle will only move towards the x-axis when we reach the specified element’s (the third circle, in this case) viewport.</p>
<p>Let's set the <code>#thirdCircle</code> as the trigger point and see if anything changes:</p>
<p><code>trigger: "#thirdCircle"</code></p>
<p>Moment of truth! 😱</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/xxOBZpm">https://codepen.io/edyasikpo/pen/xxOBZpm</a></div>
<p>Now, you can see that the <code>#thirdCircle</code> starts animating as soon as it comes into view. Exciting right?</p>
<h2 id="heading-markers">markers</h2>
<p><code>markers</code> is a development-enabling feature that allows you to see the start and end position of the element to be animated and the page's viewport.</p>
<p>Let's add <code>markers</code> to our previous demo using the syntax below:</p>
<p><code>markers: true</code></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/zYBbrRJ">https://codepen.io/edyasikpo/pen/zYBbrRJ</a></div>
<p>If we scroll down to the trigger element (the third circle), we will notice that the <code>start</code> and <code>end</code> position is now visible thanks to <code>markers</code>.</p>
<h2 id="heading-start">start</h2>
<p>By default, the trigger element starts animating as soon as it enters the bottom of the scroller's viewport.</p>
<p>However, we can change the default <code>start</code> position using the ScrollTrigger <code>start</code> property.
Let's change the <code>start</code> position of the animation in our previous demo using the code below:</p>
<p><code>start: "top center"</code></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/mdEoVLJ">https://codepen.io/edyasikpo/pen/mdEoVLJ</a></div>
<ul>
<li>Here, <code>top</code> refers to the top of the trigger element, which is <code>thirdCircle</code> in this case</li>
<li><code>center</code> signifies the center of the webpage</li>
</ul>
<p>Aside from using keywords like <code>top</code>, <code>bottom</code>, and <code>center</code> to control the animation's position, we can also use pixel or percentage values.</p>
<h2 id="heading-end">end</h2>
<p>Just like we could change the <code>start</code> position, we can also change the <code>end</code> position using ScrollTrigger's <code>end</code> property.</p>
<p>By default, the trigger element stops animating as soon the bottom enters the top of the scroller's viewport. Let's change the <code>end</code> position of the animation in our demo using the code below.</p>
<p><code>end: "bottom top"</code></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/gOMEPKr">https://codepen.io/edyasikpo/pen/gOMEPKr</a></div>
<ul>
<li>Here <code>bottom</code> signifies the bottom of the trigger element <code>thirdCircle</code></li>
<li><code>top</code> here signifies the top of the webpage</li>
</ul>
<h2 id="heading-scrub">scrub</h2>
<p>The <code>scrub</code> property links the scroll position to an animation's progress. When you set <code>scrub</code> to <code>true</code>, it makes the scroll bar act as a scrubber while it's between the <code>start</code> and <code>end</code> position property.</p>
<p>Let's add a scrub using the syntax <code>scrub:true</code> to our demo to get a clearer understanding:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codepen.io/edyasikpo/pen/ZEOPQMR">https://codepen.io/edyasikpo/pen/ZEOPQMR</a></div>
<p>If you scroll through the page and look closely, you will notice that the trigger element (<code>thirdCircle</code>) moves along the x-axis when you scroll down, but if you scroll up again, it takes it back to the original position, thereby acting like a scrubber.</p>
<hr />
<p>So far, we've learned that ScrollTrigger allows you to trigger an animation when the page is scrolled to a specific viewport. We've also covered the basics of ScrollTrigger, now let's move on to using ScrollTrigger in a React app.</p>
<h1 id="heading-using-scrolltrigger-in-a-react-app">Using ScrollTrigger in a React app</h1>
<p>Yay! The time we've all been waiting for is here. In this section, we will build a basic landing page with React, animate the landing page, and trigger the animations using ScrollTrigger. </p>
<p>Check out the demo on <a target="_blank" href="https://eqkvg.csb.app/">Codesandbox</a> and code repository on <a target="_blank" href="https://github.com/didicodes/scrolly">GitHub</a>.</p>
<p>This section has been broken down into different steps to make it easier to understand.</p>
<h2 id="heading-step-1-create-a-react-project">Step 1: Create a React project</h2>
<p>First, let's spin up a React application by using <a target="_blank" href="https://reactjs.org/docs/create-a-new-react-app.html">Create React App</a>:</p>
<p><code>npx create-react-app scrolly</code></p>
<p>The command above will create a React application called <code>scrolly</code> for us. Once the application has been created successfully, switch to its repository using <code>cd scrolly</code> and run the command below:</p>
<p><code>npm start</code></p>
<p>If the React app has been created correctly, you should see this in your browser window when you navigate to <code>localhost:3000</code>.</p>
<p><img src="https://i.imgur.com/nX66vKg.png" alt="React Homepage" /></p>
<h2 id="heading-step-2-add-content-to-our-react-app">Step 2: Add content to our React app</h2>
<p>Open the newly created React app in your favorite integrated development environment (IDE) and paste the code below inside the App.js file:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">"./App.css"</span>;
<span class="hljs-keyword">import</span> workout <span class="hljs-keyword">from</span> <span class="hljs-string">"./workout.svg"</span>;
<span class="hljs-keyword">import</span> greensocklogo <span class="hljs-keyword">from</span> <span class="hljs-string">"./greensocklogo.svg"</span>;
<span class="hljs-keyword">import</span> happy <span class="hljs-keyword">from</span> <span class="hljs-string">"./happy.svg"</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>ScrollTrigger<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first-paragraph"</span>&gt;</span>
          is the coolest Greensock plugin.
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"img"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"celebrating"</span>&gt;</span>
            🥳
          <span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{workout}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"workout-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"workout"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"second"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{greensocklogo}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"gsap-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"greensocklogo"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"third"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"line"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{happy}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"happy-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"happy"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>The code above is a basic functional React component that we will use to animate our landing page.</p>
<p>Now, let me explain the code bit by bit:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'./App.css'</span>;
<span class="hljs-keyword">import</span> workout <span class="hljs-keyword">from</span> <span class="hljs-string">"./workout.svg"</span>;
<span class="hljs-keyword">import</span> greensocklogo <span class="hljs-keyword">from</span> <span class="hljs-string">"./greensocklogo.svg"</span>;
<span class="hljs-keyword">import</span> happy <span class="hljs-keyword">from</span> <span class="hljs-string">"./happy.svg"</span>;
</code></pre>
<p>Here, we imported all the external files we need to build the landing page. </p>
<p>The SVG images imported in the code snippet above can be found <a target="_blank" href="https://codesandbox.io/s/scrolltrigger-example-06rqh?file=/src/App.js:282-435">here</a>. To add these files to your React app, create a file for each of the SVG images (workout.svg, greensocklogo.svg, and happy.svg), copy the SVG code <a target="_blank" href="https://codesandbox.io/s/scrolltrigger-example-06rqh?file=/src/App.js:282-435">here</a>, and paste it into the files you created:</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>ScrollTrigger<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first-paragraph"</span>&gt;</span>
          is the coolest Greensock plugin.
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"img"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"celebrating"</span>&gt;</span>
            🥳
          <span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{workout}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"workout-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"workout"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"second"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{greensocklogo}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"gsap-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"greensocklogo"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"third"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"line"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{happy}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"happy-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"happy"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Here, we have a  parent <code>div</code> element with three child <code>div</code> elements. This section controls what is displayed on our landing page. Finally, we exported our <code>App</code> component so that we can reuse it in different sections of the React app. </p>
<p>If you added the SVG's images correctly, there shouldn't be any error, and the landing page should look like this now. 👇🏽</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/n0uft">https://codesandbox.io/s/n0uft</a></div>
<h2 id="heading-step-3-customize-the-landing-page">Step 3: Customize the landing page</h2>
<p>As you can see, our landing page isn't styled adequately, so make it more appealing with CSS. To do this, paste the code below into your <code>App.css</code> file:</p>
<pre><code class="lang-CSS">* {
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">0%</span>;
    <span class="hljs-attribute">margin</span>: <span class="hljs-number">0%</span>;
    <span class="hljs-attribute">box-sizing</span>: border-box;
}

<span class="hljs-selector-class">.first</span> {
    <span class="hljs-attribute">width</span>: auto;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">500px</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#fdfffc</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">30px</span>;
}

<span class="hljs-selector-class">.second</span> {
    <span class="hljs-attribute">width</span>: auto;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">400px</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#e0fbfc</span>;
}

<span class="hljs-selector-class">.third</span> {
    <span class="hljs-attribute">width</span>: auto;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">400px</span>;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#fdfffc</span>;
}

<span class="hljs-selector-class">.line</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;
    <span class="hljs-attribute">max-width</span>: <span class="hljs-number">1400px</span>;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">20px</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">20px</span>;
    <span class="hljs-attribute">position</span>: relative;
    <span class="hljs-attribute">display</span>: inline-block;
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#023047</span>;
}

<span class="hljs-selector-tag">h1</span> {
    <span class="hljs-attribute">text-align</span>: center;
    <span class="hljs-attribute">padding-top</span>: <span class="hljs-number">90px</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#023047</span>;
    <span class="hljs-attribute">font-size</span>: <span class="hljs-number">60px</span>;
}

<span class="hljs-selector-class">.first-paragraph</span> {
    <span class="hljs-attribute">text-align</span>: center;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#023047</span>;
    <span class="hljs-attribute">font-size</span>: <span class="hljs-number">20px</span>;
    <span class="hljs-attribute">font-weight</span>: bold;
}

<span class="hljs-selector-class">.logo-main</span> {
    <span class="hljs-attribute">align-items</span>: center;
    <span class="hljs-attribute">display</span>: flex;
    <span class="hljs-attribute">justify-content</span>: center;
}

<span class="hljs-selector-id">#workout-logo</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">500px</span>;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">300px</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">10px</span>;
}

<span class="hljs-selector-id">#gsap-logo</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">500px</span>;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">300px</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">50px</span>;
    <span class="hljs-attribute">padding-right</span>: <span class="hljs-number">80px</span>;
}

<span class="hljs-selector-id">#happy-logo</span> {
    <span class="hljs-attribute">width</span>: <span class="hljs-number">500px</span>;
    <span class="hljs-attribute">height</span>: <span class="hljs-number">300px</span>;
}

<span class="hljs-selector-class">.second-paragraph</span> {
    <span class="hljs-attribute">font-size</span>: <span class="hljs-number">30px</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">40px</span>;
}

<span class="hljs-selector-class">.third-paragraph</span> {
    <span class="hljs-attribute">font-size</span>: <span class="hljs-number">30px</span>;
    <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">40px</span>;
}
</code></pre>
<p>With the CSS we just added, our app should look like this. 👇🏽</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/06rqh">https://codesandbox.io/s/06rqh</a></div>
<h2 id="heading-step-4-target-elements-using-refs">Step 4: Target elements using refs</h2>
<p>We need to target the elements we intend to animate on the landing page using the <a target="_blank" href="https://medium.com/trabe/react-useref-hook-b6c9d39e2022">useRef</a> React hook. </p>
<p>Paste the updated code below into your  <code>App.js</code> file:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { useRef } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"./App.css"</span>;
<span class="hljs-keyword">import</span> workout <span class="hljs-keyword">from</span> <span class="hljs-string">"./workout.svg"</span>;
<span class="hljs-keyword">import</span> greensocklogo <span class="hljs-keyword">from</span> <span class="hljs-string">"./greensocklogo.svg"</span>;
<span class="hljs-keyword">import</span> happy <span class="hljs-keyword">from</span> <span class="hljs-string">"./happy.svg"</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> ref = useRef(<span class="hljs-literal">null</span>);

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">{ref}</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>ScrollTrigger<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first-paragraph"</span>&gt;</span>
          is the coolest Greensock plugin.
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"img"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"celebrating"</span>&gt;</span>
            🥳
          <span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{workout}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"workout-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"workout"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"second"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{greensocklogo}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"gsap-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"greensocklogo"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"third"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"line"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{happy}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"happy-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"happy"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Here’s an explanation of the code changes:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> {useRef} <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
</code></pre>
<p>We imported the <code>useRef()</code> React Hook into <code>App.js</code>:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> ref = useRef(<span class="hljs-literal">null</span>);
</code></pre>
<p>Then we created a variable called <code>ref</code> that will be used to store the reference of our target element (the parent <code>div</code>  element in this case).</p>
<pre><code class="lang-javascript">&lt;div ref={ref} className=<span class="hljs-string">"App"</span>&gt;
    ...
&lt;/div&gt;
</code></pre>
<p>Finally, we passed the mutable <code>ref</code> object into the parent <code>div</code> element. </p>
<h2 id="heading-step-5-animate-the-react-ref-using-gsap">Step 5: Animate the React ref using GSAP</h2>
<p>Now that we have targeted the element we intend to animate, let’s animate it with GSAP.  First, install GSAP into your React app by running the command below in your terminal:</p>
<p><code>npm install gsap</code></p>
<p>After installing GSAP into the React app successfully, paste the updated code below into your  <code>App.js</code> file:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { useRef, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"./App.css"</span>;
<span class="hljs-keyword">import</span> workout <span class="hljs-keyword">from</span> <span class="hljs-string">"./workout.svg"</span>;
<span class="hljs-keyword">import</span> greensocklogo <span class="hljs-keyword">from</span> <span class="hljs-string">"./greensocklogo.svg"</span>;
<span class="hljs-keyword">import</span> happy <span class="hljs-keyword">from</span> <span class="hljs-string">"./happy.svg"</span>;
<span class="hljs-keyword">import</span> { gsap } <span class="hljs-keyword">from</span> <span class="hljs-string">"gsap"</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> ref = useRef(<span class="hljs-literal">null</span>);
  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.fromTo(
      element.querySelector(<span class="hljs-string">".first-paragraph"</span>),
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
      },
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
      }
    );
  }, []);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.fromTo(
      element.querySelector(<span class="hljs-string">"#gsap-logo"</span>),
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">scale</span>: <span class="hljs-number">0.2</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
      },
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">scale</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">duration</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
      }
    );
  }, []);

  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.from(element.querySelector(<span class="hljs-string">".line"</span>), {
      <span class="hljs-attr">scale</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
    });
  }, []);

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">{ref}</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>ScrollTrigger<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first-paragraph"</span>&gt;</span>
          is the coolest Greensock plugin.
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"img"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"celebrating"</span>&gt;</span>
            🥳
          <span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{workout}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"workout-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"workout"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"second"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{greensocklogo}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"gsap-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"greensocklogo"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"third"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"line"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{happy}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"happy-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"happy"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Here’s an explanation of the changes we made to the existing code in our App.js file: </p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { useRef, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { gsap } <span class="hljs-keyword">from</span> <span class="hljs-string">"gsap"</span>;
</code></pre>
<p>We imported the <code>useEffect()</code> React Hook and <code>gsap</code> into <code>App.js</code>:</p>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    ...
}, []);
</code></pre>
<p>We initialized three different  <code>useEffect()</code> React Hooks for the three child <code>div</code> elements. Inside each <code>useEffect()</code> Hook, we created a constant variable called <code>element</code> and assigned it a reference to the parent <code>div</code> element we targeted using the <code>useRef()</code> React Hook:</p>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> element = ref.current;
  gsap.fromTo(
    element.querySelector(<span class="hljs-string">".first-paragraph"</span>),
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
    },
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
    }
  );
}, []);

useEffect(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> element = ref.current;
  gsap.fromTo(
    element.querySelector(<span class="hljs-string">"#gsap-logo"</span>),
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">scale</span>: <span class="hljs-number">0.2</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
    },
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">scale</span>: <span class="hljs-number">1</span>,
      <span class="hljs-attr">duration</span>: <span class="hljs-number">1</span>,
      <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
    }
  );
}, []);

useEffect(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> element = ref.current;
  gsap.from(element.querySelector(<span class="hljs-string">".line"</span>), {
    <span class="hljs-attr">scale</span>: <span class="hljs-number">0</span>,
    <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
  });
}, []);
</code></pre>
<p>In each of the three hooks, we added GSAP <code>tweens</code> to animate the three child <code>div</code> elements; <code>.first-paragraph</code>, <code>#gsap-logo</code>, and <code>.line</code>.</p>
<p>With this new update, our landing page now looks like this. 👇🏽</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/yrlm0">https://codesandbox.io/s/yrlm0</a></div>
<p> </p>
<p>If you look at the landing page now, you will notice that we've successfully animated the <code>.first-paragraph</code>, <code>#gsap-logo</code>, and <code>.line</code> child elements.</p>
<p>However, these animations start animating once the page is loaded into the browser window preventing us from seeing our animations in action. I bet you didn’t see the animation of the <code>.line</code> element at the end of the landing page. </p>
<p>Let's fix this by adding the <strong>ScrollTrigger plugin</strong> to ensure the animations are only triggered on the scroll.</p>
<h2 id="heading-step-6-trigger-animations-on-the-scroll-using-scrolltrigger">Step 6: Trigger animations on the scroll using ScrollTrigger</h2>
<p>Yay! It is time to see the ScrollTrigger plugin in action. </p>
<p>Paste the code below into the <code>App().js</code> file:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { useRef, useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"./App.css"</span>;
<span class="hljs-keyword">import</span> workout <span class="hljs-keyword">from</span> <span class="hljs-string">"./workout.svg"</span>;
<span class="hljs-keyword">import</span> greensocklogo <span class="hljs-keyword">from</span> <span class="hljs-string">"./greensocklogo.svg"</span>;
<span class="hljs-keyword">import</span> happy <span class="hljs-keyword">from</span> <span class="hljs-string">"./happy.svg"</span>;
<span class="hljs-keyword">import</span> { gsap } <span class="hljs-keyword">from</span> <span class="hljs-string">"gsap"</span>;
<span class="hljs-keyword">import</span> { ScrollTrigger } <span class="hljs-keyword">from</span> <span class="hljs-string">"gsap/ScrollTrigger"</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  gsap.registerPlugin(ScrollTrigger);
  <span class="hljs-keyword">const</span> ref = useRef(<span class="hljs-literal">null</span>);
  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.fromTo(
      element.querySelector(<span class="hljs-string">".first-paragraph"</span>),
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
      },
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">scrollTrigger</span>: {
          <span class="hljs-attr">trigger</span>: element.querySelector(<span class="hljs-string">".first"</span>),
          <span class="hljs-attr">start</span>: <span class="hljs-string">"top top"</span>,
          <span class="hljs-attr">end</span>: <span class="hljs-string">"bottom center"</span>,
          <span class="hljs-attr">scrub</span>: <span class="hljs-literal">true</span>,
        },
      }
    );
  }, []);
  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.fromTo(
      element.querySelector(<span class="hljs-string">"#gsap-logo"</span>),
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">scale</span>: <span class="hljs-number">0.2</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
      },
      {
        <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
        <span class="hljs-attr">scale</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">duration</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
        <span class="hljs-attr">scrollTrigger</span>: {
          <span class="hljs-attr">trigger</span>: element.querySelector(<span class="hljs-string">".first"</span>),
          <span class="hljs-attr">start</span>: <span class="hljs-string">"top center"</span>,
          <span class="hljs-attr">end</span>: <span class="hljs-string">"bottom top"</span>,
          <span class="hljs-attr">scrub</span>: <span class="hljs-literal">true</span>,
        },
      }
    );
  }, []);
  useEffect(<span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> element = ref.current;
    gsap.from(element.querySelector(<span class="hljs-string">".line"</span>), {
      <span class="hljs-attr">scale</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">ease</span>: <span class="hljs-string">"none"</span>,
      <span class="hljs-attr">scrollTrigger</span>: {
        <span class="hljs-attr">trigger</span>: element.querySelector(<span class="hljs-string">".third"</span>),
        <span class="hljs-attr">scrub</span>: <span class="hljs-literal">true</span>,
        <span class="hljs-attr">start</span>: <span class="hljs-string">"top bottom"</span>,
        <span class="hljs-attr">end</span>: <span class="hljs-string">"top top"</span>,
      },
    });
  }, []);
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">{ref}</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>ScrollTrigger<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"first-paragraph"</span>&gt;</span>
          is the coolest Greensock plugin.
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">role</span>=<span class="hljs-string">"img"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"celebrating"</span>&gt;</span>
            🥳
          <span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{workout}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"workout-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"workout"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"second"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{greensocklogo}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"gsap-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"greensocklogo"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"third"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"line"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"logo-main"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{happy}</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"happy-logo"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"happy"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> App;
</code></pre>
<p>Here’s an explanation of the changes we made to the code:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { ScrollTrigger } <span class="hljs-keyword">from</span> <span class="hljs-string">"gsap/ScrollTrigger"</span>;
</code></pre>
<p>We imported the ScrollTrigger plugin into <code>App.js</code>:</p>
<pre><code class="lang-javascript">gsap.registerPlugin(ScrollTrigger);
</code></pre>
<p>Then we registered the ScollTrigger plugin:</p>
<pre><code class="lang-javascript">useEffect(<span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> element = ref.current;
  gsap.fromTo(
    element.querySelector(<span class="hljs-string">".first-paragraph"</span>),
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">-20</span>,
    },
    {
      <span class="hljs-attr">opacity</span>: <span class="hljs-number">1</span>,
      <span class="hljs-attr">y</span>: <span class="hljs-number">0</span>,
      <span class="hljs-attr">scrollTrigger</span>: {
        <span class="hljs-attr">trigger</span>: element.querySelector(<span class="hljs-string">".first"</span>),
        <span class="hljs-attr">start</span>: <span class="hljs-string">"top top"</span>,
        <span class="hljs-attr">end</span>: <span class="hljs-string">"bottom center"</span>,
        <span class="hljs-attr">scrub</span>: <span class="hljs-literal">true</span>,
      },
    }
  );
}, []);
</code></pre>
<p>In each of our <code>useEffect()</code> Hooks, we added <code>scrollTrigger</code> as one of the values in our <code>gsap tween</code>.</p>
<pre><code class="lang-javascript">scrollTrigger: {
    <span class="hljs-attr">trigger</span>: element.querySelector(<span class="hljs-string">".first"</span>),
    <span class="hljs-attr">start</span>: <span class="hljs-string">"top top"</span>,
    <span class="hljs-attr">end</span>: <span class="hljs-string">"bottom center"</span>,
    <span class="hljs-attr">scrub</span>: <span class="hljs-literal">true</span>
}
</code></pre>
<p>We added our <code>trigger element</code> in this case, the <code>.first</code> element. Then we also specified the <code>start</code> and <code>end</code> position for the animation. Finally, we set <code>scrub</code> to <code>true</code> so that all our animations will act as a scrubber when we scroll through the landing page.</p>
<p>With the updated changes, our landing page's animations will only start animating when we reach the specified viewport while scrolling through the web page. See demo below. 👇🏽</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/scrolly-4-eqkvg?fontsize=14&amp;hidenavigation=1&amp;theme=dark">https://codesandbox.io/s/scrolly-4-eqkvg?fontsize=14&amp;hidenavigation=1&amp;theme=dark</a></div>
<hr />
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope you were able to learn about the GSAP ScrollTrigger plugin in this tutorial. Even though this tutorial covers the fundamental possibilities of using ScrollTrigger, there's so much more you can do with ScrollTrigger. You might be inspired by the demos on <a target="_blank" href="https://codepen.io/GreenSock">GreenSock's Code</a><a target="_blank" href="https://codepen.io/GreenSock">P</a><a target="_blank" href="https://codepen.io/GreenSock">en</a>.</p>
<p>If you have any questions, you can leave them in the comments section below.</p>
<h1 id="heading-resources-for-further-reading">Resources for further reading</h1>
<ul>
<li><a target="_blank" href="https://ihatetomatoes.net/get-greensock-101/">GreenSock 101</a>, Petr Tichy</li>
<li><a target="_blank" href="https://greensock.com/cheatsheet/">GSAP Cheatsheet</a>, GreenSock</li>
<li><a target="_blank" href="https://greensock.com/docs/v3/Plugins/ScrollTrigger">ScrollTrigger Documentation</a>, GreenSock</li>
<li><a target="_blank" href="https://greensock.com/st-mistakes/">Most Common ScrollTrigger Mistakes</a>, GreenSock</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[16 Great Tech Blogs by Women and Why You Should Read Them]]></title><description><![CDATA[Reading technical articles is one of the best ways to understand tech concepts because it's a combination of the authors' perspective, personality, and a spice of real-world analogies. 
As my first article for 2021, I will be highlighting 16 tech blo...]]></description><link>https://edidiongasikpo.com/16-great-tech-blogs-by-women-and-why-you-should-read-them</link><guid isPermaLink="true">https://edidiongasikpo.com/16-great-tech-blogs-by-women-and-why-you-should-read-them</guid><category><![CDATA[womenwhocode]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[tech ]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Tue, 05 Jan 2021 18:50:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619973368338/DbbQnhItr.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Reading technical articles is one of the best ways to understand tech concepts because it's a combination of the authors' perspective, personality, and a spice of real-world analogies. </p>
<p>As my first article for 2021, I will be highlighting 16 tech blogs written by women in tech across the world. If you want to read more tech articles this year, you should definitely follow these blogs</p>
<h3 id="emma-bostain-compiledbloghttpscompiledblog">Emma Bostain, <a target="_blank" href="https://compiled.blog/">compiled.blog</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865286591/fdpcLn3KB.png" alt="Emma's Blog.png" /></p>
<p>Emma is a Frontend Engineer at Spotify. She writes about CSS, JavaScript, technical interviews, how to publish an ebook &amp; so much more. She sure has a great way of explaining tech concepts in a very relatable way. Emma’s blog definitely inspired me to get into tech blogging. </p>
<h3 id="victoria-lo-lo-victoriacomhttpslo-victoriacom">Victoria Lo, <a target="_blank" href="https://lo-victoria.com">lo-victoria.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865315630/dK6FAVzye.png" alt="Victoria's Blog.png" /></p>
<p>Victoria is one of the most consistent tech bloggers I know. She writes about web development, ReactJS, and also shares blogging tips on her blog. Following her blog would definitely inspire you to write consistently &amp; effectively. </p>
<h3 id="angie-jones-angiejonestechhttpsangiejonestech">Angie Jones, <a target="_blank" href="https://angiejones.tech/">angiejones.tech</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865439792/GA8fgtptx.png" alt="Angie's Blog.png" /></p>
<p>With a mix of test automation strategies, coding recipes, &amp; tutorials on Java, this blog is perfect for QAs, Java enthusiasts, and developers interested in testing. </p>
<p>Angie is not only an amazing tech blogger; she is also a Java Champion and Principal Developer Advocate at Appitools.</p>
<h3 id="ayushi-rawat-ayushirawatcomhttpsayushirawatcom">Ayushi Rawat, <a target="_blank" href="https://ayushirawat.com">ayushirawat.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865456473/_rQOQ9IIL.png" alt="Ayushi's Blog.png" /></p>
<p>You know the popular quote that says;</p>
<blockquote>
<p>Building projects is one of the best ways to improve your coding skills? </p>
</blockquote>
<p>Ayushi's blog is the epitome of that quote. </p>
<p>She doesn't just write about a tech concept. She builds different projects with Python and explains how she was able to achieve them. If you want to improve your Python skills by building projects, her blog is for you.</p>
<h3 id="tania-rascia-taniarasciacomhttpswwwtaniarasciacom">Tania Rascia, <a target="_blank" href="https://www.taniarascia.com">taniarascia.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865592417/6ry_1c8dG.png" alt="Tania's Blog.png" /></p>
<p>I have read different tech articles throughout my career, and I must say that Tania's articles are the best. If you come across any of her articles, you will be astonished and learn a great deal.</p>
<p>Tania writes about Open Source, ReactJS, VueJS, amongst other things.</p>
<h3 id="ruth-ikegah-cakebabydevhttpscakebabydev">Ruth Ikegah, <a target="_blank" href="https://cakebaby.dev">cakebaby.dev</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865605623/NH_vqDi4y.png" alt="Ruth's Blog.png" /></p>
<p>Ruth's blog is the beginner's corner. She writes beginner-friendly and easy to understand articles about Python, Open Source, and GO. If you are a code newbie, you should read Ruth's articles.</p>
<h3 id="lindsey-a11ywithlindseycomhttpswwwa11ywithlindseycom">Lindsey, <a target="_blank" href="https://www.a11ywithlindsey.com">a11ywithlindsey.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865717082/BU6hNT6EZ.png" alt="Lindsey's blog.png" /></p>
<p>Lindsey is a self-taught web developer. She helps developers get the hang of accessibility, write better code, and empower them to build an exclusive internet through her blog. </p>
<h3 id="anita-ihuman-movihashnodedevhttpsmovihashnodedev">Anita Ihuman, <a target="_blank" href="https://movi.hashnode.dev/">movi.hashnode.dev</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609865733742/gM5yqYsR-.png" alt="Anita's Blog.png" /></p>
<p>Anita is a full stack developer and open source contributor. Her blog features beginner-friendly tech articles with a spice of real-world examples and developers' life.</p>
<h3 id="monica-lent-monicalentcomhttpsmonicalentcom">Monica Lent, <a target="_blank" href="https://monicalent.com">monicalent.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609866260244/PZjUhZTF-.png" alt="Monica's Blog.png" /></p>
<p>Monica Lent is a software engineer and former engineering manager. Trust me when I say her blog is the go-to place for all things blogging for devs, startups, and career growth. Her work utterly inspires me.</p>
<h3 id="sai-laasya-laasyasettybloghashnodedevhttpslaasyasettybloghashnodedev">Sai Laasya, <a target="_blank" href="https://laasyasettyblog.hashnode.dev">laasyasettyblog.hashnode.dev</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609866274657/M2PE_T5nU.png" alt="Laasy's Blog.png" /></p>
<p>If you are a Cloud enthusiast, Sai's blog should be added to one of your top resources for tech articles. Aside from writing about the Cloud, she shares insights on blogging and productivity.</p>
<h3 id="jennifer-opal-jenniferopalcohttpsjenniferopalco">Jennifer Opal, <a target="_blank" href="https://jenniferopal.co">jenniferopal.co</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609867455758/WhYHaADDX.png" alt="Jennifer's blog.png" /></p>
<p>Jennifer is a DevOps Engineer focusing on Big Data. Her blog covers many educative articles about inclusion, career, neurodiversity, and tons of motivation to start a tech career. I recently discovered her blog &amp; it is a gem. </p>
<h3 id="anna-j-blogannamcdougallcomhttpsblogannamcdougallcom">Anna J, <a target="_blank" href="https://blog.annamcdougall.com">blog.annamcdougall.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609867502079/at0F51DkN.png" alt="Anna's Blog.png" /></p>
<p>Anna is a web developer who demystifies JavaScript and CSS on her blog. I really love her content because she doesn't just focus on writing about frameworks or languages. She educates developers on how to ask questions, give compliments, and be inclusive.</p>
<h3 id="ali-spittel-welearncodecomhttpswelearncodecom">Ali Spittel, <a target="_blank" href="https://welearncode.com/">welearncode.com</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609872753662/nmSSqlWOy.png" alt="Ali's Blog.png" /></p>
<p>Ali is a Senior Developer Advocate at Amazon. She writes about AWS, coding questions, GraphQL, and so much more. I love her blog because it is so informative and user friendly at the same time. </p>
<h3 id="alyssa-holland-blogalyssahollandmehttpsblogalyssahollandme">Alyssa Holland, <a target="_blank" href="https://blog.alyssaholland.me/">blog.alyssaholland.me</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609861510949/c9AScr17P.png" alt="Alyssa's Blog" /> </p>
<p>I discovered Alyssa's blog some months ago on Hashnode, and I loved it. She writes about front-end development, productivity and Docker.</p>
<h3 id="gift-egwuenu-giftegwuenudevhttpswwwgiftegwuenudev">Gift Egwuenu, <a target="_blank" href="https://www.giftegwuenu.dev/">giftegwuenu.dev</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609868386230/NYOkpM1C2.png" alt="Gift's Blog.png" /></p>
<p>Gift is a frontend developer and content creator based in the Netherlands. She writes about content creation, preparing for tech interviews, front-end development and more. </p>
<h3 id="stephanie-morillo-stephaniemorillocohttpswwwstephaniemorilloco">Stephanie Morillo, <a target="_blank" href="https://www.stephaniemorillo.co/">stephaniemorillo.co</a></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1609861459375/7DAl6tKYC.png" alt="Stephanie's Blog" /> </p>
<p>Do you know what they say about saving the best for the last? Stephanie shares content that helps developers become better content creators and bloggers. She even wrote a book on content creation as well - that's how good she is. She's an inspiration. </p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope you found this article useful and would hopefully start reading these tech blogs this year.</p>
<p>Do you know of any other tech blog owned by a woman? Please share it in the comment section below, and I'll reply to every comment.</p>
]]></content:encoded></item><item><title><![CDATA[The Importance of Blogging as a Developer]]></title><description><![CDATA[Aside from being able to educate others, blogging is also a really great way to reinforce knowledge, build your brand, earn money, amongst other things.
Most developers shy away from blogging because they think they are not smart enough or they don't...]]></description><link>https://edidiongasikpo.com/why-is-it-important-to-blog-as-a-developer</link><guid isPermaLink="true">https://edidiongasikpo.com/why-is-it-important-to-blog-as-a-developer</guid><category><![CDATA[Blogging]]></category><category><![CDATA[Developer]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Tue, 29 Dec 2020 13:50:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972885341/-BfDo0aqk.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Aside from being able to educate others, blogging is also a really great way to reinforce knowledge, build your brand, earn money, amongst other things.</p>
<p>Most developers shy away from blogging because they think they are not smart enough or they don't think it is important.</p>
<p>As someone who has been into tech blogging for quite some time, I will be sharing some reasons why blogging is important for developers. If you've ever wondered why developers should blog, then this article was written with you in mind. I do hope you learn a thing or two from it.</p>
<p>Now let's get right into it. 💃🏽</p>
<h2 id="give-back-to-the-community">Give back to the community</h2>
<p>When you started learning how to code, you most likely read a couple of tech articles to grasp that programming language. You know what? Let's scratch that. You still read tech articles now that you are no longer a code newbie. </p>
<p>If the assumption I made above is correct, that means you've benefited from at least 1 tech blogger in the developer community at some point in your career.  So, why not write to help another developer too? </p>
<p>There's a high chance that this might not seem like an excellent reason for you to start blogging but try to imagine those articles that helped you out were not written by the authors and ask yourself if you would've been able to understand those tech concepts at the time. </p>
<p>Blogging gives you an opportunity to give back to the community, to help someone understand coding, and to inspire.</p>
<h2 id="improve-your-skill">Improve your skill</h2>
<p>Over the years, I have noticed that people think tech blogging is only about educating others. But that's not true. I believe blogging actually helps the author as much as it helps the reader. </p>
<p>Truth be told, most tech bloggers actually research the tech concepts days or weeks before writing an article about it on their blog. Because of this research carried out by tech bloggers, their knowledge about everything they write about keeps improving. For instance, if I write about ReactJS consistently for a year, I will be way better at ReactJS than I was the previous year when I didn't write anything about it. </p>
<p><strong>So, what exactly am I saying?</strong></p>
<p>Blogging helps to educate others, but it will help you learn about new things and improve your coding and communication skills.</p>
<h2 id="build-your-brand">Build your brand</h2>
<p>At first, it may seem like nobody is watching or noticing your articles. But over time, people will get to know you for the type of tech articles you write. And that, my friend, is a good way to build your brand.</p>
<p>Blogging about a certain programming language or tech concept consecutively will make you known in that respective developer community. This can lead to recommendations, opportunities, job offers, and so much more.</p>
<p>When recruiters see your blog posts, it can also increase your chances of getting the job over others who don't write technical articles because it shows them you are really knowledgeable about the subject matter and you also have good communication skills. I mean, who doesn't love a developer with strong communication skills? 😉</p>
<h2 id="make-money">Make money</h2>
<p>Oh yes, you can make money from blogging. In fact, it is such a good way to make a passive income even while working as a full-time developer. </p>
<p>Listed below are some ways to make money while blogging as a developer;</p>
<ol>
<li><strong>Ads:</strong> Adding ads to your blog is one of the most popular ways to make money through tech blogging. But most developers don't like seeing a lot of ads when they are reading articles, so I will recommend using <a target="_blank" href="https://www.carbonads.net/">Carbon Ads</a> because it centered around content for developers and designers, so developer may not leave your blog when they see these type of ads.</li>
<li><strong>Web monetization:</strong> If you are not a fan of ads, you can integrate <a target="_blank" href="https://x.hashnode.dev/web-monetization-on-hashnode-ckdu9umr900jmn0s1gr0r4gis">Web Monetization</a> on your blog.</li>
<li><strong>Paid community writing programs:</strong> There are tons of tech companies and communities that pay developers to write technical articles for them. Most of them pay between 100 to 2000 dollars. Here's a list of some <a target="_blank" href="https://github.com/malgamves/CommunityWriterPrograms">paid community writing programs</a> for developers. </li>
<li><strong>Affiliate links:</strong> You can add <a target="_blank" href="https://ahrefs.com/blog/affiliate-marketing/">affiliate links</a> from various tech companies on your blog posts. </li>
<li><strong>Community funding:</strong> Getting community funding is also another way to make money as a tech blogger. With a <a target="_blank" href="https://www.patreon.com/">Patreon</a> or <a target="_blank" href="https://www.buymeacoffee.com/">Buy Me a Coffee</a> account, various people in the developer community can support you financially monthly.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>Blogging is a combination of sharing &amp; gaining knowledge. It can help you achieve great things &amp; get better as a developer. </p>
<p>My final words would be to remind you that tech bloggers have the great benefit of becoming lifelong learners because they need to be well-versed in the field they are writing to explain the concepts to readers clearly. So when you blog, you also help yourself too. </p>
<p>If you now see why you should start blogging and want to get started, I'd recommend using <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Hashnode</a> because it is the easiest way to start a blog mapped to your personal domain for free &amp; connect with the readers through the Hashnode's developer community. </p>
<p>Do you know of any other benefits of blogging as a developer? Please share it in the comment section below, and I'll reply to every comment.</p>
]]></content:encoded></item><item><title><![CDATA[How to Start a Tech Blog in 2021]]></title><description><![CDATA[Technical blogging can reinforce your learning, educate people in the tech community, and serve as a good source of income. As a tech blogger, you have the great benefit of becoming a lifelong learner because you need to be well-versed in the field y...]]></description><link>https://edidiongasikpo.com/how-to-start-a-tech-blog-in-2021</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-start-a-tech-blog-in-2021</guid><category><![CDATA[Blogging]]></category><category><![CDATA[developers]]></category><category><![CDATA[writing]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Fri, 18 Dec 2020 06:34:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972784494/lrAjolYnL.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Technical blogging can reinforce your learning, educate people in the tech community, and serve as a good source of income. As a tech blogger, you have the great benefit of becoming a lifelong learner because you need to be well-versed in the field you are writing about to explain the concepts to readers clearly.</p>
<p>Due to blogging's numerous benefits, different people have asked questions like; what are the best technical blogging platforms? Should I build a blog from scratch or use a network-based technical blogging platform?</p>
<p>This article aims to answer some of those questions by highlighting some of the best ways to start a technical blog in 2021. I will divide it into network-based and self-hosted tech blogging platforms.</p>
<h2 id="network-based-platforms">Network-based Platforms</h2>
<p>These are technical blogging platforms with an existing audience that you can leverage when you publish articles. You don't have to understand how to code to use these platforms or worry about maintaining your blog as well. </p>
<h3 id="hacker-noon">Hacker Noon</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-uo2k3tng.jpeg?alt=media&amp;token=bc1871b7-1f8d-468b-a23d-6036928890b8" alt /></p>
<p><a target="_blank" href="https://hackernoon.com/?ref=hackernoon.com">Hacker Noon</a> is a community of over 12,000+ contributing writers publishing free high-quality tech stories.</p>
<p>Hacker Noon supports writers by proofreading their articles before it is published on the platform, has in-built blog analytics, strong security, and is web monetized to enable writers to earn money from their articles.</p>
<p>As a network-based platform, it already comes with an existing audience waiting to read the articles you publish on the platform.</p>
<h3 id="medium">Medium</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-r62v3ta5.jpeg?alt=media&amp;token=c5ff8eae-9805-4359-a806-4fc7dee918ec" alt /></p>
<p><a target="_blank" href="https://medium.com/?ref=hackernoon.com">Medium</a> is a community of writers, bloggers, journalists, and experts. - From the description, you can see that medium is not only for people in tech because it has various writers and publications from different areas of life. </p>
<p>No coding skill is required to create a blog on Medium. It comes with in-built analytics and a paid writer program. </p>
<p>Medium received many backlashes from the tech community when they added the paywall feature because users were limited to reading five articles for free every month on Medium. Even though these platforms come with many readers, you can't use your own domain on your blog, and there's not a lot of customization options.</p>
<h3 id="hashnode">Hashnode</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-e4313t4s.jpeg?alt=media&amp;token=faff62a3-c89b-4757-8387-8c8addc8280f" alt /></p>
<p><a target="_blank" href="https://hashnode.com/?ref=hackernoon.com">Hashnode</a> is a content creation platform and community that enables developers to create a blog on their personal domain for free. As a network-based platform, your articles are shared with the community on Hashnode for initial traction and readership. </p>
<p>You don't have to create your blog from scratch; hence no coding skill is required and you get to enjoy all the SEO benefits because the blog is mapped to your personal domain name. Blog customization is pretty great as well. </p>
<p>The platform doesn't have a paid writer program like medium but it has got web monetization integrated to enable writers to make money from their articles with no popup ads.</p>
<h3 id="devto">Dev.to</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-w3373tb5.jpeg?alt=media&amp;token=b168d632-c513-4253-bff8-c0a8c7c190fb" alt /></p>
<p><a target="_blank" href="https://dev.to/?ref=hackernoon.com">Dev.to</a> is an open-source software that powers a community of software developers who write articles and build relationships with other developers. </p>
<p>As a network-based platform, it comes with an existing audience waiting to read your articles. It doesn't require any coding skills to set up and is web monetized as well. </p>
<p>You can't map your blog to your personal domain, so the traffic goes to dev.to instead of your blog. The platform respects your canonical URLs so you can republish your articles.</p>
<h2 id="self-hosted-platforms">Self-hosted Platforms</h2>
<p>These platforms require understanding how to code. You have to create the blog from scratch and also maintain it as well. Self-hosted platforms do not come with have an existing audience like the network-based platforms.</p>
<h3 id="wordpressorg">WordPress.org</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-0v3d3ts2.jpeg?alt=media&amp;token=460ee096-31d9-4a7b-9dd2-808e7039e563" alt /></p>
<p><a target="_blank" href="https://wordpress.org/?ref=hackernoon.com">WordPress.org</a> is a software designed for building websites and blogs. You will have access to different plugins to enhance your blog and total control over every aspect of your blog.</p>
<p>It doesn't come with a built-in audience, so nobody might read your articles when you publish them except you have a good social media following or have been blogging for a long time. </p>
<p>You have to manage your own backups and security, so some coding knowledge is required here. There are tons of people using WordPress worldwide, so finding resources to help you build with WordPress is easy.</p>
<h3 id="mdx-and-nextjs">MDX and Next.js</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-ew3j3tld.jpeg?alt=media&amp;token=e8519186-3f20-40fb-a0cf-5c4184dda844" alt /></p>
<p><a target="_blank" href="https://mdxjs.com/?ref=hackernoon.com">MDX</a> is an authorable format that lets you write JSX and import components into your Markdown files, while <a target="_blank" href="https://nextjs.org/?ref=hackernoon.com">Next.js</a> is a React framework that enables you to build static and dynamic apps quickly.</p>
<p>You need to understand React and Next.js to be able to create the blog with MDX and Next.js. You have the power to customize your blog in different ways and also have total control of your content. </p>
<p>Since it is a self-hosted platform, there's no existing audience waiting to read your articles when you publish them.</p>
<h3 id="gatsby">Gatsby</h3>
<p><img src="https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2Fp8BChCKWg9QQJEV2oN1AlmDGGfs2-nu413ttf.jpeg?alt=media&amp;token=d9a4c3fb-7bbf-4c7c-b08f-3c9401f48bf6" alt /></p>
<p><a target="_blank" href="https://www.gatsbyjs.com/?ref=hackernoon.com">Gatsby</a> is a free and open-source framework based on React that helps developers build fast websites and blogs. </p>
<p>Knowledge of GraphQL and React is a must-have to build a blog with Gatsby. I believe Gatsby's documentation is excellent, so it shouldn't be challenging if you are looking to explore building with Gatsby. </p>
<p>Blog customization can be done in diverse ways and you will also have total control of your content. </p>
<p>As a self-hosted platform, you will be required to build your blog from scratch and maintain it. It doesn't come with an existing audience, so you may not get a lot of readerships, except your articles are shared on social media platforms.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Network-based and self-hosted platforms are great. It is essential to understand the differences between them and what you stand to gain from using either of them. </p>
<p>I hope you were able to learn about the best ways to start a technical blog in 2021. Thank you for reading this article.</p>
]]></content:encoded></item><item><title><![CDATA[My Thoughts on Using Hashnode vs Building a Blog From Scratch]]></title><description><![CDATA[Hashnode enables developers to create a blog mapped to their custom domain for free. So developers will only focus on publishing articles on their Hashnode powered blogs while Hashnode takes care of the rest - customization, readership, visibility, w...]]></description><link>https://edidiongasikpo.com/my-thoughts-on-using-hashnode-vs-building-a-blog-from-scratch</link><guid isPermaLink="true">https://edidiongasikpo.com/my-thoughts-on-using-hashnode-vs-building-a-blog-from-scratch</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[General Advice]]></category><category><![CDATA[developers]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Thu, 10 Dec 2020 18:19:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972728651/_2wgqfNJ9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hashnode enables developers to create a blog mapped to their custom domain for free. So developers will only focus on publishing articles on their Hashnode powered blogs while Hashnode takes care of the rest - customization, readership, visibility, web monetization, and so much more.</p>
<p>Most developers wonder why they should create a blog with Hashnode instead of building one from scratch. So, this article aims to question the reasoning of these developers and at the same time highlight why using Hashnode is a great option.</p>
<h2 id="first-i-have-3-questions-for-you">First, I have 3 questions for you 😀</h2>
<p>For every developer looking to create a blog from scratch, here are three questions I have for you:</p>
<h3 id="do-you-complete-every-side-project-you-work-on">Do you complete <em>every</em> side project you work on?</h3>
<p>I honestly can't keep track of the number of side projects I have not completed over the years. And interestingly, this seems to be the case with other developers across the world.</p>
<p>If your case is different, then I'd love to know your secret. But if you are like most of us with uncompleted side projects, do you think building a blog would be different?</p>
<p>Let's assume you decide to build a blog from scratch, what happens when you can't finish it due to lack of time? You won't be able to publish an article on an unfinished blog. So, there goes the beginning of your dev blogging journey down the drain. 😭</p>
<h3 id="would-you-have-time-to-maintain-the-blog">Would you have time to maintain the blog?</h3>
<p>Assuming you complete building the blog, what happens when you can't maintain the blog after some months/year because of your busy schedule or for some other reasons beyond your control? You may be forced to stop publishing articles till you update the blog or at the worst case, stop publishing articles forever.</p>
<p>Time is a scarce resource and it may be advisable to spend your time on activities that have the highest investment. Maintaining a blog when Hashnode already does that for you at no cost, may not be the best investment of your time.</p>
<h3 id="how-would-people-discover-the-articles-you-publish-on-your-blog">How would people discover the articles you publish on your blog?</h3>
<p>When you create a blog from scratch, it doesn't come with an inbuilt community like Hashnode. So if you don't have a strong social media presence, your article might not be read by people for a couple of weeks, months or even years.</p>
<p>But with Hashnode, there are different developers across the world early waiting to read your insightful articles from day 1. So, there's no cold start for you.</p>
<h2 id="so-what-exactly-am-i-saying">So, what exactly am I saying?</h2>
<p>Creating a blog with Hashnode saves you the stress of creating your blog yourself and helps you to be more efficient. It gives you the best of both worlds - a blog mapped to your domain for free and readership from the dev community.</p>
<p>The good thing is, you can create a blog on Hashnode in under 2 minutes and start writing articles immediately. You can also republish your existing articles on Hashnode for more visibility if you are not ready to move to Hashnode entirely yet.</p>
<p>Guess what? I am not the only developer who loves using Hashnode. Here's what other <a target="_blank" href="https://hashnode.com/testimonials">developers worldwide think about Hashnode</a>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>This article is very opinionated and may not necessarily apply to developers that build blogs because they want to learn about the languages or framework used during the building process.</p>
<p>So, if that's you,  go ahead and build that blog from scratch. After all, you will not have to maintain it or publish articles there. And if you do, your intention may just be to test out what you've built.</p>
<p>But to developers like me who have full-time jobs, and other responsibilities but want to ship out articles to the developer community and get a lot of readerships - Hashnode is what you need to use. <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Learn more and create a blog on Hashnode</a>.</p>
]]></content:encoded></item><item><title><![CDATA[How to Kickstart a Career in Tech]]></title><description><![CDATA[A career in tech is a career without boundaries. From web development to product design to project management to app development, the range of job roles and opportunities in the tech ecosystem is huge.
You might think you're not good enough to have a...]]></description><link>https://edidiongasikpo.com/how-to-kickstart-a-career-in-tech</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-kickstart-a-career-in-tech</guid><category><![CDATA[Career]]></category><category><![CDATA[tech ]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Wed, 09 Dec 2020 09:46:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1607507030144/f8VFAV8OK.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A career in tech is a career without boundaries. From web development to product design to project management to app development, the range of job roles and opportunities in the tech ecosystem is huge.</p>
<p>You might think you're not good enough to have a career in tech -- but give yourself a chance. You can do it.</p>
<p>The truth is you, don't have to be a genius to work in technology. And in this article, I'll explain how you can kickstart your own career in tech.</p>
<h2 id="do-your-research">Do Your Research</h2>
<p><img src="https://lh3.googleusercontent.com/8HyjqI1yMiF3BjLOFS7Ajq-_XQTEy5HFKhDoTlsjYOMtD9UEzwxFX5Fb9zteAPlRkz-6FdnRa7FjGaz1PWo_kZ-H0vuEQWB-q1k9tQg8qAAz0Fl6rgCpHUKFkmRWCWKTVQkbIuaX" alt /></p>
<p>Technology is a very broad field. This means that there are different areas in tech that require certain skills. In order to discover the right role for yourself, you need to do some research.</p>
<p>You can start by researching the major areas in tech below:</p>
<ul>
<li><a target="_blank" href="https://www.freecodecamp.org/news/beginners-roadmap-web-development/">Web Development</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/what-is-mobile-app-development/">Mobile Development</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-break-into-product-management-d354944308c0/">Product Management</a></li>
<li><a target="_blank" href="https://edidiongasikpo.com/technical-writing-what-and-how">Technical Writing</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-become-a-ux-designer-8f5c8567aefd/">UI/UX  Designing</a></li>
<li><a target="_blank" href="https://www.smashingmagazine.com/2018/01/comprehensive-guide-product-design/">Product Design</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/how-to-become-a-data-scientist-2d829fa33aba/">Data Science</a></li>
</ul>
<p>After reading through the resources listed above, you will have a better idea of the major areas in tech. With this knowledge, you can go ahead and explore the area that you found most interesting.</p>
<p>You can either do this online using your favorite search engine or by asking someone in tech (if you know any).</p>
<p>If you decide to follow the <strong>search engine route</strong>, ask questions targeted at what you want to discover. For instance, if you want to learn about the benefits of technical writing, your question should follow this format "<em>What are the benefits of becoming a technical writer?</em>".</p>
<p>If you want to know about the skills required to be a Data Scientist, then your question should follow this format "<em>What do I need to know to become a data scientist?</em>" or "<em>How do I become a data scientist?</em>".</p>
<p>To be honest, it is almost impossible to not find information about the different areas in technology online.</p>
<p>If you decide to <strong>ask someone in tech, </strong>always be polite and go straight to the point. Instead of saying "<em>Hi</em>" and waiting for the person to respond before asking your question, you can follow this format:</p>
<p>"<em>Hi Rita, my name is Edidiong and I have been researching different career paths in tech. I have read different articles online but I wanted to also hear your opinion as well. How did you know web development was the right career for you? I'd totally understand if you can't respond because of your busy schedule but I will be glad if you do</em>."</p>
<p>You might think that this was a pretty long message, but it covered the most important things: your name, what you need, the research you've done already, and that you understand that you are not entitled to the person's time.</p>
<h2 id="decide-which-path-to-take">Decide Which Path to Take</h2>
<p><img src="https://lh4.googleusercontent.com/SYNgr_JBDmEihWkviF4czVkCAzGvDHff0nujBAxrgEMaCT_lI2K0KWhd3nWLXYQ-2z6-9NYibOhHMvVrI_BBUauaAXhon8KL38C1NHga6FJRimwqYA1KRhgVRzbUsST0Z7U9X7hG" alt /></p>
<p>After carrying out the necessary research, you need to take a moment and decide on the tech career path you want to pursue.</p>
<p>Perhaps you've read about product design, but you've never had an eye for designing or using colors effectively. Then maybe you also heard about program management and it made you excited because you've always loved managing people or events.</p>
<p>And maybe your friend in tech also told you about the benefits of being a web developer and you were impressed. But you are not sure yet which tech role to pursue because they all sound good.</p>
<p>Here are some tips for things to think about when trying to make this decision.</p>
<h3 id="think-about-your-current-transferrable-skills">Think about your current (transferrable) skills</h3>
<p>Before you decided to kickstart a career in tech, you were mostly doing something else that you found interesting. Let's assume you loved painting.</p>
<p>Anyone who loves to paint understands a lot about colors -- so that means product or UI/UX design might be a good fit for you. The goal here is to try to connect your current skill or hobbies to your proposed tech career path.</p>
<h3 id="just-get-started-no-matter-how-that-looks">Just get started -- no matter how that looks</h3>
<p>Choosing an initial tech career path doesn't mean that's what your career will always be about. My point is, it is totally fine to start out as a <em>technical writer</em> and switch to <em>mobile development</em> later.  </p>
<p>For instance, I started out as an android developer but eventually switched to web development. So go ahead and get your feet wet before you narrow down to exactly what you want.</p>
<h3 id="go-for-passion-but-be-practical-too">Go for passion, but be practical too</h3>
<p>It is important to know that choosing to pursue a certain tech role because you are passionate about it is great. But it's also ok to choose a role because you believe the opportunities are better, even if you are not very passionate about it.</p>
<p>So, I'd recommend that you do a mixture of both: choose something you will enjoy doing and become so good that you get tons of opportunities.</p>
<h2 id="find-tools-and-resources-online">Find Tools &amp; Resources Online</h2>
<p><img src="https://lh6.googleusercontent.com/S6qSGoWm1gX15RZdsZ9LP06k9fl30j8FS0V61IGaGv2lipJZqIHb8qIoaVieVXCAikk0sZ_bicT_2XuN2tcGBUc-9XM-NoIWa6NCC_bGHdYBbz8oEeLUdV-PEPc6p6G09XzPiStz" alt /></p>
<p>Remember how I said it is almost impossible not to find resources about tech online? Yes, I wasn't joking.</p>
<p>It's so amazing that you can also find really insightful resources to kickstart your career in tech for free.</p>
<p>For instance, freeCodeCamp is a platform that empowers people from all over the world to learn how to code for free. I personally used it while learning how to code and it was one of the best resources. 😃</p>
<p>To find these tools and resources, search for them on Google by using keywords and phrases like <strong>where can I learn how to be a (insert tech role) for free?</strong></p>
<p>If you have the funds to acquire paid tools and resources, go for it. If you prefer one on one sessions with a tutor, then you can pay for that, too. 🤑</p>
<p>Simply put, finding the resource is not an issue. Choosing the right resource is the key thing here.</p>
<p>So, how do you choose the right project? I'll tell you!</p>
<ul>
<li>First, think about your preferred way of learning. For example, do you prefer reading or watching videos?</li>
<li>After choosing your preferred learning format, make sure you choose a resource that has some structure. By structure, I mean a plan or curriculum that will educate you about the necessary skills step by step until you understand.</li>
<li>Ask questions or read reviews about the resource.</li>
<li>Do a quick test run to see if this resource is the right one for you. Does it have the right format, good examples, pictures, and so on?</li>
</ul>
<p>This is very important because choosing the wrong resource or tool might make you give up easily because you won't enjoy the process or understand what you are trying to learn.</p>
<h2 id="just-start-learning">Just Start Learning</h2>
<blockquote>
<p><strong>The secret of getting ahead is getting started. - Mark Twain</strong></p>
</blockquote>
<p>Yes, I had to share Mark Twain's quote because it is something we all need to remember when we are about to take up a new challenge.</p>
<p>Deciding to kickstart a career in tech is great, but putting in the necessary work to learn is even greater.</p>
<p><img src="https://lh4.googleusercontent.com/8Rc9qF2Hd3-Xt-e83Pd7epL2GfIlFK0dmw6msW8jQqQ4x37ez4CI9E48zni7U7lZzBQfdvaXO6Zcs7J3Zi86Y8C-hDRL3nsIrdy6Zk_WGs3kM_3dPvhtaEfBn9MrsX3rCVJ_6zLf" alt /></p>
<p>Think about it this way: you did your research about different roles in tech, you chose your preferred tech career path, and you found the right learning resources. But now you don't want to put in the work and learn? No!</p>
<p>You didn't spend all that time and effort to give up at the most important point.</p>
<p><strong>You have to start learning.</strong></p>
<p>Set up a schedule that works for you. For instance, learning for at least 30 minutes or 1 hour every day. If you have more time, then spend more time learning. Your growth will be tremendous.</p>
<h2 id="build-projects">Build projects</h2>
<p>Once you have a good foundation of knowledge, start building basic projects.</p>
<p>Most people think they need to know everything about a particular programming language or tool before they start building a project. But most times, this only results in watching tutorials for months.</p>
<p><img src="https://lh5.googleusercontent.com/SEN5atLOM4n8zIUHuslTJ69p37kvdNdOFVKzpbQMHg-4Y278Sk2JXQmVcdQQgbPw9sJajbMl7OUcgjeHX82U14Z6ShblA2Fg3kkYs3JFXx7LV7DZdhiExMMMOR8nx_Ro1l2OB58A" alt /></p>
<p>The truth is that building projects lets you improve your coding skills in ways you can't imagine. It also gives you something to show off in interviews when you are telling your interviewers about your tech skills.</p>
<p>Here's a list of beginner-friendly projects ideas:</p>
<ul>
<li><a target="_blank" href="https://codinginflow.com/app-ideas-learn-android-programming">9 Simple App Ideas to Learn Android Programming (With Tutorials).</a></li>
<li><a target="_blank" href="https://www.freecodecamp.org/news/more-project-ideas-to-improve-your-coding-skills-99f48d09bb4b/">Project ideas to help you improve your coding skills</a></li>
<li><a target="_blank" href="http://www.webtrainingcentre.com/ux-design-projects-beginners/">UX Design Projects for Beginners.</a></li>
<li><a target="_blank" href="https://www.upgrad.com/blog/web-development-project-ideas-for-beginners/">21 Interesting Web Development Project Ideas For Beginners [2020].</a></li>
<li><a target="_blank" href="https://www.pinterest.com/ReidSchlegel/product-design/">500+ Product Design ideas in 2020.</a></li>
<li><a target="_blank" href="https://blog.moeminmamdouh.com/7-websites-to-find-front-end-projects-for-your-portfolio">7 Websites To Find Front End Projects For Your Portfolio.</a></li>
<li><a target="_blank" href="https://blog.greenroots.info/how-to-find-blog-content-ideas-effortlessly-ckghrjv5200o7rhs1ewn40102">How to find blog content ideas effortlessly?</a></li>
</ul>
<h2 id="start-writing">Start writing</h2>
<p>Most people think you have to be super smart to start writing and sharing knowledge. But I completely disagree. As much as we write to share knowledge, we also write to document what we've learned.</p>
<p>Our brains don't have the capacity to remember everything we've learned, so writing it down on your blog will serve as a reference point for you in the future. It can also help someone who is also trying to understand that concept you just learned.</p>
<p>In my case, I created my <a target="_blank" href="http://edidiongasikpo.com/">blog</a> with <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Hashnode</a> because it is super fast, has a strong community, and allows you to map the blog to your domain. I'd recommend you use the same platform for creating your first blog.</p>
<p>After you've gotten comfortable with writing, you can now submit your articles to the amazing <a target="_blank" href="http://freecodecamp.org/">freeCodeCamp</a> publication to reach a wider audience and give back to the tech community.</p>
<p><img src="https://lh3.googleusercontent.com/k5IRNKiSFBUQt_Q1aH1iklNFDYTm9RbWOd1hB3LakyH7Tgzm8eDjVtqC6vVKphtfEEPc6yXqsrKOf4D6sGV2Nrn3aPshdsd8z87QvqBGpkqxWu3vnB9HWNd1_UQtym66stvdGWSq" alt /></p>
<p>Writing is a great way to digest and process the information you take in. It gives you access to so many opportunities and can also help you make your mark in the tech ecosystem.</p>
<p>Writing changed my life, and I believe it will be of great help to you and your tech career. <a target="_blank" href="https://hashnode.com/@didicodes/joinme">Start blogging now</a>.</p>
<h2 id="stay-consistent">Stay consistent</h2>
<p><img src="https://lh5.googleusercontent.com/0HbPtWXfDHBYwngCGal0IOmdrn9nyGKcNB3IGaxUtKSGkQ2Y315lRZtM3XmoFcwKMY_rUWyQVlBqw6mr2Vug6DrLUCSGdXkmdY7OhZOkJ_2w-jwLgWASsYbAVCYjRpPvZcuwzkiV" alt /></p>
<p>This is the most important step in kick-starting a career in tech. It's highly unlikely you'll achieve great things if you're not consistently trying to improve on your chosen tech skill.</p>
<p>Consistency forms habits that become almost second nature. So if you code or design for at least 30 minutes every day for a month, you will become better and better.</p>
<p>It is not compulsory to stick with the 30 minutes scenario above -- just find out what works for you, and be very consistent. Only then will the sky be your limit.</p>
<h2 id="summary">Summary</h2>
<p>Kickstarting a career in tech is definitely doable if you follow these steps. And I strongly encourage you to try, because of the diverse opportunities that come with it.</p>
<p>Anybody who is willing to learn can start a career in tech with or without any formal knowledge from school. Just go ahead and start.</p>
<p>Yes, it may not be really easy, but there are so many supportive tech communities willing to help you through.</p>
<p>I hope you learned a thing or two from this article. If you have any questions, feel free to send me a <a target="_blank" href="https://twitter.com/Didicodes">DM on Twitter</a> and I'll be happy to answer every single one.</p>
]]></content:encoded></item><item><title><![CDATA[How to Use SVG Images in CSS and HTML – A Tutorial for Beginners]]></title><description><![CDATA[SVG stands for Scalable Vector Graphics. It is a unique type of image format for vector-based graphics written in Extensible Markup Language (XML).
In this tutorial, I will explain why you'd want to use SVG images and how you can use them in CSS and ...]]></description><link>https://edidiongasikpo.com/how-to-use-svg-images-in-css-and-html-a-tutorial-for-beginners</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-use-svg-images-in-css-and-html-a-tutorial-for-beginners</guid><category><![CDATA[SVG]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[CSS]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Thu, 03 Dec 2020 11:39:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1606994250748/DaB_nRohw.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>SVG stands for Scalable Vector Graphics. It is a unique type of image format for vector-based graphics written in Extensible Markup Language (XML).</p>
<p>In this tutorial, I will explain why you'd want to use SVG images and how you can use them in CSS and HTML.</p>
<h2 id="why-should-you-use-svg-images">Why should you use SVG images?</h2>
<p>There are several reasons to use SVG images, some of which are:</p>
<ul>
<li>SVG images do not lose their quality when zoomed or resized.</li>
<li>They can be created and edited with an IDE or text editor.</li>
<li>They are accessible and animatable.</li>
<li>They have a small file size and are highly scalable.</li>
<li>And they can be searched, indexed, scripted, and compressed.</li>
</ul>
<p>Now let's see how you can actually work with SVG images.</p>
<h2 id="how-to-download-the-svg-image-used-in-this-tutorial">How to download the SVG image used in this tutorial</h2>
<p>If you want to work with the SVG image I've used in this tutorial, follow the steps (and diagram) below to download it.</p>
<ul>
<li>Go to <a target="_blank" href="https://undraw.co/">unDraw</a>.</li>
<li>Change the background colour to yellow.</li>
<li>In the search box, search for the word <strong>happy</strong>.</li>
</ul>
<p><img src="https://i.imgur.com/ncSY7Rn.png" alt="unDraw's Homepage" /></p>
<ul>
<li>Click on the image named <strong>Happy news</strong>.</li>
<li>On the pop-up window, click on the <strong>Download SVG to your projects</strong> button.</li>
</ul>
<p><img src="https://i.imgur.com/qGrT73n.png" alt="Download the SVG file" /></p>
<p>If you followed the steps above correctly, the SVG image should be on your computer now.</p>
<p><img src="https://i.imgur.com/3uCGy6B.png" alt /></p>
<p>Now, open the SVG image in your favourite IDE or text editor. Rename it to <strong>happy.svg</strong> or whatever name you prefer.</p>
<h2 id="how-to-use-svg-images-in-css-and-html">How to use SVG images in CSS and HTML</h2>
<p>There are several different ways to use SVG images in CSS and HTML. We will explore six different methods in this tutorial.</p>
<h3 id="1-how-to-use-an-svg-as-an-lessimggreater">1. How to use an SVG as an <code>&lt;img&gt;</code></h3>
<p>This method is the simplest way to add SVG images to a webpage. To use this method, add the <code>&lt;img&gt;</code> element to your HTML document and reference it in the <code>src</code> attribute, like this:</p>
<pre><code class="lang-css">&lt;<span class="hljs-selector-tag">img</span> <span class="hljs-selector-tag">src</span> = "<span class="hljs-selector-tag">happy</span><span class="hljs-selector-class">.svg</span>" <span class="hljs-selector-tag">alt</span>="<span class="hljs-selector-tag">My</span> <span class="hljs-selector-tag">Happy</span> <span class="hljs-selector-tag">SVG</span>"/&gt;
</code></pre>
<p>Assuming you downloaded the SVG image from unDraw and renamed it to <strong>happy.svg</strong>, you can go ahead and add the code snippet above into your HTML document.</p>
<p>If you did everything correctly, your webpage should look exactly like the demo below. 👀</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-mppxs?fontsize=14&amp;hidenavigation=1&amp;theme=dark">https://codesandbox.io/s/svg-demo-mppxs?fontsize=14&amp;hidenavigation=1&amp;theme=dark</a></div>
<p>When you add an SVG image using the <code>&lt;img&gt;</code> tag without specifying the size, it assumes the size of the original SVG file.</p>
<p>For instance, in the demo above, I didn't modify the size of the SVG image, so it assumed its original size (which was a width of  <code>600.53015px</code> and a height of <code>915.11162px</code>).</p>
<p><strong>Note: </strong>to change the original size, you have to specify the <code>width</code> and <code>height</code> with CSS as you can see in the demo below. You can also update the original <code>width</code> and <code>height</code> directly.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-1-ey5me?from-embed">https://codesandbox.io/s/svg-demo-1-ey5me?from-embed</a></div>
<p>Even though we can change the size of SVG images added via the <code>&lt;img&gt;</code> tag, there are still some restrictions if you want to make major style changes to the SVG image.</p>
<h3 id="2-how-to-use-svg-as-a-css-background-image">2. How to use SVG as a CSS <code>background-image</code></h3>
<p>This is similar to adding SVG to an HTML document using the <code>&lt;img&gt;</code>  tag. But this time we do it with CSS instead of HTML as you can see in the code snippet below.</p>
<pre><code class="lang-css"><span class="hljs-selector-tag">body</span> {
  <span class="hljs-attribute">background-image</span>: <span class="hljs-built_in">url</span>(happy.svg);
}
</code></pre>
<p>When you use an SVG as a CSS background image, it has similar limitations to using <code>&lt;img&gt;</code>. Still, it allows a bit more customization.</p>
<p>Check out the demo below and feel free to make modifications to it using CSS.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-2-ftn6n?from-embed">https://codesandbox.io/s/svg-demo-2-ftn6n?from-embed</a></div>
<h3 id="3-how-to-use-inline-svg-images">3. How to use inline SVG images</h3>
<p>SVG images can be written directly into the HTML document using the<code>&lt;svg&gt; &lt;/svg&gt;</code> tag.</p>
<p>To do this, open the SVG image in VS code or your preferred IDE, copy the code, and paste it inside the <code>&lt;body&gt;</code> element in your HTML document.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
 // Paste the SVG code here.
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
</code></pre>
<p>If you did everything correctly, your webpage should look exactly like the demo below.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-3-zunkd?from-embed">https://codesandbox.io/s/svg-demo-3-zunkd?from-embed</a></div>
<p>When you use SVG inline in the HTML document, it reduces load time because it serves as an HTTP request.</p>
<p>Using this method lets you perform more customization as opposed to using either the <code>&lt;img&gt;</code> or <code>background-image</code> methods.</p>
<h3 id="4-how-to-use-an-svg-as-an-lessobjectgreater">4. How to use an SVG as an <code>&lt;object&gt;</code></h3>
<p>You can also use an HTML <code>&lt;object&gt;</code> element to add SVG images to a webpage using the code syntax below:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">object</span> <span class="hljs-attr">data</span>=<span class="hljs-string">"happy.svg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"300"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"300"</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-name">object</span>&gt;</span>
</code></pre>
<p>You use the <code>data</code> attribute to specify the URL of the resource that you'll use by the object, which is the SVG image in our case.</p>
<p>You use the <code>width</code> and <code>height</code> to specify the size of the SVG image.</p>
<p>Again, below is a demo for you to explore. 😃</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-4-3ge0n?from-embed">https://codesandbox.io/s/svg-demo-4-3ge0n?from-embed</a></div>
<p>Using the <code>&lt;object&gt;</code> is supported across all browsers that support SVG.</p>
<h3 id="5-how-to-use-svg-as-an-lessiframegreater">5. How to use SVG as an <code>&lt;iframe&gt;</code></h3>
<p>Even though this isn't advisable, you can also add an SVG image using an <code>&lt;iframe&gt;</code>  as seen in the demo below.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-5-co3hg?from-embed">https://codesandbox.io/s/svg-demo-5-co3hg?from-embed</a></div>
<p>Just keep in mind, though, that <code>&lt;iframe&gt;</code>s can be difficult to maintain and will be bad for your site's Search Engine Optimization (SEO).</p>
<p>Using <code>&lt;iframe&gt;</code> also defeats the purpose of the <em>Scalable</em> in the name <em>Scalable Vector Graphics</em> because SVG images added with this format are not scalable.</p>
<h3 id="6-how-to-use-svg-as-an-lessembedgreater">6. How to use SVG as an <code>&lt;embed&gt;</code></h3>
<p>The HTML <code>&lt;embed&gt;</code> element is another way to use an SVG image in HTML and CSS using this syntax: <code>&lt;embed src="happy.svg" /&gt;</code>.</p>
<p>Keep in mind, however, that this method has limitations, too. According to MDN, most modern browsers have deprecated and removed support for browser plug-ins. This means that relying upon <code>&lt;embed&gt;</code> is generally not wise if you want your site to be operable on the average user's browser.</p>
<p>Below is a demo of using the HTML <code>&lt;embed&gt;</code> element to add an SVG image.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/svg-demo-6-iwy0s?from-embed">https://codesandbox.io/s/svg-demo-6-iwy0s?from-embed</a></div>
<h3 id="conclusion">Conclusion</h3>
<p>I hope you were able to learn about the different ways of using SVG images in CSS and HTML. This will hopefully guide you towards choosing the right method when adding SVG images to a website.</p>
<p>If you have any questions, share it in the comment section below, and I'll reply to every comment.</p>
]]></content:encoded></item><item><title><![CDATA[5 Must-Haves for a Developer]]></title><description><![CDATA[Every day, new products and tools are launched worldwide to either improve an existing solution or solve new problems. 
Being able to identify and choose the right tool for yourself can be quite daunting because of the numerous options or the need to...]]></description><link>https://edidiongasikpo.com/5-must-haves-for-a-developer</link><guid isPermaLink="true">https://edidiongasikpo.com/5-must-haves-for-a-developer</guid><category><![CDATA[developers]]></category><category><![CDATA[General Advice]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Tue, 01 Dec 2020 10:04:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972676630/lzyUzXGLT.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every day, new products and tools are launched worldwide to either improve an existing solution or solve new problems. </p>
<p>Being able to identify and choose the right tool for yourself can be quite daunting because of the numerous options or the need to do things manually. </p>
<p>In this article, I will highlight 5 must-have tools every developer should use to help them stay informed, increase their productivity, and excel in their tech career.  </p>
<h2 id="editor-vs-code">Editor: VS Code</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606812962349/ZFTXPOeoB.png?auto=compress" alt="VS cdode" />
Every developer needs a text editor or IDE to write code with, right? And trust me when I say I have used different text editors and IDEs, and so far, VS Code is top-notch.</p>
<p>Why?</p>
<p>To start with, <a target="_blank" href="https://code.visualstudio.com/">VS Code</a> has one of the best documentation I have ever seen. This means that any question you may have about VSCode is explained effectively in their documentation.</p>
<p>Working with Git and other version control systems has been made easier because of VS Code's inbuilt support for Git commands.</p>
<p>There are also  <a target="_blank" href="https://marketplace.visualstudio.com/vscode">thousands of extensions</a> that make coding more exciting and increase your productivity as a developer.</p>
<p>You can run and debug your code directly on VS Code, customize it to fit your preference and build cool extensions for it as well. I also love the fact that different developers worldwide recommend using VS Code for coding shows that it is an excellent software with a strong community behind it.</p>
<p>VS Code is incredible and is a must-have for any developer.</p>
<h2 id="blog-hashnode">Blog: Hashnode</h2>
<p>As a developer, blogging does not only allow you to share your technical knowledge &amp; experience with the developer community; it also helps to reinforce your learning on every topic you write.</p>
<p>Most people think you have to be super smart to start writing and sharing knowledge, but I disagree entirely. As much as we write to share knowledge, we also write to document what we've learned.</p>
<p><a target="_blank" href="https://hashnode.com/@didicodes/joinme">Hashnode</a> enables developers to create a blog mapped to their own domain for free. The goal here is to help you focus on developing and sharing content on their blogs while Hashnode takes care of the rest - customization, readership, visibility, web monetization, and so much more.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606812644362/iclfhqBq0.png" alt="Hashnode" /></p>
<p>You’ve probably asked yourself why you should create a blog with Hashnode when you can build a blog yourself. </p>
<p>Well, I have one question for you.</p>
<p>Do you complete every side project you start working on? If your answer is yes, then I’d love to know your secret. But if you are like most of us, and your answer is no, why do you think building a blog would be different?</p>
<p>Let’s assume you decide to build a blog from scratch, what happens when you can’t finish it due to lack of time? You won’t be able to publish an article on an unfinished blog. </p>
<p>What happens when you actually finish the blog but can’t maintain it after some time or people don’t read your articles?  You may stop publishing articles.</p>
<p>Creating a blog with Hashnode saves you the stress of creating your blog yourself and helps you to be more efficient. It gives you the best of both worlds - a blog mapped to your domain for free and readership from the developer community.</p>
<h2 id="version-control-github">Version Control: GitHub</h2>
<p>You know what they say about having a strong <a target="_blank" href="https://github.com/">GitHub</a> profile as a developer, right? If you have a good GitHub profile, you can access job opportunities and collaborate with other developers in the community.</p>
<p>From open source to business, you can host and review code, manage projects, and build software alongside <a target="_blank" href="https://github.com/">50 million developers</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606812856282/wnobE43-4.png" alt="GitHub" /></p>
<p>The user experience on GitHub is better than other version control tools; you can easily find, use or contribute to open source projects available on GitHub.</p>
<p>Most importantly, GitHub also serves as a storage for your code. Gone are those days where you lose all the projects you are working on because your laptop spoilt of you changed your computer. When you push your code to GitHub, it will be there forever.</p>
<h2 id="browser-extension-dailydev">Browser Extension: daily.dev</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606812749003/kF8-PWS_A.png" alt="daily.dev" /></p>
<p>With every new tab opened on your browser, you may find the article you've been looking for displayed on your screen to help you boost your knowledge.</p>
<p><a target="_blank" href="https://daily.dev/">daily.dev</a> is a browser extension that curates tech news, articles, and discoveries worldwide for software developers.\
With daily.dev installed on your browser, you can easily keep track and stay updated with the latest programming publications worldwide.</p>
<p>If you write technical articles on Hashnode for instance, your article will be picked by daily.dev and displayed to thousands of developers using the product. </p>
<h2 id="task-management-trello">Task Management: Trello</h2>
<p>Staying updated with new technologies, working on our full-time jobs, freelancing and building side projects are a couple of things most software developers do. </p>
<p>You will often see us say things like “24 hours isn’t enough” because we don’t know how to manage our time effectively or we end up burning out because we’ve been doing so many things in a short period of time.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606812895443/uWP1Iv7Vt.png" alt="Trello" /></p>
<p>With <a target="_blank" href="https://trello.com/">Trello</a>, you can keep track of everything; your task, goals, priorities, etc. All you need to do is create a board for your task with a list and cards highlighting each of them. Most times, we lose track of the things we have done and end up thinking we've not done anything with our time, but when you use Trello as your task manager, you can clearly see everything you've achieved so far - this can be good for your mental health if you ask me.</p>
<p>You can also power up your workflow by integrating Trello with awesome tools like Slack. Google drive, time trackers, calendar, and so much more. It is definitely a must-have for developers.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope you found this article useful and would hopefully start using one if not all the 5 must-haves for developers I shared in this article. </p>
<p>Do you know of any other platform or tool that developers should use? Please share it in the comment section below, and I'll reply to every comment. </p>
]]></content:encoded></item><item><title><![CDATA[Tips for Formatting Your Articles on Hashnode]]></title><description><![CDATA[A quick glance at the structure of your article can make a reader decide to either continue or stop reading the article. In my opinion, the appearance & structure of an article is just as important as the content of that article. 
In this article, I ...]]></description><link>https://edidiongasikpo.com/tips-for-formatting-your-articles-on-hashnode</link><guid isPermaLink="true">https://edidiongasikpo.com/tips-for-formatting-your-articles-on-hashnode</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[Developer Blogging]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Fri, 27 Nov 2020 20:05:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972628995/QS2vYn5wc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A quick glance at the structure of your article can make a reader decide to either continue or stop reading the article. In my opinion, the appearance &amp; structure of an article is just as important as the content of that article. </p>
<p>In this article, I will share 5 tips for formatting articles on Hashnode.</p>
<h2 id="formatting-the-title-of-your-article">Formatting the title of your article</h2>
<p>You know what they say about first impressions right? They matter. 😃</p>
<p>The title of your article is the first thing a reader sees so you should pay attention to it and format it appropriately. The title of a technical article should be written in <strong>Title Case</strong> or <strong>Sentence case</strong> instead of <strong>UPPERCASE</strong>.</p>
<p>For more context, here's the difference between them; </p>
<pre><code class="lang-css"><span class="hljs-selector-tag">Getting</span> <span class="hljs-selector-tag">Started</span> <span class="hljs-selector-tag">With</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">DOM</span>
<span class="hljs-comment">/*A title written in title case*/</span>
</code></pre>
<pre><code class="lang-css"><span class="hljs-selector-tag">GETTING</span> <span class="hljs-selector-tag">STARTED</span> <span class="hljs-selector-tag">WITH</span> <span class="hljs-selector-tag">THE</span> <span class="hljs-selector-tag">DOM</span>
<span class="hljs-comment">/*A title written in uppercase*/</span>
</code></pre>
<pre><code class="lang-css"><span class="hljs-selector-tag">Getting</span> <span class="hljs-selector-tag">started</span> <span class="hljs-selector-tag">with</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">dom</span>
<span class="hljs-comment">/*A title written in sentence case*/</span>
</code></pre>
<p>I know you might be tempted to write the title of your article in UPPERCASE because you think it will be more pronounced but take a moment to look at the example above and notice how it reads better when the title was written in <strong>Title Case</strong> or <strong>Sentence case</strong> than <strong>UPPERCASE</strong>. </p>
<p>I have also read through numerous technical writing style guides and they all recommended using either Title Case or Sentence case as well.  </p>
<h2 id="formatting-your-articles-cover-image">Formatting your article's cover image</h2>
<p>More often than not, people forget to add a cover image to their article or they end up using an image that doesn't relate to the article's topic in anyway. </p>
<p>Even though designing a cover image or searching for the right image can be tasky, it is definitely worth it. </p>
<p>You might ask, why is a cover image necessary? I will tell you. But first, this is what an article without a cover image looks like;</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606373728662/okvOYwaK2.png" alt="No cover image" /></p>
<p>Now, let's add a cover image and see the difference. To do this, open the editor and click on <strong>Upload an image</strong> under <strong>Article Cover</strong>. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606503206566/1eI4VJNpf.png" alt="Upload an image" /></p>
<p>The article cover image should now look like this;</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606373774824/DRn4miIfZ.png" alt="With cover image" /></p>
<p>As you may have noticed, the cover image;</p>
<ul>
<li>Made the article look more appealing to the eyes. </li>
<li>Portrays the topic of the article.</li>
<li>Improves the SEO of the article. </li>
<li>Improves that chances of the article gaining traction if shared on social media.</li>
</ul>
<p>To buttress more on the impacts of an article's cover image on social media, here's a quick scenario;</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606505947735/IgJQijYYq.png" alt="Newsletter" /></p>
<p>This is an article without a cover image. As you can see, it uses Hashnode default cover image for the social media card.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606505897775/H8qx2Mg9H.png" alt="Learn how to blog" /></p>
<p>This is an article with a cover image. As you can see, it shows the cover image of the author, it is more visually appealing and would encourage people to read the article. </p>
<h2 id="formatting-the-main-headings-and-sub-heading">Formatting the main headings and sub-heading</h2>
<p>Hashnode supports Markdown's <a target="_blank" href="https://riptutorial.com/markdown/example/2217/atx-style-headers">Atx-style headers</a> which is similar to the HTML header tag.</p>
<pre><code><span class="hljs-comment"># This is Heading 1  </span>
<span class="hljs-comment">## This is Heading 2  </span>
<span class="hljs-comment">### This is Heading 3</span>
<span class="hljs-comment">#### This is Heading 4</span>
<span class="hljs-comment">##### This is Heading 5</span>
<span class="hljs-comment">###### This is Heading 6</span>
</code></pre><p>The main heading and sub-heading of your article should follow the format above. Since the title of your article already uses the <code>H1</code> tag header tag, I'd recommend using a <code>H2</code> as the main heading and a <code>H3</code> tag for the sub-heading. </p>
<p><strong>Let's try it out!</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606490222972/_AEfKM1_C.png" alt="Hashnode Editor" /></p>
<p>As seen in the image above, I used the H2 markdown command <code>##</code> for the main heading while I used the H3 markdown command <code>###</code> for the sub-heading.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606464751586/Oi-52An41.png" alt="Right Header format" /></p>
<p>You can notice it's easier to different the main heading from the sub heading in the article. Aside from that it is also semantically correct to do it this way instead of making it bold as seen in the image below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606465161625/b5f5evkaf.png?auto=compress" alt="Wrong Header format" /></p>
<h2 id="tags">Tags</h2>
<p>Every Hashnode user follows at least one technology or programming language tag during or after signup. So the articles displayed on a user's feed on Hashnode are based on the tags they followed. </p>
<p>When you write an article about React, you would ideally want people who are interested in React to read it right? The only way to do that effectively is to add a React tag to your article so everyone who followed the React tag will get to see it.</p>
<p>To add a tag to your article, go to the editor, find <strong>Select tags</strong> section as seen in the image below, and add the tags that describe your article. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606449100003/7J1fzztHU.png" alt="tags" /></p>
<p>I added the tags shown in the image above to an article titled <strong>Getting Started With the DOM</strong>. As you may have noticed, these tags correspond or relate to the article's title.</p>
<p>Aside from making your article appear to the right target audience in the Hashnode community, tags can also increase the reach of your article when it is shared on social media. </p>
<p><a target="_blank" href="https://twitter.com/Didicodes/status/125920782128089497"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606489407845/oFC4BvVDa.png" alt="Twitter Image" /></a></p>
<h2 id="formating-the-content-of-your-article-with-markdown">Formating the content of your article with Markdown</h2>
<p>Markdown is a lightweight plaintext markup language that you can use to add elements to plaintext documents rather than using the older WYSIWYG editor. </p>
<p>Hashnode’s editor supports simple markdown along with special tags to embed Tweets, YouTube videos, Codepen snippets, etc. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606491438464/TckMGvKFM.png" alt="Guide" /></p>
<p>To find a list of markdown commands that will help you create well formatted articles on Hashnode, go to the blog's editor and click on <strong>Guide</strong>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope the tips shared in this article was helpful to you. Now, its time to create well-formatted articles. </p>
<p>If you have any questions or suggestions, you can leave them in the comments section below, and I'll be happy to answer every single one.</p>
]]></content:encoded></item><item><title><![CDATA[How to Increase Your Blog’s Readership With Hashnode’s Newsletter Feature]]></title><description><![CDATA[One of the important characteristics of a good blog is the ability to ensure that readers are always updated about the latest articles from the blog. A newsletter is one way to ensure that your subscribed readers always stay updated with your latest ...]]></description><link>https://edidiongasikpo.com/how-to-increase-your-blogs-readership-on-hashnode</link><guid isPermaLink="true">https://edidiongasikpo.com/how-to-increase-your-blogs-readership-on-hashnode</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[General Advice]]></category><category><![CDATA[newsletter]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Mon, 23 Nov 2020 16:42:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1606149954491/eot1BFSLc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the important characteristics of a good blog is the ability to ensure that readers are always updated about the latest articles from the blog. A newsletter is one way to ensure that your subscribed readers always stay updated with your latest content.</p>
<p>In other words, adding a newsletter to your blog can help you increase readership and have a sense of people that are interested in reading your articles. </p>
<p>In this article, I will explain the benefits of adding a newsletter to your blog, and how to enable <a target="_blank" href="http://hashnode.com/">Hashnode</a>'s free in-app newsletter feature on your blog. </p>
<h2 id="what-are-the-benefits-of-adding-a-newsletter-to-your-blog">What are the benefits of adding a newsletter to your blog?</h2>
<ul>
<li>It keeps your readers updated about your new articles.</li>
<li>It increases interaction with readers.</li>
<li>It drives targeted traffic.</li>
<li>Increase monetization. </li>
</ul>
<h2 id="how-to-enable-hashnode-newsletter-on-your-blog">How to enable Hashnode Newsletter on your blog</h2>
<p>Once you create a blog on Hashnode, you automatically have access to its free newsletter feature. You don't have to purchase a 3rd party newsletter subscription service like Mailchimp when you blog with <a target="_blank" href="http://hashnode.com/">Hashnode</a>. </p>
<p>To enable the Hashnode free in-app newsletter feature, follow the steps below:</p>
<h4 id="step-1"><strong>Step 1</strong></h4>
<p>Log in to your <a target="_blank" href="http://hashnode.com/">hashnode</a> account. If you don't already have an account on Hashnode, follow the guide <a target="_blank" href="https://hashnode.com/post/create-a-personal-blog-on-hashnode-in-under-2-minutes-for-developers-ckcyz372j002r4qs11ynx5v1w">here</a> to create one - it takes less than 2 minutes.</p>
<h4 id="step-2"><strong>Step 2</strong></h4>
<p>Click on your <strong>profile picture</strong> at the bottom-left corner of the page on a desktop screen or top-right corner on a mobile screen.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606148137425/jjOXGF1ka.png" alt="profile picture.png" /></p>
<h4 id="step-3"><strong>Step 3</strong></h4>
<p>Click on the <strong>Blog Dashboard</strong> option from the popup modal to access the dashboard page.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606148159917/7d7IZNLs3.jpeg" alt="blog dashboard.jpeg" /></p>
<h4 id="step-4"><strong>Step 4</strong></h4>
<p>On your <strong>Blog's Dashboard</strong> page, click on <strong>NEWSLETTER</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606148554541/BeyKhUs3K.png" alt="newsletter tab.png" /></p>
<h4 id="step-5"><strong>Step 5</strong></h4>
<p>On the <strong>NEWSLETTER</strong> page and click on the <strong>Toggle button</strong> to enable the newsletter service feature on your blog.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1606148573871/6pACVvSiS.png" alt="enable newsletter.png" /></p>
<p>Voila. You've successfully added the newsletter feature on your blog. It is time to increase your blog's readership.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope you were able to learn how to enable Hashnode's free inbuilt newsletter feature on your Hashnode powered blog in this article. </p>
<p>Hashnode enables developers to create a blog mapped to their own domain for free. So they can focus on developing and sharing content on their blogs while we take care of the rest - customization, readership, visibility, web monetization, and so much more. <a target="_blank" href="http://hashnode.com/?source=didi">Learn more and create a blog on Hashnode</a>.</p>
<p>If you have any questions, you can leave them in the comments section below, and I'll be happy to answer every single one.</p>
]]></content:encoded></item><item><title><![CDATA[The Technical Writers Guide to Contributing to Open Source Projects]]></title><description><![CDATA[The documentation of an open source project provides an avenue for users to understand the project and contribute to it.  Surveys have even shown that good documentation serves as a sign of an open source project's healthiness. 
Yet, few open-source ...]]></description><link>https://edidiongasikpo.com/the-technical-writers-guide-to-contributing-to-open-source-projects</link><guid isPermaLink="true">https://edidiongasikpo.com/the-technical-writers-guide-to-contributing-to-open-source-projects</guid><category><![CDATA[Technical writing ]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Wed, 28 Oct 2020 06:28:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972540702/Ko66xgAhW.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The documentation of an open source project provides an avenue for users to understand the project and contribute to it.  <a target="_blank" href="https://cdn2.hubspot.net/hubfs/4008838/Resources/The-2019-Tidelift-managed-open-source-survey-results.pdf">Surveys</a> have even shown that good documentation serves as a sign of an open source project's healthiness. </p>
<p>Yet, few open-source projects can claim they are well documented, and many others struggle to keep their documentation up to date.</p>
<p>As important as open source projects' documentation may seem, most technical writers shy away from contributing to open source projects because they don't know how to or they are influenced by the stereotype that only software engineers can contribute to open source. </p>
<p>This article aims to provide an introductory guide for technical writers who want to contribute to open source projects. It will cover how to get started, best practices, benefits, and insightful resources for further learning.</p>
<h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li>What is an open source project?</li>
<li>Why are technical writers important in open source?</li>
<li>How can technical writers contribute to open source projects?</li>
<li>Some notable best practices.</li>
<li>Benefits of contributing to open source projects as a technical writer. </li>
<li>Conclusion.</li>
<li>Resources &amp; further reading.</li>
</ul>
<h2 id="what-is-an-open-source-project">What is an open source project?</h2>
<p>An open source project is a project whose source code and documentation are made available for use, modification, or enhancement by anyone in the world. </p>
<p>Did you notice that I said "anyone in the world" and not "only software engineers"? That's because anybody can contribute to an open source project.</p>
<h2 id="why-are-technical-writers-important-in-open-source">Why are technical writers important in open source?</h2>
<p><img src="https://lh5.googleusercontent.com/tv4wJSTHHUcfgeqIWIGyjp3obqH11nfYBgGMGJ1uCI6ET_CZ7IpwwOBAvb-SG2tQvS1OG9fUw2Fe_pco5uHBY6x7UZhdETYCGFlYGxHtJWNcqD8JJomvUU_zJABJvPgEqGhbGQWH" alt /></p>
<p>Based on a survey carried out in 2017 by GitHub, the major problem encountered in open source projects is incomplete or confusing documentation. </p>
<p>This means that people decide not to use an open source project or contribute to it because of the documentation. - So, if technical writers come onboard and become active open source contributors, this problem will be solved, and more people will contribute to or use more open source projects. </p>
<p>Hence, the <strong>documentation of an open source project</strong> is arguably as necessary as <strong>the software</strong>. So, <strong>technical writers</strong> are as important as <strong>software developers</strong> in the open source ecosystem because humans can't use what they don't understand. </p>
<h2 id="how-can-technical-writers-contribute-to-open-source-projects">How can technical writers contribute to open source projects?</h2>
<p>This section covers a guide for technical writers who want to contribute to open source projects. </p>
<h3 id="find-a-project-you-can-contribute-to">Find a project you can contribute to</h3>
<p>As explained at the beginning of this article, the documentation of so many open source projects is incomplete or confusing, so there are many projects that you can improve. The first thing you need to do is identify the project you can contribute to. If you are interested in Pytorch, you should look out for open source projects using PyTorch since you already have a basic understanding of the tools used. Here's a list of <a target="_blank" href="https://amrutaranade.com/2018/03/21/list-of-open-source-projects-that-accept-docs-contributions/">open source projects with documentation opportunities</a>.</p>
<h3 id="identify-an-issue-to-solve">Identify an issue to solve</h3>
<p>After identifying the open source project, the next thing you need to do is identify an issue to solve. Most open source projects already have available problems relating to their documentation, while others don't.</p>
<p>If you happen to work with an open source project that has raised documentation issues, notify the maintainers of your interest in the project, and start working on it.</p>
<p>If you don't see available documentation issues, then try using the project and identify things that should be documented but haven't been. Then write it and submit a pull request.</p>
<h3 id="send-a-pull-request">Send a pull request</h3>
<p>Before submitting the pull request, try to understand the open source project's review process and how they expect to submit pull requests. Ensure you follow the style guide when submitting your pull request.</p>
<h2 id="some-notable-best-practices">Some notable best practices</h2>
<ul>
<li>Follow a style guide (if it exists).</li>
<li>The page title should reflect the content of the page.</li>
<li>Always define what the page is about in the first paragraph.</li>
<li>Consider your audience when creating content.</li>
<li>Avoid duplicating content.</li>
</ul>
<h2 id="benefits-of-contributing-to-open-source-projects-as-a-technical-writer">Benefits of contributing to open source projects as a technical writer</h2>
<p>Even though contributing to open source organizations is done for free, there are so many benefits from it. Here are some of the benefits of contributing to an open source project as a technical writer.</p>
<h3 id="your-writing-skill-will-improve">Your writing skill will improve</h3>
<p>Due to open source projects' nature, contributions are always reviewed by at least one maintainer before it is merged. This means you automatically get access to more reviews and feedback that you naturally didn't have access to.</p>
<p>By implementing this feedback on your pull request and working with maintainers and contributors from different parts of the world, your writing tends to improve over time.</p>
<h3 id="you-expand-your-network">You expand your network</h3>
<p>Besides improving as a technical writer, you also get an opportunity to work with people doing extraordinary things in the Open source space. For instance, if you work with an organization like <a target="_blank" href="https://www.videolan.org/index.html">VideoLAN organization</a>, you automatically build relationships with other developers, writers, and top maintainers of the project. Remember having a good network of people in your space is very important for your career.</p>
<h3 id="you-can-get-recommendations-and-referrals">You can get recommendations and referrals</h3>
<p>When applying for any job, having a good recommendation letter often helps to strengthen your application. Working closely with a maintainer of any open source project presents an opportunity to secure a rich source of recommendations and referrals.</p>
<h3 id="you-can-get-accepted-into-the-season-of-docs-program">You can get accepted into the Season of Docs program</h3>
<p>Season of Docs is an annual program organized by Google. Its goal is to bring technical writers and open source organizations together to foster collaboration and improvement of documentation in the Open Source space. </p>
<p>As a technical writer who contributes to open source projects already, your chances of getting accepted into the Season of Docs program is super high already. </p>
<h3 id="you-become-an-open-source-contributor">You become an open source contributor</h3>
<p>This is my favourite benefit because every technical writer contributing to an open source project helps the world debunk the stereotype that open source contributions are only meant for Software developers.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Documentation helps orient new members: how to use a project, how to contribute, the terms of use and contribution, and the etiquette of conduct in a community.</p>
<p>Improving documentation is an impactful way to contribute back to open source, and contributing to an open source project opens you up to many opportunities.</p>
<p>I hope you could learn about contributing to open source projects as a technical writer in this article. If you have any questions, you can leave it in the comments section below, and I'll be happy to answer every single one.</p>
<p>Like this article? Follow me on Twitter <a target="_blank" href="https://twitter.com/Didicodes/">@didicodes</a>.</p>
<h2 id="resources-and-further-reading">Resources &amp; Further Reading</h2>
<p>I curated a list of useful resources to help you learn more about contributing to open source projects as a technical writer.</p>
<ul>
<li>"<a target="_blank" href="https://ffeathers.wordpress.com/2018/08/19/helping-open-source-contributors-get-started">How technical writers can help open source contributors get started</a>," Sarah Maddox.</li>
<li>"<a target="_blank" href="https://increment.com/documentation/documentation-as-a-gateway-to-open-source">Documentation as a gateway to open source</a>," James Turnbull.</li>
<li>"<a target="_blank" href="https://edidiongasikpo.com/open-source-contributions-a-catalyst-for-growth">Open Source contributions: A catalyst for growth</a>," Edidiong Asikpo.</li>
<li>"<a target="_blank" href="https://www.facebook.com/watch/live/?v=620495095306929&amp;ref=watch_permalink">Introduction to open source Documentation</a>," Developer Circles from Facebook.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Revamping my Hashnode blog using the amazing Custom CSS feature!]]></title><description><![CDATA[Hashnode is a content creation platform focused on enabling developers to create full-fledged and optimized blogs hosted on their own domain for free without sacrificing visibility and readership.
Developers were really excited when Hashnode announce...]]></description><link>https://edidiongasikpo.com/using-custom-css-on-a-hashnode-blog</link><guid isPermaLink="true">https://edidiongasikpo.com/using-custom-css-on-a-hashnode-blog</guid><category><![CDATA[General Programming]]></category><category><![CDATA[CSS]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[Blogging]]></category><dc:creator><![CDATA[Edidiong Asikpo (Didi)]]></dc:creator><pubDate>Thu, 15 Oct 2020 16:12:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1619972474123/OBVjqPDmj.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="https://hashnode.com/">Hashnode</a> is a content creation platform focused on enabling developers to create full-fledged and optimized blogs hosted on their own domain for free without sacrificing visibility and readership.</p>
<p><a target="_blank" href="https://twitter.com/fazlerocks/status/1305763274294661120">Developers were really excited</a> when Hashnode announced the custom CSS launch last week because they all yearned for more control over the styling of their Hashnode powered blogs. 🌈</p>
<p>I used the <a target="_blank" href="https://hashnode.com/post/style-your-hashnode-blog-with-custom-css-ckfwpesyg00ut0es10jgk5uwl">custom CSS feature</a> to override the default Hashnode style on my hashnode powered blog. It reaffirmed my opinion about Hashnode being the best content creation platform for developers. 🍺 </p>
<p>This article will explain the seamless process I took in customizing my blog and my thoughts on why you should customize your Hashnode blog as well.</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>This article assumes the reader has the following:</p>
<ul>
<li>A web browser.</li>
<li>A Hashnode powered blog. </li>
<li>Basic knowledge of CSS.</li>
</ul>
<h2 id="how-to-enable-the-custom-css-feature">How to enable the custom CSS feature</h2>
<p>The custom CSS feature is not enabled by default on Hashnode. So I had to enable it on my blog's dashboard. Here are the steps I followed to enable the custom CSS feature.</p>
<ol>
<li>Go to your blog's dashboard and click on the <strong>Appearance</strong> tab. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1623762104118/Fzl_8M2Qu.png" alt="Appearance" /></li>
<li>Scroll to the bottom of the <strong>Appearance</strong> page and click on the <strong>Toggle button</strong> to enable the Custom CSS feature on your blog.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1623762246048/0GfZ6uV1w.png" alt="Enable custom CSS" /></li>
<li>Finally, click on <strong>Update</strong> to save your changes. </li>
</ol>
<h2 id="adding-custom-css-to-my-blog">Adding custom CSS to my blog</h2>
<p>After enabling custom <code>CSS</code> on my blog, you'd have to click on the <strong>Add Custom CSS link</strong> (see image above) to access the <strong>CSS editor</strong> where you'd be able to style your blog.</p>
<p><img src="https://i.imgur.com/3dvNc7J.png" alt="CSS editor" /></p>
<p>This is where the magic happened. 🎨💃🏽</p>
<p>As you may have noticed, the CSS editor is divided into three different tabs - <code>Home,</code> <code>Articles,</code> and <code>Pages.</code> </p>
<p>So, I had to add custom CSS for my blog's homepage, article, and pages individually. </p>
<blockquote>
<p>At the time of this writing, the custom CSS feature is only available for <a target="_blank" href="https://hashnode.com/ambassador">Hashnode Ambassadors</a>. </p>
</blockquote>
<h2 id="customizing-my-blogs-homepage">Customizing my blog's homepage</h2>
<p><img src="https://i.imgur.com/WajJ2E1.png" alt="Defualt Homepage" /></p>
<p>The first section I changed was my blog's homepage. I mean, who doesn't love a unique homepage?</p>
<p>I did this by adding the custom CSS (shown below) using the CSS editor.</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.blog-header</span>{
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">10px</span> <span class="hljs-number">0</span>;
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#ffd600</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-bottom</span>: none;
}

<span class="hljs-selector-class">.blog-theme-switcher</span>, <span class="hljs-selector-class">.blog-settings</span>, <span class="hljs-selector-class">.new-story-button</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
}

<span class="hljs-selector-class">.blog-social-media-section</span> <span class="hljs-selector-tag">a</span>, <span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">5px</span>;
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">100%</span>;
}

<span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.blog-nav-active</span>{
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#FFF</span>;
}

<span class="hljs-selector-class">.blog-author-area-photo</span>{
    <span class="hljs-attribute">border</span>: <span class="hljs-number">5px</span> solid <span class="hljs-number">#ffd600</span>;
}

<span class="hljs-selector-class">.blog-post-card-cover</span> <span class="hljs-selector-tag">a</span>, <span class="hljs-selector-class">.mode-dark</span> <span class="hljs-selector-class">.blog-post-card-cover</span> <span class="hljs-selector-tag">a</span>{
    <span class="hljs-attribute">border</span>: <span class="hljs-number">5px</span> solid <span class="hljs-number">#ffd600</span>;
}
</code></pre>
<p>Looking at the code snippet above, I modified the <code>.blog-header</code> class to apply custom styling to my blog's header. Similarly, using the <code>.blog-social-media-section</code> and the <code>.blog-sub-header-nav</code> classes, I was able to style the social media icons and the navigation bar respectively. </p>
<p>Other changes I made include making my image area yellow and each of my postcards cover yellow. And yes, I really love yellow. </p>
<blockquote>
<p>Hashnode advises users only to modify <code>class</code> names that start with <code>blog-*</code> because they made sure they are unique and represent only one component. For instance, if you want to change your blog's header, you should modify the <code>.blog-header</code> class. Find out more about this  <a target="_blank" href="https://hashnode.com/post/style-your-hashnode-blog-with-custom-css-ckfwpesyg00ut0es10jgk5uwl">here</a>. </p>
</blockquote>
<h2 id="customizing-my-articles-page">Customizing my <code>articles</code> page</h2>
<p><img src="https://i.imgur.com/9reHE4K.png" alt="Old Articles Page" /></p>
<p>The next section I modified was my <code>articles</code> page. I did this by adding the custom CSS (shown below) using the CSS editor.</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.blog-header</span>{
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">10px</span> <span class="hljs-number">0</span>;
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#ffd600</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-bottom</span>: none;
}

<span class="hljs-selector-class">.blog-theme-switcher</span>, <span class="hljs-selector-class">.blog-settings</span>, <span class="hljs-selector-class">.new-story-button</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
}

<span class="hljs-selector-class">.blog-social-media-section</span> <span class="hljs-selector-tag">a</span>, <span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">5px</span>;
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">100%</span>;
}

<span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.blog-nav-active</span>{
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#FFF</span>;
}
</code></pre>
<p>By applying the custom CSS shown above, I am ensuring that the same styling used on my home page is what is used on my articles page.</p>
<p>This is what my blog's article page looks like now. </p>
<p><img src="https://i.imgur.com/qIrzjKB.png" alt="New Articles Page" /></p>
<h2 id="customizing-my-static-page">Customizing my <code>static</code> page</h2>
<p><img src="https://i.imgur.com/jkaiYdk.png" alt="Default Page Design" /></p>
<p>Finally, I changed the default look of my static page as well. It was time to make my <strong>About</strong> page look even cooler. I did this by adding the custom CSS (shown below) using the CSS editor.</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.blog-header</span>{
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">10px</span> <span class="hljs-number">0</span>;
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#ffd600</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-bottom</span>: none;
}

<span class="hljs-selector-class">.blog-theme-switcher</span>, <span class="hljs-selector-class">.blog-settings</span>, <span class="hljs-selector-class">.new-story-button</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
}

<span class="hljs-selector-class">.blog-social-media-section</span> <span class="hljs-selector-tag">a</span>, <span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span>{
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">5px</span>;
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">100%</span>;
}

<span class="hljs-selector-class">.blog-sub-header-nav</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.blog-nav-active</span>{
    <span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#FFF</span>;
}

<span class="hljs-selector-class">.blog-page-title</span>{
    <span class="hljs-attribute">display</span>:none;
}
</code></pre>
<p>Here, I maintained the same header design for my homepage and removed the <strong>About</strong> heading from the page. </p>
<p>Take a look at the new look below. Pretty cool, right? I know!</p>
<p><img src="https://i.imgur.com/xviGcJ8.png" alt="New Page design" /></p>
<p>After adding all the custom CSS to the editor, I clicked on the <strong>Publish</strong> button to ship my customization to production. </p>
<p>Guess whose blog is so damn cool right now? Mine!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://edidiongasikpo.com/">https://edidiongasikpo.com/</a></div>
<h2 id="my-thoughts">My thoughts?</h2>
<p>The importance of personal branding for developers can not be overemphasized because of its ability to help developers build a distinct identity, access opportunities, and stand out in the developer community.  </p>
<p>Hashnode exists to help you focus on developing and sharing content on your blog while we take care of the rest - <strong>customization</strong>, <strong>readership</strong>, <strong>visibility</strong>, <strong>total control of your content</strong>, and so much more.</p>
<p>Using custom CSS to style your Hashnode powered blog allows you to not only enjoy Hashnode's developer-centric product for free but also maintain your personal branding effortlessly. </p>
<p>Always remember that the best time to create a Hashnode powered blog is now! <a target="_blank" href="https://hashnode.com/onboard?unlock-blog=true">Learn more and start blogging now</a>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I hope you were able to learn about Hashnode's custom CSS feature in this article. Even though this article covers the fundamental possibilities of changing the design of your Hashnode powered blog with CSS, there's so much more you can do. </p>
<p>Feel free to use what you've learned in this article to create fascinating designs for your blog.</p>
<p>If you have any questions, you can leave it in the comments section below, and I’ll be happy to answer every single one.</p>
]]></content:encoded></item></channel></rss>