<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sylvia Pap</title>
    <description>The latest articles on DEV Community by Sylvia Pap (@sylviapap).</description>
    <link>https://dev.to/sylviapap</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F334178%2Fa8c34313-4f2c-4a79-bac9-4ec76005f68a.jpeg</url>
      <title>DEV Community: Sylvia Pap</title>
      <link>https://dev.to/sylviapap</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sylviapap"/>
    <language>en</language>
    <item>
      <title>My career story - from bootcamp to Google in ~1 year</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Thu, 25 Feb 2021 03:16:32 +0000</pubDate>
      <link>https://dev.to/sylviapap/my-career-story-from-0-to-google-in-1-year-2p8a</link>
      <guid>https://dev.to/sylviapap/my-career-story-from-0-to-google-in-1-year-2p8a</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Quick disclaimers - This isn't a &lt;code&gt;how to get into google&lt;/code&gt; post. I'm just going to try and give my whole story here. Maybe it'll help someone, maybe it's just me looking for attention and validation from strangers on the internet 🤷‍♀️&lt;/p&gt;

&lt;p&gt;I say '~1 year' because I started a coding bootcamp in January 2020, and I got this offer in the beginning of February but basically January 2021 lol. But I did start looking into all of this in November 2019. So if I need to rename this to 14 months - sue me.&lt;/p&gt;

&lt;p&gt;I'm &lt;em&gt;not&lt;/em&gt; saying I had &lt;em&gt;no&lt;/em&gt; experience when I started this whole switch. Experience is impossible to quantify but I think, relative to the entire tech job applicant pool, I had little-no relevant experience. If you compare with other bootcamp students/self-taught coders/career switchers, maybe I had a lot. Some people learn to code without ever having owned their own computer, but some people go into bootcamp having worked professional developer jobs before. &lt;code&gt;tldr&lt;/code&gt; - I acknowledge my privilege and helpful background going into this, but I at least had way less than the people with computer science degrees and/or multiple years of tech work experience that I would be competing with for jobs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ok, story time!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  November 2019
&lt;/h3&gt;

&lt;p&gt;This is what I consider the most important general turning point in my career, but it wasn't like I had &lt;code&gt;never written a line of code&lt;/code&gt; before this. I used some basic HTML as a kid on Neopets and MySpace. I tried Comp Sci 101 in college (I think it covered Java) but I immediately dropped the class. I could barely figure out how to access my Mac's terminal. &lt;/p&gt;

&lt;p&gt;Every once in a while, after taking a personality quiz or reading a book about finding your dream career, I'd go on Khan Academy and check out some beginner videos on computer science and programming. I'd always enjoy it, but feel overwhelmed/too late to switch, imposter syndrome, etc. etc.&lt;/p&gt;

&lt;p&gt;I was just about to commit to life as a lawyer. I was signed up to take the LSAT. This is a cheesy thing I say in interviews, but the 'logic puzzles' section of the LSAT actually was kind of the final sign I needed to make the switch. These puzzles reminded me of my favorite course in college (logic for philosophy). I like Boolean algebra, formal logic, puzzles, patterns, proofs, certainty. I knew that this was all very relevant to computer science, so it all just really clicked then - I didn't want to be a lawyer, and I liked what little I knew about computer science.&lt;/p&gt;

&lt;p&gt;So I bought and read a book called "The Self Taught Programmer" and learned some basics in Python. I was pretty excited to see &lt;code&gt;Hello World&lt;/code&gt; in the browser - that, and even just using my terminal, was a huge deal at the time compared to the few exercises I had done in a Khan Academy IDE. This simple book was kind of a big turning point for me - it was the first time I really felt like I could &lt;em&gt;do&lt;/em&gt; this. For some reason, I just didn't think it was too late/impossible to do a big career switch anymore. &lt;/p&gt;

&lt;h4&gt;
  
  
  Udacity Course
&lt;/h4&gt;

&lt;p&gt;So at this point I had been doing the totally self-taught, free online resources route. I loved it, but I also got very excited/impatient, so I started to think I needed something more structured. I decided to do a Udacity online, self-paced course in full stack web development using Python. &lt;/p&gt;

&lt;p&gt;And I loved that too! I remember the first time I looked at the clock while working on a project, saw it was 3am, and hadn't even realized how much time had flown by while I was actually spiraling down a StackOverflow rabbit hole. I've spent a lot of time in my life staying up late reading Wikipedia, but I had never had a moment like that before. I thought wow, I'm spiraling on the internet, but people get paid for this?&lt;/p&gt;

&lt;p&gt;But, I wanted to go fast, learn as much as possible as quickly as possible, and I thought that a structured, in-person course was a better way to do this. &lt;/p&gt;

&lt;p&gt;I did some research, some YouTube, considered applying to Master's degree programs because I'm a sucker for academia, but settled on Flatiron School coding bootcamp/full time software engineering immersive in San Francisco.&lt;/p&gt;

&lt;h3&gt;
  
  
  January 2020 - Flatiron Coding Bootcamp
&lt;/h3&gt;

&lt;p&gt;Important to note - I had a lot of privilege in this decision making process. I had savings, supportive family, a job that I could easily quit, no partner/children - still a big/risky decision, but none of the other factors that make this bootcamp question even harder for a lot of people.&lt;/p&gt;

&lt;p&gt;I went from &lt;code&gt;just trying this thing out&lt;/code&gt; to &lt;code&gt;quit my job, move to SF, start bootcamp&lt;/code&gt; pretty quickly. I wasn't that rigorous in researching &lt;em&gt;which&lt;/em&gt; bootcamp to do, either.&lt;/p&gt;

&lt;p&gt;Maybe I would have been better off somehow doing a different bootcamp. Or no bootcamp! These are endless debates that I have mostly given up on. &lt;/p&gt;

&lt;p&gt;Overall, I loved bootcamp because: 1. I just love coding, 2. great instructors/classmates, 3. going into a WeWork building in the center of SF every day (until COVID). It was a cool feeling while it lasted - walking into a building that also hosts Uber/Square, right across from Twitter, learning coding in a welcoming space with free coffee and frequently free food. &lt;/p&gt;

&lt;p&gt;I think these reasons are important to note because the whole experience made me think that this would all have been very possible without a bootcamp. It's impossible for me to ever say firsthand, obviously, but my reasons for enjoying the bootcamp were pretty general. Maybe I couldn't have done any of this without the bootcamp. But if you're reading this, wondering if you can do a free/self-taught/cheaper route without one of these big bootcamps - based on my limited experience, I'd say yes. &lt;code&gt;tldr&lt;/code&gt; - I liked my bootcamp, I'm thankful for it, but they're not magic.&lt;/p&gt;

&lt;h3&gt;
  
  
  May 2020 - August 2020: Start Job Search
&lt;/h3&gt;

&lt;p&gt;I graduated from Flatiron May 8, then almost immediately got into the job stuff. I had sent a few apps before even. I was &lt;em&gt;eager&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;I naively thought that if I applied to a ton of jobs, at all sizes of startups and mid-size companies and large companies, sent some simple networking messages to current SWEs and recruiters, kept my mind and options open, I'd at least have interviews within a few weeks. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2F0df87e1008ad73907e8647cdf57fea00%2Fraw" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2F0df87e1008ad73907e8647cdf57fea00%2Fraw" alt="alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could not have been more wrong. I had some really depressed/angry moments where I was just... shocked... at how hard it was to even get a response. I knew the interviews would be hard, but I didn't expect it to be &lt;em&gt;that&lt;/em&gt; hard just to &lt;em&gt;get&lt;/em&gt; the interview. Or even a phone screen. Even a LinkedIn response! &lt;/p&gt;

&lt;h4&gt;
  
  
  August 2020: First Offer - Short Term Contract
&lt;/h4&gt;

&lt;p&gt;At this point - I was frustrated with Flatiron as an organization. Even with all the disclaimers/research, saying 'we don't guarantee a job,' etc., I had high expectations. Not that they would get me a job. I never expected that. I never even expected that they would 'get me an interview,' but I thought if I did all the work, on my resume/website/projects/networking, they'd get my foot in the door. And they did eventually! But it took 3 months, and a lot of nagging. &lt;/p&gt;

&lt;p&gt;Flatiron has 'Employer Partnership' representatives - people who work with companies to connect grads. Some were really helpful. One was particularly helpful. He set me up with an interview for a small startup that would later offer me a contract job. &lt;/p&gt;

&lt;p&gt;So... at the end of the day, I got a job because of Flatiron. I am extremely thankful, but also critical, because so many things had to click into place for this to happen. Main takeaway here - do not expect anything from a bootcamp career-wise.  &lt;/p&gt;

&lt;p&gt;My main problem with these bootcamps is just that they're overpriced. Not worthless - not even close - not a 'waste of money,' nothing extreme like that. I guess it's similar to debates on private vs. public universities. Some say the private/prestigious universities are truly better education/better opportunities, but ridiculously more expensive. &lt;/p&gt;

&lt;p&gt;I like to complain, but I don't think I have regrets. Overall Flatiron was a positive experience, and I am very thankful to the EP rep and my career coach for their help.&lt;/p&gt;

&lt;p&gt;This offer was with a very small startup called DaoCloud. They are a platform for connecting/finding wellness practitioners. The entire company was around 20 people, and only 1 other coder, also on short-term contract. I'm not making any judgments about any of this, just throwing some numbers out for comparison.&lt;/p&gt;

&lt;h4&gt;
  
  
  December 2020: Second Offer
&lt;/h4&gt;

&lt;p&gt;So I had been working for the first startup (DaoCloud) for a few months, as a contractor. Some people like contracting, but I wanted regular full time. There are all kinds of complexities about taxes here that are important, but I won't go into them. Point is - I really liked that first position, but wanted something full-time.&lt;/p&gt;

&lt;p&gt;I had interviewed with this other startup (&lt;code&gt;Universe&lt;/code&gt;, an iOS app for mobile website building) in July 2020. They rejected me first time around too! But they said they might be able to offer me a position in a few months. And surprise surprise, they actually meant it! They reached out to me again around Nov/Dec, I had one more informal conversation with someone, and I got an offer to be a full-time software engineer with them! They are also small, but slightly larger than the first. And they had way more engineers, which I liked.&lt;/p&gt;

&lt;p&gt;I absolutely loved my time with both of these companies. I truly learned so much. I always used to think &lt;code&gt;learning&lt;/code&gt; and &lt;code&gt;growing&lt;/code&gt; professionally were meaningless cliches that people say in interviews, until they actually happened to me! &lt;/p&gt;

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

&lt;p&gt;I learned things about coding, git, deploying, product management, you name it - in such a short time. I worked with some amazing people. I can't emphasize enough how much I enjoyed these companies and am thankful that they gave me chances when no one else did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google
&lt;/h2&gt;

&lt;p&gt;Ok so Google kind of has its whole own timeline. May 2020 - I applied online, but with an employee referral, and was rejected - no phone screen or recruiter contact or anything. I was super mad at the time! I had heard that employee referrals were a big thing, so I thought I'd at least get a chance. I wasn't expecting to get a job or anything, but I expected more than what felt like an auto rejection.&lt;/p&gt;

&lt;p&gt;July 2020 - I went to a virtual networking event and talked to a Google recruiter. I am also thankful to Flatiron for this, because the same EP guy who got me the startup interview, told me about this Google networking event. &lt;/p&gt;

&lt;p&gt;So I went to this event. Followed up with the Google recruiter on LinkedIn because he said he likes LinkedIn. We set up an initial phone call. He was super nice and cool. I wasn't even expecting anything at this point either! I was still a little ego-shook from being rejected when I applied online, and thought I was just having a networking phone call for the heck of it. This recruiter had also said during the event itself that Google wasn't really hiring (this was peak mid-pandemic time). So basically, I was very surprised when he said he'd set me up with a first round technical interview. &lt;/p&gt;

&lt;p&gt;I really am trying not to give any direct advice here, but I will say, in the job search, you have to be shameless and relentless. Don't ever take &lt;code&gt;no&lt;/code&gt; or &lt;code&gt;we're not hiring&lt;/code&gt; for an answer. 99% of the time - it's true, and you're going to get rejected/ignored, but I just had to always remind myself - you have nothing to lose by continuing to ask/try. Worst case is you get ignored. It might seem obvious to some, but it was tough, yet important, for me to actually internalize. &lt;/p&gt;

&lt;p&gt;Anyway - back to the first Google interview. I was &lt;em&gt;extremely&lt;/em&gt; excited and nervous. I studied my data structures and algorithms to an unhealthy extent. I did practice interviews. I did LeetCode. I obsessively watched YouTube videos of other people doing LeetCode and practice interviews. &lt;/p&gt;

&lt;p&gt;And then, I bombed the interview. I had been doing entirely like, binary search trees in Python, and actually, little had I known, this was a frontend specific interview. So the interviewer asked me relatively simple frontend questions, but I absolutely choked/panicked/failed because I just hadn't even thought about frontend or JS or anything relevant in weeks. Not to make excuses, but the recruiter had told me to study the standard DS&amp;amp;A/LeetCode/Python. So you really just have to be prepared for anything in these interviews. &lt;/p&gt;

&lt;p&gt;Sept 2020 - the recruiter offered me another chance to first round interview for the general SWE position! I.e., not frontend specific. I was stoked and grateful and nervous all over again. I got a do-over. I spent weeks doing the same level of obsessive studying. I could write a whole other post about the pros/cons of my studying. I had some standard study books, Cracking the Coding Interview, I bought &lt;code&gt;AlgoExpert&lt;/code&gt; and enjoyed it. I strongly believe anyone can succeed at these interviews with entirely free/online resources, and it's just a matter of sheer practice. I liked prep courses/books to keep me structured. &lt;/p&gt;

&lt;p&gt;Due to some combo of not studying the right things, simple not studying enough, and/or test-taking nerves, I bombed the interview again. No one to blame but myself. I studied and practiced so much. I understood why you need to spend several months doing 100s of questions to nail these interviews. &lt;/p&gt;

&lt;p&gt;So there I was, rejected, told I couldn't apply to these roles again for a year, 3 strikes I'm out. Sad, but I fully accepted it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femfvetl86wy4v88nu4wj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femfvetl86wy4v88nu4wj.jpg" alt="Monopoly go to jail do not pass go do not collect $200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nov/Dec 2020 - A Google recruiter reached out to ME!!! Pure irony. I had lost all hope in Google. I had other job options. She was recruiting for a position I hadn't really heard of before - Technical Solutions Consultant/Customer Solutions Engineer. Maybe unimportant but there seem to be like 5 different names for my position based on official job postings and what my contract ended up saying lol. I could write more about the specifics of the position, but the important takeaway is that this job is generally around half coding, half business consulting/data engineering. She said she had seen my resume on file from my past interviews and I could be a good fit. &lt;/p&gt;

&lt;p&gt;I actually laughed and thought, ok Google, trying to get my hopes up again. There's no way I'll get this, and they're just trying to interview as many people as possible. But I might as well take the interview. Nothing to lose. &lt;/p&gt;

&lt;p&gt;And wow! I had some of the best interviews of my life. I will never know if it was just having the right attitude, months of studying finally clicked, and/or good luck. I don't think the coding/algorithm questions were as hard as the general SWE one I had, but whatever. I nailed them. I had fun talking to the interviewers. I started to get truly excited about the job and have hope again.&lt;/p&gt;

&lt;p&gt;I passed the first round technical, and still thought, wow this is exciting but there's no way I'll actually get it. The process is so long and has so many steps. But the 'Virtual On Site' (main day of interviews) was amazing. I had truly the best interview of my life with my future manager. And still - I had to wait for the 'Hiring Committee' stage!! This whole process is pretty well documented for Google in general. It was pretty standard, but a lot of waiting and still thinking, wow there's a good chance I'll get this job, but don't get your hopes up yet.&lt;/p&gt;

&lt;p&gt;But obviously, finally, they offered me the job! I still can't believe it. I was genuinely sad to leave the startup job I had, but this was and is my dream opportunity. At the time of writing this, I haven't actually had my first day yet. So stay tuned!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There's much more I could say, and yet maybe I already said too much. I hope this is the right balance of informative and concise. I could definitely write specific posts about my interview experiences and studying. &lt;/p&gt;

&lt;p&gt;I think the 'job search' is all a random mess and there's no good way to give advice here. My only advice is &lt;code&gt;don't give up&lt;/code&gt; 🤷‍♀️ &lt;/p&gt;

&lt;p&gt;Good luck and thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgevwferhgy90qo0y7oz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgevwferhgy90qo0y7oz4.png" alt="i did a business meme"&gt;&lt;/a&gt;I still feel like this&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://unsplash.com/photos/jz4ca36oJ_M" rel="noopener noreferrer"&gt;Cover photo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>programming</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Standing out in a job application / Twitter clone project using React</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Wed, 28 Oct 2020 19:10:20 +0000</pubDate>
      <link>https://dev.to/sylviapap/my-attempt-to-stand-out-in-a-twitter-job-application-3n4p</link>
      <guid>https://dev.to/sylviapap/my-attempt-to-stand-out-in-a-twitter-job-application-3n4p</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;Hello dev community! I am humbly asking for your time and attention and potentially retweets. This isn't really a tutorial or super technical post, so I hope I'm not being spammy here. &lt;/p&gt;

&lt;p&gt;I applied to a twitter swe apprenticeship, and there's an application question 'tell us your life story in tweets.' It's just a basic text box/essay question situation, this wasn't required at all, but I'm really trying to do the whole 'standing out' and maybe 'getting a job after going viral' kind of thing, so I made this twitter clone of my 'life story': &lt;/p&gt;

&lt;p&gt;&lt;a href="https://sylviapap-futuretwitterapprentice.netlify.app/" rel="noopener noreferrer"&gt;https://sylviapap-futuretwitterapprentice.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think someone was hired by Airbnb after going semi viral for making an Airbnb clone that was like her resume as a vacation destination? Link coming soon. I have like 70 followers on twitter so by 'going viral' I mean honestly anything more than 10 likes.&lt;/p&gt;

&lt;p&gt;Here's my tweet if you are so inclined to RT:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1321511142238285825-26" src="https://platform.twitter.com/embed/Tweet.html?id=1321511142238285825"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1321511142238285825-26');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1321511142238285825&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;But I'm only asking, if you look at this, and you genuinely enjoy it, throw me a like/comment/RT! No free lunch. And if you don't like it, please tell me why! The application submission is due in a day so the whole thing was a little rushed, but I can obviously keep editing forever and use it as a nice portfolio/beginner project regardless. So I'm also posting this to get feedback - on the code and content and everything!&lt;/p&gt;

&lt;h3&gt;
  
  
  But first here are some obvious problems I acknowledge:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No actual Twitter functionality (i.e. being able to like, share tweet) lol &lt;/li&gt;
&lt;li&gt;No backend at all in fact (i.e. might add basic 'like' functionality first, then backend/data persistence, but currently have neither)&lt;/li&gt;
&lt;li&gt;Search bar should at least refresh the page on submit&lt;/li&gt;
&lt;li&gt;Might add some kind of 'info' or home page describing the project&lt;/li&gt;
&lt;li&gt;I chose to make it chronological order (or would you call this reverse chron? idk but oldest on top) because it seemed to make the most sense to me, story/creativity-wise, but obv I recognize this is not how actual twitter works lol&lt;/li&gt;
&lt;li&gt;It's more or less 'good enough' on mobile, but doesn't look like the actual Twitter mobile browser version, uses some hacky 'hide on mobile' css&lt;/li&gt;
&lt;li&gt;Overall just messy code tbh. I combined a lot of existing tutorials' CSS. Did the whole thing in less than a day tho&lt;/li&gt;
&lt;li&gt;I tried to be funny/just the right amount of political. If you don't think I'm funny and/or you think anything in here is unprofessional - &lt;del&gt;i will fight you&lt;/del&gt; please tell me but let me down easy :'(&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally here's my repo:&lt;br&gt;
&lt;a href="https://github.com/sylviapap/twitter-clone" rel="noopener noreferrer"&gt;https://github.com/sylviapap/twitter-clone&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for your time!!!!&lt;/p&gt;

</description>
      <category>react</category>
      <category>showdev</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Putting dev.to on your LinkedIn?</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sun, 19 Jul 2020 19:21:38 +0000</pubDate>
      <link>https://dev.to/sylviapap/putting-dev-to-on-your-linkedin-4907</link>
      <guid>https://dev.to/sylviapap/putting-dev-to-on-your-linkedin-4907</guid>
      <description>&lt;p&gt;I recently saw &lt;a href="https://dev.to/isaacdlyman/put-devto-on-your-resume-48h9"&gt;this&lt;/a&gt; post about putting dev.to on your resume, and I thought it was very helpful! I had put dev on my resume for some positions that were more specific to writing, but now I think I will keep it on there for all jobs. Having top posts on here is definitely one of my greatest/most measurable achievements as a very junior dev. &lt;/p&gt;

&lt;p&gt;Before this, I "had dev.to on my LinkedIn" but only as part of my "featured articles," the publications section, and a link to my profile.&lt;/p&gt;

&lt;p&gt;So after seeing the resume post, I thought I could go another step in adding to my &lt;code&gt;Experience&lt;/code&gt; section. I have the following currently:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fwk6Q8IX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zojoetrq7hxz7ggj5j52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fwk6Q8IX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zojoetrq7hxz7ggj5j52.png" alt="linkedin screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But imposter syndrome always has me worried that this is somehow... dishonest. I've always thought the &lt;code&gt;Experience&lt;/code&gt; section on LinkedIn was solely for employment where you were paid. But... maybe that's too strict. So I wanted to post this and get general thoughts on it.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Advice for a struggling bootcamp grad?</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sat, 18 Jul 2020 01:20:23 +0000</pubDate>
      <link>https://dev.to/sylviapap/advice-for-a-struggling-bootcamp-grad-29ak</link>
      <guid>https://dev.to/sylviapap/advice-for-a-struggling-bootcamp-grad-29ak</guid>
      <description>&lt;p&gt;Hi dev community - I have not yet posted a #discuss type question here, so apologies in advance if this is too common of a question/too long. I know the market is saturated with coding bootcamp grads, and the 'blog market' is saturated with posts about bootcamp grads. I know it's very hard to get one of the most coveted, competitive, and high-paying jobs after taking only a 3 month course. And of course I know this is an unprecedented and horrible global pandemic economy.&lt;/p&gt;

&lt;p&gt;All of that being said - I'm really struggling, and these problems have been around for bootcamps grads for years now. I've read a lot of blogs. I've done a ton of networking. Gotten good advice. And I generally feel like I just have to do something else major now - like get some kind of further online degree/certificate? I'm not sure, but it seems like employers see '3 month bootcamp' grad and throw the resume in the trash before it even gets to their inbox. I'm not trying to be lazy and say I'm owed anything after an objectively short time - I just don't know what else to do to show that I'm serious and that I love coding and I want to learn as much as possible. And it seems like everything I could do now to try and get more experience/demonstrate my skills - personal projects, hackathons, contributing to open source, freelancing, unpaid internships - might just be further exhausting myself with nothing tangible to show for it.&lt;/p&gt;

&lt;p&gt;Again I am really not trying to hustle or cheat my way into something I am not qualified for. I am willing to put in the work. I also am interested in doing something like an online master's degree in computer science, truly genuinely for my own personal interest, but it seems like a risky further move into debt that may or may not even help me get a real job. &lt;/p&gt;

&lt;p&gt;A lot of the advice for struggling junior dev job seekers right now is 'just keep pushing along!' i.e. applying, networking, etc. I am not knocking that advice - and I will certainly keep applying, working on my personal projects, doing whatever self-taught learning that I can. But I am starting to wonder if I can/should do something that is more of a major change. Thank you!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Learning Swift, iOS, and Vapor in one week</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sat, 11 Jul 2020 04:27:37 +0000</pubDate>
      <link>https://dev.to/sylviapap/learning-swift-ios-and-vapor-in-one-week-2ap7</link>
      <guid>https://dev.to/sylviapap/learning-swift-ios-and-vapor-in-one-week-2ap7</guid>
      <description>&lt;p&gt;I always think of a line from &lt;em&gt;Silicon Valley&lt;/em&gt; where the main character says, to prove how smart/good at coding he is, "I learned Ruby on Rails in a weekend" &lt;/p&gt;

&lt;p&gt;&lt;a href="https://getyarn.io/yarn-clip/de246995-2c76-455a-8a55-873478146830"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rkLSi8N8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://y.yarn.co/de246995-2c76-455a-8a55-873478146830_text_hi.gif" alt="gif"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;My bootcamp taught RoR in 6 weeks so maybe I can't say this, but I think if you had a solid coding background in other frameworks, learning RoR in a weekend wouldn't be hard, so that's just a funny TV vs. reality tangent. The wonderful world of internet commenters have also pointed out that the episode's timeline/character's age imply RoR wasn't around when he would have been 17 so... it might not be the show's most technologically accurate line!&lt;/p&gt;

&lt;p&gt;But it's relevant to me because now I'm like, is it impressive to say I learned Swift, iOS, and Vapor in one week? Can I even really say I &lt;em&gt;did&lt;/em&gt; learn it? It's kind of like saying I 'learned' a language by coding a &lt;code&gt;hello world&lt;/code&gt; - not wrong per se, but it would obviously be a lot more impressive to say I built a full stack application with mobile/iOS frontend and backend REST API using Swift - and I didn't do that lol! I just did (parts of) a ton of tutorials and videos, used XCode for the first time, and used Vapor - a framework I had never even heard of before - all in about a week, so I'm feeling accomplished. &lt;/p&gt;

&lt;p&gt;I had also been feeling pretty down/discouraged about the whole job search process, and this kind of revived me. I mean there were also times where I was literally pulling my hair out at 2am wondering why I'm the dumbest person on earth. But equal amounts of feeling like a genius. Classic coding ups and downs.&lt;/p&gt;

&lt;p&gt;I might never be able to brag about learning iOS in a week to sound smart, but I definitely dove into a whole new world of programming in a relatively short amount of time, and I learned some interesting things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;I find it hard to say exactly when I &lt;code&gt;started coding&lt;/code&gt; or first learned &lt;code&gt;to code&lt;/code&gt;. But I'd say I really started down the path to becoming a true and obsessive coder in October 2019. I read a book on Python, took an online course in web dev using Python/Flask, and in January 2020, I did the whole in person web dev bootcamp thing for Ruby, Rails, and React. &lt;/p&gt;

&lt;p&gt;A very common question for beginners is &lt;code&gt;Where to start? What language to learn first?&lt;/code&gt; and a probably even more common response is, &lt;code&gt;It doesn't matter&lt;/code&gt;. Just start somewhere, and then it's relatively easy to learn new languages, etc. from there. And it still amazes me how true that is!&lt;/p&gt;


&lt;div class="instagram-position"&gt;
  &lt;iframe id="instagram-liquid-tag" src="https://www.instagram.com/p/B8ge5TEAMcf/embed/captioned"&gt;
  &lt;/iframe&gt;
  
&lt;/div&gt;


&lt;p&gt;For me, looking back, starting with Python was great. But &lt;code&gt;Python/Flask&lt;/code&gt; was hard. Very new and confusing, almost entirely self-taught. Then &lt;code&gt;Ruby/Rails&lt;/code&gt; at bootcamp - still hard, but a lot better. I noticed small connections to what I already knew &lt;em&gt;and&lt;/em&gt; had instructors to help me in person. Now &lt;code&gt;Swift/Vapor&lt;/code&gt; - super hard, all on my own, very rushed, but also really cool, and I think kind of tied together for me how similar these 3 major backend frameworks can be. And also different! Same same but different. &lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing backend/server-side frameworks
&lt;/h3&gt;

&lt;p&gt;I'm not entirely sure what the best way is to compare backend frameworks. But I did recently see this video, and thought it was just a generally super cool visualization, comparing "popularity" based on GitHub stars:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8FQ4zW_F_Iw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The real difficulty over the last week was learning Vapor - a backend framework for Swift. At the time of writing this, &lt;code&gt;vapor&lt;/code&gt; has about 19k stars. And Rails (the main backend framework I knew before this/compared almost everything to) has about 46k.&lt;/p&gt;

&lt;h3&gt;
  
  
  So why did I choose to learn these things?
&lt;/h3&gt;

&lt;p&gt;Well I'm probably too much in a &lt;code&gt;quantity over quality&lt;/code&gt; stage in my programming life. I know the very standard advice about jack of all trades, master of none, don't just list as many tech terms as possible on a resume to look good. But these are desperate times. I'm looking for anything to distinguish myself from all the bootcamp grads who know React.&lt;/p&gt;

&lt;p&gt;So when my bootcamp put up a free Swift course for us after graduation, I thought I'd check it out. XCode was a little scary - I still need to figure out all the shortcuts, and I still prefer my VSCode - but I liked it, so I put Swift/iOS on my resume (I'll admit this sounds sleazy, but I promise I didn't lie, and I said 'beginner in Swift/iOS'). &lt;/p&gt;

&lt;p&gt;And then I got an interview for a Swift backend position. I almost didn't even apply because it seemed so specific and out of reach. I'm not complaining or questioning it, but it is crazy to me how the world works out. I'm still in the interview process though, so I hope writing this doesn't jinx anything. &lt;/p&gt;

&lt;p&gt;But I didn't learn Swift &lt;em&gt;just&lt;/em&gt; for this interview. I had only just started learning it, so when I got the interview, I spent the entire week leading up to it trying to become an expert in Swift and iOS. iOS wasn't as important for this specific interview - the position is backend, but for a mobile app company. But I wanted to be familiar with the basics of iOS development just in case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swift and iOS
&lt;/h2&gt;

&lt;p&gt;At first, I grouped these together. Of course, later, I get to the web/backend API side of Swift. But I started off just thinking ok, I need the basics of Swift and mobile. I still don't know the fundamentals of Swift that well. If you asked me to whiteboard a simple function, I probably could not do it. But I started off kind of skimming the resources from my bootcamp on Swift fundamentals, which helped to get a general vibe and at least be aware of the major differences from the languages I knew before. I checked out the Apple developer &lt;a href="https://developer.apple.com/documentation/swift"&gt;docs&lt;/a&gt; and &lt;a href="https://swift.org"&gt;Swift.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you really want to learn iOS, I think this video was the best resource I found:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/09TeUXjzpKs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I skimmed/watched the first few minutes of many videos like this, and I thought this one was the best, especially if you're a total beginner. If for nothing else, it was really cool to see a &lt;code&gt;Hello world&lt;/code&gt; app on my iPhone. It was like falling in love all over again 🥺&lt;/p&gt;

&lt;h2&gt;
  
  
  Vapor
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vapor"&gt;
        vapor
      &lt;/a&gt; / &lt;a href="https://github.com/vapor/vapor"&gt;
        vapor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      💧 A server-side Swift web framework.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;a href="https://discord.gg/vapor" rel="nofollow"&gt;
&lt;/a&gt;&lt;p&gt;&lt;a href="https://discord.gg/vapor" rel="nofollow"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GP78UGWN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/75634175-4876d680-5bd9-11ea-90d6-12c7b6a9ee3f.png" alt="Vapor"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
    &lt;a href="https://docs.vapor.codes/4.0/" rel="nofollow"&gt;
        &lt;img src="https://camo.githubusercontent.com/5de0cd6a5c2d0e7e248e27766cc69f14adb553cfb1d14f6060e5bd610cacd1c9/687474703a2f2f696d672e736869656c64732e696f2f62616467652f726561645f7468652d646f63732d3231393666332e737667" alt="Documentation"&gt;
    &lt;/a&gt;
    &lt;a href="https://discord.gg/vapor" rel="nofollow"&gt;
        &lt;img src="https://camo.githubusercontent.com/c64e16b9da18672fdb91e71d3b93a12aac279beef0c1da985671f31531ac166a/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3433313931373939383130323637353438352e737667" alt="Team Chat"&gt;
    &lt;/a&gt;
    &lt;a href="https://raw.githubusercontent.com/vapor/vapor/master/LICENSE"&gt;
        &lt;img src="https://camo.githubusercontent.com/992daabc2aa4463339825f8333233ba330dd08c57068f6faf4bb598ab5a3df2e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e737667" alt="MIT License"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/vapor/vapor/actions"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1Eoa5pst--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/vapor/vapor/workflows/test/badge.svg" alt="Continuous Integration"&gt;
    &lt;/a&gt;
    &lt;a href="https://swift.org" rel="nofollow"&gt;
        &lt;img src="https://camo.githubusercontent.com/2a47fd0666c2916e7a38ad02c078cb2bf58f5026a089c0af2bf69457a5d613d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73776966742d352e322d627269676874677265656e2e737667" alt="Swift 5.2"&gt;
    &lt;/a&gt;
    &lt;a href="https://twitter.com/codevapor" rel="nofollow"&gt;
        &lt;img src="https://camo.githubusercontent.com/efb2451a51b45186bb708ed1c7ce4c6d4614f4d228e4a8237d10f53a884a39cf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747769747465722d636f64657661706f722d3541413945372e737667" alt="Twitter"&gt;
    &lt;/a&gt;
&lt;/p&gt;



&lt;p&gt;Vapor is a web framework for Swift. It provides a beautifully expressive and easy to use foundation for your next website, API, or cloud project.&lt;/p&gt;

&lt;p&gt;Take a look at some of the &lt;a href="https://github.com/Cellane/awesome-vapor"&gt;awesome stuff&lt;/a&gt; created with Vapor.&lt;/p&gt;

&lt;h3&gt;
💧 Community&lt;/h3&gt;
&lt;p&gt;Join the welcoming community of fellow Vapor developers on &lt;a href="http://vapor.team" rel="nofollow"&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
🚀 Contributing&lt;/h3&gt;
&lt;p&gt;To contribute a &lt;strong&gt;feature or idea&lt;/strong&gt; to Vapor, &lt;a href="https://github.com/vapor/vapor/issues/new"&gt;create an issue&lt;/a&gt; explaining your idea or bring it up on &lt;a href="http://vapor.team" rel="nofollow"&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you find a &lt;strong&gt;bug&lt;/strong&gt;, please &lt;a href="https://github.com/vapor/vapor/issues/new"&gt;create an issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you find a &lt;strong&gt;security vulnerability&lt;/strong&gt;, please contact &lt;a href="https://raw.githubusercontent.com/vapor/vapor/master/mailto:security@vapor.codes"&gt;security@vapor.codes&lt;/a&gt; as soon as possible.&lt;/p&gt;
&lt;h3&gt;
💛 Sponsors&lt;/h3&gt;
&lt;p&gt;Support Vapor's development by &lt;a href="https://github.com/sponsors/vapor"&gt;becoming a sponsor&lt;/a&gt;.&lt;/p&gt;
&lt;a href="http://nodesagency.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iQw31LvC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/66773716-a787b900-ee8d-11e9-83c2-54b3d8fce528.png" height="100px" alt="Nodes"&gt;
&lt;/a&gt;
&lt;a href="https://www.skelpo.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LMPul18W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/66773734-b2dae480-ee8d-11e9-81ca-2f20f4b0f55e.png" height="100px" alt="Skelpo"&gt;
&lt;/a&gt;
&lt;a href="https://gotranseo.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iTBjOGK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/89341627-92c02000-d66f-11ea-8b29-c278386fdb09.png" height="100px" alt="Transeo"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/gwynne"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1h5uPECd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/70094097-c6820c00-15ef-11ea-899d-f4010ad65875.png" height="100px" alt="Gwynne Raskind"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/Joannis"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qDQJJZL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/95220234-3ccd3d00-07c4-11eb-99be-0f5af0b099e8.png" height="100px" alt="Joannis Orlandos"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/kylebrowning"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r69TVZOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/67107440-7ca5a980-f19a-11e9-8619-b029c96399f7.png" height="100px" alt="Kyle Browning"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/MrLotU"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1GphJ49O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1342803/79599312-426a8580-80b3-11ea-89b3-8b2722485e37.png" height="100px" alt="Jari"&gt;
&lt;/a&gt;
&lt;h3&gt;
💚 Backers&lt;/h3&gt;
&lt;p&gt;Support Vapor's development by &lt;a href="https://github.com/sponsors/vapor"&gt;becoming a backer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Joannis"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9cKT_9Hd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/1951674%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/Yasumoto"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tets-ZbV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/48383%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/hjuraev"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pcum4SQt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/5513926%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/ultim8p"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ZLcW64Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/4804985%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/tkrajacic"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cg6t7KJQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/873717%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/slashmo"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0BRhwxaI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/16192401%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/ScottRobbins"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LVIbbhFl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/6894359%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/twof"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pJX2UQD---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/5561501%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/mikkelu"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iOcYuEGT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/17051694%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/piers12"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_UYXAiqB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/37227905%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/timothymiko"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HgRZdvhy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/2555306%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/rminerick"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uZnC24vb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/4505221%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/mcdappdev"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OFznQ8a5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/11842593%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/tarag"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B0ifIRNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/11686092%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/GalenRhodes"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bDCjYZfp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/16696128%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/grundoon"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PpFgk7Lg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/876321%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/maartene"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VFygw1Gs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/5150271%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/steve-h"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5ujbkl-t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/1298089%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/SpencerCurtis"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aWICYBG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/16965587%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/ezfe"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--upJ0erco--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/1449259%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/patrykwas"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y5Q2uuV6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/39051168%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/MaherKSantina"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pqwTbJZD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/24646608%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/shpakovski"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1fKucsMu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/163410%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/jordanebelanger"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QzzkYiKS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/1856085%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/StefanCosminR"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_zN_1h2p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/17311242%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/iq3addLi"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fQsorda5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/16850104%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/lmcd"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eHREGXD2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars3.githubusercontent.com/u/363540%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/0xTim"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a8Zk6IEf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars1.githubusercontent.com/u/9938337%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/radude89"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7QpYCK9c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/2872139%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/wjosset"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JN_NCP6X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/16748205%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/%0AMattiav8"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pI0IybhR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/42816898%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/klaas"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WRjKYVgL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/320967%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/MaxDesiatov"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FVVSsZwQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/112310%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/SaltyCoco"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k9g8Xg5K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/31451104%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/zachwick"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ImxEhnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/406510%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/rausnitz"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e-FIjuc7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/6132143%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/PSchmiedmayer"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Gh1EJtQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/28656495%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/VFUC"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q1dRVwfQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/8863326%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/Mordil"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5hBG7Dhh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/3506776%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/niksonleonard"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SJ-UfTrz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/1129223%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/0xLeif"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1aD_nyV9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/8268288%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/fadylateef"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YgKsI-GE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/17549441%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/tmm"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5mmOVvnV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars0.githubusercontent.com/u/6759464%3Fs%3D120" width="60px"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://opencollective.com/vapor/backer/0/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8dc0411c5b32e79b0bc3a51fc769f6f1c0c2eb5b11591d3d267b8d16f1e4dfc5/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f302f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/1/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a20e2018238cd947d313284ba63f3e9b5062ab33f02480ee0761e18edd9a9dbd/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f312f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/2/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a351e395d2231ca4c210fde3479d852792308e186cf1bf557a9095d55c1ce7df/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f322f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/3/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/0b8af9d3cb43413c48b89dd36f55bdfa71703bc4c38b5fa01c362cbeaa389221/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f332f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/4/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/d09e2738bf5cd3e2091128fa5a033b6b4bc6d845cf2096349f0d6154b6f1fbeb/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f342f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/5/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3640fabb9ea468b564fecdb4f61578edfc45a602ef13b5e5d7e2cb2fa2b50ac9/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f352f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/6/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c1f62939b08ab5102a1c53066fa5f668652b3e7825ee7a97c1e65a977bcdf799/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f362f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/7/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/07af659752c58f2163764c17c0b44748d3ff4fca38666479f3d98df4d5a741d8/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f372f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/8/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5d9fe95ef5d2df963fe0b81b5d53e82995fee86e52fedc00e3d49284def8a7e6/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f382f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/9/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/920e065ff598adb18aa4f68dbdbdb0fe55d5f2904335bc5415b9204333a24052/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f392f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/10/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/437b8ed50c5fbd491fc051592a4aa2af4cd2fcf12a719196e28e73fbd4cf2c9f/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31302f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/11/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/e7a732f340e4f0f11492a2d42c9600bd6ed85c7af9d00ef343483881a6a6ac97/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31312f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/12/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/83cb5a065f75df2a6f94fa494d5b0e73ba2448ee826fd3db3e82ccce995924dd/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31322f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/13/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/1d4a9e46e99bdfbefdf07925afd40e5d0550297209e1f8287644d2f05c3f153d/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31332f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/14/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7cfeba5ee47a383b452508a41d513c6682434bcf0347fbf2e1597b1efa779193/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31342f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/15/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/abcb1cf631a0e6c17fe71d9c404d060329b62669fa282e63b37b27a38723c6ee/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31352f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/16/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/1806840ae705a9baefc587cf88fffcf8bed1f3d67d88c37e00fa6ee5c99e2535/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31362f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/17/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/29f13a0017d8b0dd5461e40c354f54c3e1b504c0a8ac2920d2252f84d18cc6c0/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31372f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/18/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/22a1eef2ef7198d3ffa74719230066b1a88a4eb2fc48e90b22d20e7361227c46/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31382f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/19/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/bfc6c7d41c4edc370d62953c8e8afed66d04890d4a2df2335708946cbe12e5d8/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f31392f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/20/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/b9a82ac7f8360520e385e4b52f4c9c4bc23d2f7115291d2b22f5d600abdd8448/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32302f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/21/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a24a1f3dd12f10e1b8a5f392255f28aabb1606adc5d8d6668ffb923f84b75493/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32312f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/22/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/f3d4bc5315408e7aa316c74c010bc68babcfc61cb1579731d6e59a6920378373/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32322f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/23/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/b288b7b5b144200b7982b4ba97fac7180ba6da1a278e663caa262affc8a1ef32/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32332f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/24/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8da0a1a1da8df0ae9f63a9c5a95d35bdc8ca6ed9a6e8a4cdeb9e2593df8d1413/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32342f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/25/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/22a830deb03bd118062a2c0a8c0b805c8eb51bdd79216fec5e3a71db92716fed/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32352f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/26/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/894eb0b6f577ef9346a3b7f0864a0c385efc59ecf778bbc069a63bda67a418ff/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32362f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/27/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a5a4a24fa75a87aa12edb9877f52d09ed58bc131dc93212bfa98d9390e2f19e4/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32372f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/28/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/cfee2b0ce44d8b94353b5d71aabd180ec1032913075c2e2b7c40abf5f2177354/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32382f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/29/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/9e9a777105d41b8347d732155fa20bb8338425fef6dc39cf3e74ff4916095dcd/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f32392f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/30/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/28a46cbeaaae92dcbcab8db2de6b816f08855e2f327262b1229dc0164c964a28/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33302f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/31/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3888af25165098967caab995317be77579571617867ca91932901c7c76758715/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33312f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/32/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/566a4af1de991b8f7b1fcf1ff3731bd189f0c464712e3b4b38871f6a1d356d0a/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33322f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/33/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/e55286e7e7a526021ce6f9268004892a69bc515fb23fbdbdd13e9f6b69d36aa2/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33332f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/34/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c9f74287d104222df445bac9fb6b3b9c4544cd88cd00bc6febcff143d4abc32e/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33342f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/35/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/542e4401e3ea0bbf72ce036e5ef2b8ebfb6410d4efe82e9f4e418b3851c89e77/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33352f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/36/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/6e0c1b6dbdebeb11fe8ae42fdbee816f81fc785d8e692045707ceb2ae07347df/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33362f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/37/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/918de9e29c47477c53e2560ab27af849e1b21042d36b003d0a26af1c11481813/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33372f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/38/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/86f6aed8025064e5c07e7a62cadb30649c80a71295972b90beb18f712e1819dc/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33382f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/39/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c0eb7416e7ad230665e09cde6dc3b95afa235e0555fe999b46853fc7b13134f6/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f33392f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/40/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c7e89234e75d0b3fa1047bfb1bdae978a82e6f78ffac44659d0d5a0831b8439b/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34302f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/41/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a9e4882835370579478f95992efcc2ab5db4ab36b1e74afcf0a8103a4af918bc/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34312f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/42/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/863847e3d228c2373a48ee35bbe94f1ad76f92833eb3f2238761d6ec3973898b/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34322f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/43/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8e244581a7ab52588eadfd3bf01d867bedb53ece8f89b764b3dbf8226d4d94f5/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34332f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/44/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7e5efe70ec003ca298cc8dcd59d79b077d36acaa4f982c0c3a970ae8c20e04f4/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34342f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/45/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/6dc9e0e2e2d96bb7eb4aaa11441ccf4627e21bf1a697c810fa049b3135cb5bbf/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34352f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/46/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5b1327c4f82b1f833e3d23a627693401877359db86a8534860f291e6b9c956b8/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34362f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/47/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/75b9b7c77208f76b3a07cde556d9222c00460c3308b5fcd1a3fb3038bdea7806/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34372f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/vapor/backer/48/website" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/99846e64a87f84533782bbbb9c0ec7eb56e967c2ae42ba17081fe42d9ea86d0f/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7661706f722f6261636b65722f34382f6176617461722e737667"&gt;&lt;/a&gt;
&lt;a href="https://raw.githubusercontent.com/vapor/vapor/master/"&gt;&lt;img src="https://camo.githubusercontent.com/953cfdc08d5169b00ea59c45bd577a3fc760eebac667d70e36d23aa72c9bbcb0/687474703a2f2f7777772e676f6f676c652d616e616c79746963732e636f6d2f636f6c6c6563743f763d3126743d7061676576696577265f733d3126646c3d68747470732533412532462532466769746875622e636f6d2532467661706f722532467661706f72265f753d4d41437e266369643d313735373031343335342e31333933393634303435267469643d55412d37363137373335382d36" alt="analytics"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vapor/vapor"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I started off doing the tutorial with the most recent version of Vapor (4) but then my code challenge was in Vapor 3. It wasn't that difficult to go back to Vapor 3 but I did encounter some unrelated &lt;code&gt;brew cleanup&lt;/code&gt; issues. Either way - check out the Vapor &lt;a href="https://docs.vapor.codes/"&gt;docs&lt;/a&gt; if you want to try out the basic setup. &lt;/p&gt;

&lt;p&gt;There aren't a lot of blog posts on Vapor, as you might expect! React and JS are the top tags on here for a reason. But this was a very good, comprehensive blog post on Vapor that I found:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/leogdion" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m-zFJUR8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--PSNSh_e8--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/77395/ed0aaaa7-9252-4c81-ab86-a0b8e6278a6f.jpg" alt="leogdion image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/leogdion/a-vapor-guide-setup-and-deployment-with-heroku-and-ubuntu-49jn" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A Vapor Guide-Setup and Deployment with Heroku and Ubuntu&lt;/h2&gt;
      &lt;h3&gt;leogdion ・ Jun 24 '19 ・ 14 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#swift&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ios&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;h3&gt;
  
  
  PostgreSQL and Fluent
&lt;/h3&gt;

&lt;p&gt;This code challenge required PostgreSQL for the database, and Vapor uses Fluent as its ORM. This reminded me of my Flask experience back in the day, and Fluent reminded me of SQLAlchemy. I thought Postgres was just really hard to learn as a total beginner - but honestly I still struggle with it, even now, as a medium-beginner! And there aren't a lot of posts/explicit tutorials on how to use it. I always end up finding a mess of various docs/examples and typing so many wrong things into the command line before I finally come back to the same obvious, correct one. &lt;/p&gt;

&lt;p&gt;This is just to say - if you're a beginner using Postgres, don't be discouraged. There must be a reason why my bootcamp, and so many others I assume, start us off with SQLite and ActiveRecord in Rails. Again, totally might just be because anything feels easier in a structured, in-person context. But this bit from the Rails/Active Record docs makes me think I'm not wrong in thinking it's more beginner friendly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Convention over Configuration in Active Record
&lt;/h3&gt;

&lt;p&gt;When writing applications using other programming languages or frameworks, it may be necessary to write a lot of configuration code. This is particularly true for ORM frameworks in general. However, if you follow the conventions adopted by Rails, you'll need to write very little configuration (in some cases no configuration at all) when creating Active Record models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This 'convention v. configuration' thing was a very interesting concept I remember loving at bootcamp. Like, it's so simple and obvious when you hear it, but I hadn't had the words for it before. This might be an oversimplification, but to me, convention over configuration means less writing actual code. Someone far more experienced than you has written the standard stuff. Almost like using a website creator template. You sacrifice flexibility (configuration), but you get more ease, speed, and reliability for basic use. When you're a beginner - you want convention.&lt;/p&gt;

&lt;p&gt;So in my limited experiences with postgres and its relevant ORMs, I struggled with the heavier configuration aspect. Small side note for beginners - postgres/SQLite are examples of a &lt;code&gt;database management system&lt;/code&gt; (DBMS) and ActiveRecord/Fluent are the Object-relational mapping framework (ORM). Overall, if you're reading this and you want yet another person's specific advice, start with something like &lt;code&gt;ActiveRecord/Rails&lt;/code&gt; before something like &lt;code&gt;PostgreSQL/SQLAlchemy&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  SwiftNIO
&lt;/h3&gt;

&lt;p&gt;I noticed NIO a lot while debugging/seeing errors building my HTTP REST API with Vapor, so I thought it was worth mentioning. As far as I can tell, in simplest terms, it is a building block within Vapor for routing/creating API endpoints.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/apple"&gt;
        apple
      &lt;/a&gt; / &lt;a href="https://github.com/apple/swift-nio"&gt;
        swift-nio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Event-driven network application framework for high performance protocol servers &amp;amp; clients, non-blocking.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://github.com/swift-server/sswg/blob/main/process/incubation.md#graduated-level"&gt;&lt;img src="https://camo.githubusercontent.com/69161cca47a3a960e25ed44a263a584bbe987054e9eed9dd2de7c5b69314d02c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f737377672d6772616475617465642d677265656e2e737667" alt="sswg:graduated|104x20"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
SwiftNIO&lt;/h1&gt;
&lt;p&gt;SwiftNIO is a cross-platform asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers &amp;amp; clients.&lt;/p&gt;
&lt;p&gt;It's like &lt;a href="https://netty.io" rel="nofollow"&gt;Netty&lt;/a&gt;, but written for Swift.&lt;/p&gt;
&lt;h3&gt;
Repository organization&lt;/h3&gt;
&lt;p&gt;The SwiftNIO project is split across multiple repositories:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;th&gt;NIO 2 (Swift 5+)&lt;/th&gt;
&lt;th&gt;NIO 1 (Swift 4+)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/apple/swift-nio"&gt;https://github.com/apple/swift-nio&lt;/a&gt; &lt;br&gt; SwiftNIO core&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "2.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "1.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/apple/swift-nio-ssl"&gt;https://github.com/apple/swift-nio-ssl&lt;/a&gt; &lt;br&gt; TLS (SSL) support&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "2.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "1.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/apple/swift-nio-http2"&gt;https://github.com/apple/swift-nio-http2&lt;/a&gt;&lt;br&gt; HTTP/2 support&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "1.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "0.1.0"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/apple/swift-nio-extras"&gt;https://github.com/apple/swift-nio-extras&lt;/a&gt; &lt;br&gt;useful additions around SwiftNIO&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "1.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "0.1.0"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/apple/swift-nio-transport-services"&gt;https://github.com/apple/swift-nio-transport-services&lt;/a&gt; &lt;br&gt; first-class support for macOS, iOS, tvOS, and watchOS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "1.0.0"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from: "0.1.0"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
Protocol Implementations&lt;/h3&gt;
&lt;p&gt;Below you can find a list of a few protocol implementations that are done with SwiftNIO. This is a non-exhaustive list of protocols that are either part of the SwiftNIO project or are accepted into the &lt;a href="https://swift.org/server" rel="nofollow"&gt;SSWG&lt;/a&gt;'s incubation process. All of the libraries listed below do all of their I/O in a non-blocking fashion using…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/apple/swift-nio"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;SwiftNIO is focused on providing the low-level building blocks for these higher-level applications. When it comes to building a web application, most users will not want to use SwiftNIO directly: instead, they'll want to use one of the many great web frameworks available in the Swift ecosystem. Those web frameworks, however, may choose to use SwiftNIO under the covers to provide their networking support.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Debugging in Vapor
&lt;/h3&gt;

&lt;p&gt;This was, again, harder than debugging I've done in other programs. This could definitely be a lack of research issue, but from the brief googling I did do, it doesn't seem like an &lt;a href="https://forums.swift.org/t/debugging-vapor-apps-is-harder-than-it-should-be/28640"&gt;uncommon&lt;/a&gt; feeling. &lt;/p&gt;

&lt;p&gt;I relied on writing my own tests, and adding basic breakpoints manually in XCode. In Rails, I used &lt;code&gt;byebug&lt;/code&gt; and &lt;code&gt;rails console&lt;/code&gt; a lot, and I didn't find anything analogous in vapor. All just things to get used to and keep researching.&lt;/p&gt;

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

&lt;p&gt;I actually loved trying to learn vapor, Swift, and iOS. I would highly recommend for anyone in a similar medium-level of experience range. I'd probably also recommend Swift and basic, frontend iOS dev for someone with no coding experience at all, because I found XCode to be generally more of a familiar user experience. It's a lot more visual, like you can manually drag and size a button to your iPhone simulator screen without even having to write code. &lt;/p&gt;

&lt;p&gt;This ended up being more of a reflection on my experience with this pretty wide range of technologies. I hope it was helpful. Maybe I'll do some more focused tutorials on specific Vapor examples next! Either way, if you made it this far, thanks for reading. &lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://swift.org/documentation"&gt;Swift docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/swift"&gt;Apple docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-make-your-first-api-call-in-swift/"&gt;how-to-make-your-first-api-call-in-swift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/articles/designing-swift-apis/"&gt;designing-swift-apis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Swift_(programming_language)"&gt;Swift wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.vapor.codes/4.0/"&gt;Vapor docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.apple.com/en-us/HT204460#:~:text=Tap%20Settings%20%3E%20General%20%3E%20Profiles%20or,prompt%20to%20confirm%20your%20choice."&gt;Allow XCode access to your iPhone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>10 Tech YouTube Channels to Diversify Your Feed</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sat, 04 Jul 2020 05:30:58 +0000</pubDate>
      <link>https://dev.to/sylviapap/10-tech-youtube-channels-to-diversify-your-feed-ad4</link>
      <guid>https://dev.to/sylviapap/10-tech-youtube-channels-to-diversify-your-feed-ad4</guid>
      <description>&lt;p&gt;From the same guys who brought you &lt;code&gt;the diversity problem in tech&lt;/code&gt;, there is now the &lt;code&gt;diversity problem in tech YouTube&lt;/code&gt;! Catchy opener attempt aside - this isn't going to be a huge rant or invitation to debate about diversity, it's just a short blog post about suggestions for YouTube channels to follow that aren't already-popular white men.&lt;/p&gt;

&lt;p&gt;But before any comment trolls come yelling about 'forced diversity' - I did not come across these channels because I typed 'i hate white men &amp;gt;:(' into the YouTube search bar.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CgdxLOi9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EbTyneVVAAEOGzX.png" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--xYxvKxLw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1259961502800310272/DFO2-W_A_normal.jpg" alt="Sylvia profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Sylvia
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @sylviapapdev
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      the volume in this bus 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      22:03 PM - 24 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;Trust me - I have seen a lot of tech YouTube. The Tech Tube, as they say. There are a lot of great white men on here, with a lot of followers and subscribers already! And then there are a lot of really great channels featuring women and POC, with way less subscribers, views, etc.!&lt;/p&gt;

&lt;p&gt;I found all of these YouTubers because most of them have the less traditional path to tech involving bootcamps or self-instruction, and have struggled with imposter syndrome due to being a minority in tech. While I 110% acknowledge my white privilege - I am still a woman in tech, and hearing other people talk about how they also struggle with feeling like they don't 'belong' in this industry is relatable and motivational. &lt;/p&gt;

&lt;p&gt;This is NOT a criticism of anyone or anything (except the obvious diversity problem in tech). But I have seen a lot of posts like these: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ryandsouza13/10-web-development-youtube-channels-you-probably-didn-t-know-about-4o37"&gt;10 Web Development YouTube Channels You Probably Didn't Know About&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/desoga/10-youtube-channels-to-follow-as-a-junior-web-developer-designer-2fal"&gt;10 Youtube Channels To Follow As a Junior Web Developer / Designer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?time_continue=509&amp;amp;v=BZRLKDlSaAI"&gt;20+ Developer YouTube Channels To Follow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again - everyone in these posts/lists is great. The posters of these lists are great. I follow a lot of them. I enjoy their videos. But almost 100% of these are white men. So I just thought I'd do my own version of great tech YouTubers you might not have heard of.&lt;/p&gt;

&lt;p&gt;Final argumentative point - 'diversity and inclusion' does not mean forcing an unqualified person into a company or your YouTube feed just for the sake of it. It's to give people who are &lt;em&gt;just as, if not more, qualified,&lt;/em&gt; a fair chance, within a system that has made it harder to reach the same level of success. I could really get into the research on this, but this is just a blog post about YouTube, so... not yet. &lt;/p&gt;

&lt;p&gt;One more note - I came across most of these back when I was still in the 'Should I go to bootcamp?' phase of life. So if you can break up 'tech YouTube' into two categories, one being these more informal, vlog types, and the other being tutorials with step-by-step instructions on how to code something specific, these channels are more relevant to the first category, but some of them certainly have both.&lt;/p&gt;

&lt;p&gt;Ok, all of that being said - here are some of my favorite YouTubers, that I haven't seen on other popular lists, with a special focus on women and BIPOC.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UCFvt89HObOCI_HcbqKHW5Ew"&gt;Senegoddess&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I especially enjoyed her 'day in the life' videos. Those can be a controversial sub-genre on the tech tube lol because a lot of them just show people eating free snacks in nice lounges. But I felt like hers were more realistic. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UC-bFgwL_kFKLZA60AiB-CCQ"&gt;The Come Up&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Self-taught SWE, no bootcamp, no CS degree, did Recurse Center. Also a lot of personal finance tips!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UCoLUji8TYrgDy74_iiazvYA"&gt;Jarvis Johnson&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Actually not really a tech YouTuber anymore :'( but probably just one of my overall favorite YouTubers who used to be a SWE and were some of the first videos I watched back when I was deciding whether or not I wanted to make this career switch. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UCEDkO7wshcDZ7UZo17rPkzQ"&gt;Mayuko&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Also really enjoyed her 'day in the life' videos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UC2KfmYEM4KCuA1ZurravgYw"&gt;Amigoscode&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/c/CodingPhase"&gt;CodingPhase&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UCQALLeQPoZdZC4JNUboVEUg"&gt;Jabrils&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I especially enjoy his machine learning tutorials&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/c/IjemmaOnwuzulike"&gt;Ijemma Onwuzulike&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UClkieE3BBB4xXoMvBj7_TRw"&gt;Dummy Codes&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Special shoutout to a fellow Sacramento resident - we are the Bay Area Lite&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/channel/UCVg0fhIL2ZRmNOM76641hQw"&gt;Nicole Young&lt;/a&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Small side note, but I only chose the number 10 here because that's what the majority of other posts of this type seem to do lol. There are obviously so many amazing YouTubers out there. Too many for anyone to list. &lt;/p&gt;

&lt;p&gt;Final food for thought: there are probably some very interesting cases to be made for how the YouTube algorithm and suggestions contribute to this problem, or could help fix it.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>career</category>
      <category>inclusion</category>
    </item>
    <item>
      <title>How to make your own (no template) personal website with React, Material UI, and Netlify</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sat, 27 Jun 2020 01:52:04 +0000</pubDate>
      <link>https://dev.to/sylviapap/how-to-make-your-own-no-template-personal-website-with-react-material-ui-and-netlify-pij</link>
      <guid>https://dev.to/sylviapap/how-to-make-your-own-no-template-personal-website-with-react-material-ui-and-netlify-pij</guid>
      <description>&lt;p&gt;Sometimes I feel like everything I write on here could be prefaced with "Not &lt;em&gt;another&lt;/em&gt; [general category] post..." but I am still relatively new to this world so I'm still covering and re-covering basics, but also finding very subtle ways that I can add to seemingly exhausted concepts. &lt;/p&gt;

&lt;p&gt;So yes, I know, there are a ton of tutorials out there for making your own personal site. Here are some of my favorites for getting started (if you haven't read anything else relating to personal sites/portfolios before my post, I recommend starting with these, especially the first):&lt;/p&gt;

&lt;h3&gt;
  
  
  Start here
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/itzsaga/portfolio-site-how-to-for-new-developers-537p"&gt;Portfolio Site How-To For New Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/aspittel/building-a-kickass-portfolio-28ph"&gt;Building a Kickass Portfolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/emmabostian/how-to-build-a-great-technical-portfolio-53bb"&gt;How To Build A Great Technical Portfolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/portfolio-app-using-react-618814e35843/"&gt;How to create your portfolio website using React.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/flexdinesh/i-re-wrote-my-portfolio-and-added-some-magic-22n7"&gt;I Created My Portfolio with React and Some Magic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lakatos88/new-personal-site-who-this-55f1"&gt;new-personal-site-who-this&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My stuff
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sylviapap.com/"&gt;Current personal site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sylviapap/personal-site-react"&gt;Current site repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sylviapap.github.io/"&gt;Old site&lt;/a&gt; (&lt;em&gt;kept on github pages just for fun/demo purposes&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sylviapap/sylviapap.github.io"&gt;Old site repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Version 1.0 with template, pure JS/HTML/CSS
&lt;/h3&gt;

&lt;p&gt;My first personal site was almost entirely a template. I used &lt;a href="https://html5up.net/"&gt;HTML5Up&lt;/a&gt; and I really loved it. Easy to use and tweak if you want to customize a little. I used the "Ethereal" one, which is probably one of the most common, but I still think it's so aesthetically pleasing, and I love the horizontal scroll and gallery. It also looks great on mobile. Check out the repo if you're curious, I made some very slight modifications and of course my added info. I'm keeping it on GH pages as well, for contrast, and I might continue to tweak it just for learning purposes.&lt;/p&gt;

&lt;h3&gt;
  
  
  To template or not to template
&lt;/h3&gt;

&lt;p&gt;When I finished my bootcamp, I wanted to start applying to jobs ASAP so I prioritized quick and easy on my portfolio site. I also just don't even have that many projects (relatively) or info at all lol! I am just starting out, after all, so I wanted to keep it simple and short. Plus, if I use a quick and easy template, then I'd have more time for learning... {checks notes} data structures and algorithms?&lt;/p&gt;

&lt;p&gt;In all seriousness - and this &lt;a href="https://dev.to/itzsaga/portfolio-site-how-to-for-new-developers-537p"&gt;post&lt;/a&gt; says it best - absolutely nothing wrong with using a template. &lt;a href="https://dev.to/alrubelrana/how-to-create-your-portfolio-website-using-react-js-ehn"&gt;Here&lt;/a&gt; are some nice React specific templates I enjoyed looking through.&lt;/p&gt;

&lt;p&gt;I personally just &lt;em&gt;wanted&lt;/em&gt; to make my own. I realized I had barely "coded" outside of leetcode since my bootcamp ended, so this seemed like a good time to get back in the ol' game and make my own site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next: should I use React?
&lt;/h3&gt;

&lt;p&gt;I didn't use React on my first site because it seemed unnecessary. The beauty of React (I think?) is its scalability, so it felt kinda lame to use it for such a small site. I still kind of think my ultimate goal here is using nothing but my own HTML, CSS, and vanilla JS. &lt;/p&gt;

&lt;p&gt;If you haven't seen it yet - my favorite personal site is from Dev's very own, &lt;a href="https://benhalpern.com/"&gt;Ben Halpern&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But then I thought, again, I'm applying to a lot of jobs looking for React experience. So maybe React isn't &lt;code&gt;necessary&lt;/code&gt; here, but it's a good exercise/refresher on using it at all. So here we are. React reacts only.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ie3JXQpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pics.me.me/sad-reacts-only-4736303.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ie3JXQpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pics.me.me/sad-reacts-only-4736303.png" alt="dog meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this site really "my own" if I use a design library?
&lt;/h3&gt;

&lt;p&gt;I'm not sure! I started off thinking I would write all my own CSS, no libraries like Bootstrap. I did that for my final bootcamp project and I enjoyed it because I wanted as much flexibility as possible. But then I started selecting elements and tweaking colors and the clock started doing that thing in movies where the hands start spinning faster and faster so you know the main character is wasting a lot of time and working too hard. &lt;/p&gt;

&lt;p&gt;Then I realized I had never used Material UI, so this could be a cool chance to try a new thing, but also make my life easier without going full template.&lt;/p&gt;

&lt;p&gt;Anyway, that's my spiel. There are a lot of tutorials on making a personal site, and a lot of tutorials on React, and a lot of templates for a personal site with React, but not a lot of super up-to-date articles on the basics of making your own personal site with React. So here's my "tutorial" - in quotes for now because I'm not sure how in depth this will be. Might be more of a "walkthrough," or, "overview," if you will, if you're a stickler for terms.&lt;/p&gt;

&lt;h1&gt;
  
  
  Setup
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app personal-site
cd personal-site
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm also trying to do something slightly different from tutorials I've seen that do the same thing, but with jQuery. I honestly... have just never even used jQuery before. Sorry. This might be hacky, but I wanted all of my personal data in a file for single-source-of-truth updating. I didn't do that on my first site. But now I have a simple &lt;code&gt;data.js&lt;/code&gt; file in a &lt;code&gt;services&lt;/code&gt; or &lt;code&gt;constants&lt;/code&gt; folder within &lt;code&gt;src&lt;/code&gt; and this is basically all it contains so far:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sylvia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="na"&gt;occupation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;looking for work&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;profilepic.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then, in any other React component I can add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../services/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then use constants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profilepic&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;images/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and I saved &lt;code&gt;profilepic.png&lt;/code&gt; in an &lt;code&gt;images&lt;/code&gt; folder within &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also use &lt;code&gt;App.css&lt;/code&gt; for changes to css outside of the Material components. For example, I wasn't quite sure what to do for my background, but I learned about this cool color gradient thing and it seemed like a small way to show a potentially lesser known CSS trick, so I added to my &lt;code&gt;App.css&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#ccafac&lt;/span&gt; &lt;span class="m"&gt;20%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#bebbcc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#9ba6c9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#8d95b8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#ccafac&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm obviously not a designer. This background could be very ugly. I think it's cool but in an old school way. I'm open to criticism here but please let me down easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT!&lt;/strong&gt; I am currently alternating between this color gradient background option, and plain image background I found on Unsplash. Not because anyone hated on my CSS gradient though. So if you're looking at my site right now and thinking, wait where's this color gradient I've heard so much about... I'm the kind of person who rearranges her furniture once a week. Also I wanted a nice &lt;code&gt;og meta image&lt;/code&gt; to show up on the thumbnail on LinkedIn so I definitely have the Unsplash for that. I might also just save a plain color gradient image for my thumbnail... 🧐 TBC&lt;/p&gt;

&lt;h1&gt;
  
  
  Material UI
&lt;/h1&gt;

&lt;p&gt;Before this, I had only really used Bootstrap and Semantic UI. This isn't really a post about the specifics of design libraries, but here are some nice articles that I skimmed when deciding to use Material:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@zeolearn/6-best-reactjs-based-ui-frameworks-9c780b96236c"&gt;6 Best ReactJS based UI Frameworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@gavizoid16/choosing-your-css-library-with-react-fdb9a02f9aac"&gt;Choosing your CSS library with React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tldr - Material is popular, easy to use, and I like the way it looks for now. Plus... &lt;code&gt;Google&lt;/code&gt;. So I pull up the &lt;a href="https://material-ui.com/"&gt;docs&lt;/a&gt; and get going:&lt;/p&gt;

&lt;h2&gt;
  
  
  npm install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// with npm
npm install @material-ui/core

// with yarn
yarn add @material-ui/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and that's all you actually need. But for font, icons, and responsive meta tag, I also did the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// for svg icons
// with npm
npm install @material-ui/icons

// with yarn
yarn add @material-ui/icons
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add to &lt;code&gt;index.html&lt;/code&gt; within the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; element:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&amp;amp;display=swap"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/icon?family=Material+Icons"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
      &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt;
      &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"minimum-scale=1, initial-scale=1, width=device-width"&lt;/span&gt;
      &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also used Font Awesome for icons. I tried the Material icons, but found FA easier for brands (Material doesn't seem to have the DEV icon 😞 ) so I add &lt;code&gt;&amp;lt;script src="https://kit.fontawesome.com/{your code}.js" crossorigin="anonymous"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; to the end of my &lt;code&gt;index.html&lt;/code&gt;. FA is totally free, you just have to give them your email to get this kit link.&lt;/p&gt;

&lt;p&gt;At this point, I also like to change the &lt;code&gt;icon&lt;/code&gt; links to something besides the React default. I just save something like a little moon emoji and change to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"%PUBLIC_URL%/moon.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some general thoughts for using Material:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand &lt;code&gt;React hooks&lt;/code&gt; - while I mentioned adding your own &lt;code&gt;App.css&lt;/code&gt; for changes such as background above, I also modified the &lt;code&gt;useStyles&lt;/code&gt; hooks within components for specific changes, like &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;margin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start off with the basic components like &lt;code&gt;&amp;lt;Grid&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Paper&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;Typography&amp;gt;&lt;/code&gt; before going on to more complicated templates and examples&lt;/li&gt;
&lt;li&gt;There are a few very basic examples in the docs that use purely Material components, but most of the other 'examples' or 'templates' have a lot added on that can make it complicated to try using&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Hosting on Netlify
&lt;/h1&gt;

&lt;p&gt;I wanted to use Netlify because, again, chance to use something new, and I remember reading &lt;a href="https://dev.to/lakatos88/new-personal-site-who-this-55f1"&gt;this&lt;/a&gt; post and thought Netlify seemed cool and fast. Again, my site is so small, it might not matter. But it does seem faster than GH Pages even on this small scale. So yay!&lt;/p&gt;

&lt;p&gt;See the following article for setting custom domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/easybuoy/setting-up-domain-with-namecheap-netlify-1a4d"&gt;Setting up Domain with Namecheap &amp;amp; Netlify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This might be a straightforward process to most, but it was new to me, and I was happy to have this excellent and clear walkthrough.&lt;/p&gt;

&lt;p&gt;But as far as just hosting a React app on Netlify goes, it's usually simple. I ran into more difficulty than expected, possibly because I jinxed myself by writing 'it's simple' before actually doing it lol. &lt;/p&gt;

&lt;p&gt;I set up continuous deployment, following the terminal prompts and browser options. More in depth steps from the &lt;a href="https://create-react-app.dev/docs/deployment/"&gt;docs&lt;/a&gt; and a how to &lt;a href="https://www.freecodecamp.org/news/how-to-deploy-a-react-application-to-netlify-363b8a98a985/"&gt;guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[EDIT]&lt;/strong&gt; I realized my very dumb mistake with deploying. I had started with a folder named &lt;code&gt;Components&lt;/code&gt; - capital C. Then, being the unimportant-detailed-focused person I am, I changed it to &lt;code&gt;components&lt;/code&gt; - lowercase c. Netlify continuous deployment is &lt;a href="https://docs.netlify.com/configure-builds/troubleshooting-tips/#case-sensitivity"&gt;case sensitive&lt;/a&gt; !!!! What a fun fact. So I had to do &lt;a href="https://git-scm.com/docs/git-mv"&gt;&lt;code&gt;git mv&lt;/code&gt;&lt;/a&gt;. Just when you think you know git. But anyway - you shouldn't even have to run &lt;code&gt;npm run build&lt;/code&gt; if you want continuous deployment and follow the Netlify prompts to link your GH from the very start. If the build fails - it might be a problem like this. &lt;/p&gt;

&lt;p&gt;The following worked without CD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
npm install netlify-cli -g
netlify deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because (and I might be explaining this incorrectly, but general idea) &lt;code&gt;npm run build&lt;/code&gt; runs a single build based on my origin git repo. But CD uses the remote, and that's where the case sensitivity disconnect happened.&lt;/p&gt;

&lt;h1&gt;
  
  
  Work in Progress
&lt;/h1&gt;

&lt;p&gt;An artist's work is never complete, am I right! I probably spend too much time editing (and by "editing" I mean switching between &lt;code&gt;#9ba6c9&lt;/code&gt; and &lt;code&gt;#8d95b8&lt;/code&gt; until my contact lenses fall out) but at the same time, I sometimes completely get distracted by another project and forget to update something important on a personal site. But maybe this blog post will motivate me to keep editing/looking for better ways to do things. &lt;code&gt;infinite 👏 days 👏 of 👏 code&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  More
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/easybuoy/setting-up-domain-with-namecheap-netlify-1a4d"&gt;Setting up Domain with Namecheap &amp;amp; Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/comscience/embed-your-dev-to-posts-anywhere-3m23"&gt;Embed Dev.To Posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-deploy-a-react-application-to-netlify-363b8a98a985/"&gt;How to deploy a React application to Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unsplash.com/photos/sbIwBLNi29A"&gt;Cover image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2We4dBDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://bcstudentafs.files.wordpress.com/2018/11/dolphins.jpg%3Fw%3D584" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2We4dBDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://bcstudentafs.files.wordpress.com/2018/11/dolphins.jpg%3Fw%3D584" alt="so long and thanks for all the fish"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>react</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>The bigger picture behind the GitHub master branch name change</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Sat, 20 Jun 2020 00:27:30 +0000</pubDate>
      <link>https://dev.to/sylviapap/the-bigger-picture-behind-the-github-master-branch-name-change-35h8</link>
      <guid>https://dev.to/sylviapap/the-bigger-picture-behind-the-github-master-branch-name-change-35h8</guid>
      <description>&lt;p&gt;By now you may have heard that &lt;a href="https://www.zdnet.com/article/github-to-replace-master-with-alternative-term-to-avoid-slavery-references/"&gt;GitHub plans to replace "master" with an alternative term to avoid slavery references&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll hopefully explain this throughout, but my main focus here isn't actually this specific GitHub debate. I am not trying to add to this question, or even make a claim in support or against. &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--X0wjKgHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1141742921240104961/ylpMiYrr_normal.jpg" alt="Angie Jones @ #JuneteenthConf profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Angie Jones @ #JuneteenthConf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/techgirl1908"&gt;@techgirl1908&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Who resparked the master branch convo right now?&lt;br&gt;&lt;br&gt;It's upsetting me and my homegirls.&lt;br&gt;&lt;br&gt;We are literally fighting to save lives and y'all are fighting to save a software term. &lt;br&gt;&lt;br&gt;We're in a war against racsim. Keep your ridiculous term (for now) and pick a bigger battle.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      00:12 AM - 16 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;This blog post was inspired by &lt;a href="https://www.cnet.com/how-to/juneteenth-is-today-what-it-means-why-it-matters-how-to-celebrate-friday/"&gt;Juneteenth&lt;/a&gt; and looking into different ways that I could get involved and write a relevant post. So first, here are some important things you can be doing today (that do not include fighting on the internet about a tech term):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cnet.com/news/8-ways-to-support-the-black-lives-matter-movement-after-the-protests-end/"&gt;8 ways to support the Black Lives Matter movement after the protests end&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npr.org/2020/06/19/879647898/calls-to-make-juneteenth-a-federal-holiday-gain-momentum"&gt;Calls To Make Juneteenth A Federal Holiday Gain Momentum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.waysideyouth.org/2020/06/18/10-things-we-want-white-people-to-do-to-celebrate-juneteenth/"&gt;10 Things We Want White People to Do to Celebrate Juneteenth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want more info on just the GitHub decision, here are some more general articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cnet.com/news/microsofts-github-is-removing-coding-terms-like-master-and-slave/"&gt;Microsoft's Github is removing coding terms like 'master' and 'slave'
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnet.com/news/master-and-slave-tech-terms-face-scrutiny-amid-anti-racism-efforts/"&gt;'Master' and 'slave': Tech terms face scrutiny amid anti-racism efforts
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a good dev post in support: &lt;a href="https://dev.to/rockykev/github-is-replacing-the-word-master-to-avoid-slavery-references-deal-with-it-86b"&gt;Github is replacing the word master to avoid slavery references. Deal with it.&lt;br&gt;
&lt;/a&gt; and this is a good post against: &lt;a href="https://dev.to/dandv/8-problems-with-replacing-master-in-git-2hck"&gt;9 problems with replacing "master" in Git&lt;/a&gt;. &lt;a href="https://dev.to/damcosset/replacing-master-in-git-2jim"&gt;This&lt;/a&gt; one is very good for what I would consider an in between.&lt;/p&gt;

&lt;p&gt;Again - not trying to add to what has become a classic internet troll debate with no seemingly correct answer and a lot of loud white people going in circles. And yes, I am white, so I sincerely acknowledge that I can't speak for anyone on this issue. &lt;/p&gt;

&lt;p&gt;But I am a woman, and I know what it's like to feel excluded from the tech community by things that might seem small to others. So I'm just going to share some things other people have said on this topic that I have found helpful and/or relevant to bigger issues. &lt;/p&gt;

&lt;p&gt;First, some Twitter humor that generally represents my stance:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--j9V1i0Go--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/977609481575022593/eOuRJP_K_normal.jpg" alt="Scott Nye profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Scott Nye
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @railoftomorrow
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Taking Aunt Jemima off of syrup???? What’s next, some other familiar aspect of my life that, if altered, won’t affect me at all but will chip away at the casual or even overt racism in our society????
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      18:01 PM - 17 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;And one in opposition that I was prepared to argue against:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--v9fHckUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/874270592786206720/MffoZKsj_normal.jpg" alt="David Daniel profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        David Daniel
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @davydany
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      &lt;a href="https://twitter.com/natfriedman"&gt;@natfriedman&lt;/a&gt; &lt;a href="https://twitter.com/Una"&gt;@Una&lt;/a&gt; &lt;a href="https://twitter.com/github"&gt;@github&lt;/a&gt; &lt;a href="https://twitter.com/billygriffin22"&gt;@billygriffin22&lt;/a&gt; 🤦‍♂️ this is just stupid .... "master" branch in git doesn't mean the same as master/slave, it simply means the main branch.. &lt;br&gt;&lt;br&gt;The word "Master" has other meanings too... Like verb: acquire complete knowledge or skill ... Or the meaning here, adjective: main or principal.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      02:13 AM - 15 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;Largely because I find it insensitive to say anything along the lines of "I've never thought of it this way, therefore it is not offensive." To quote another Tweet:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--X0wjKgHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1141742921240104961/ylpMiYrr_normal.jpg" alt="Angie Jones profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Angie Jones
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/techgirl1908"&gt;@techgirl1908&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      This is the bare MINIMUM you can do and yall can't even do this without whining and centering yourselves.&lt;br&gt;&lt;br&gt;Yes we know slavery never crosses *your* mind when you hear it. When does it ever? THAT'S THE WHOLE POINT!&lt;br&gt;&lt;br&gt;If you cant even do the light work, pls just get out of the way
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      00:29 AM - 16 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;BUT - and I cannot emphasize this enough - I am not here to add to this specific GitHub debate. I know some commenters are going to miss this point, so maybe I should have left the word GitHub out of my title. Might go back and edit if this still isn't clear: I am talking about microaggressions in tech in general, inspired by and relating to the GitHub debate, but more so as a post dedicated to the larger importance of simple awareness of microaggressions. &lt;/p&gt;

&lt;p&gt;Some people against the 'master change' understand the importance of implicit bias and just think this particular debate is trivial. Again - I am not addressing that!! But a lot of people who think the word shouldn't be changed also seem to think a lot of other things shouldn't be changed. That's what this is about. &lt;em&gt;Bigger. Picture.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Political correctness and "free speech"
&lt;/h1&gt;

&lt;p&gt;Many will openly admit that, yes, this debate is not just about technology or force of habit. It's about fear and anger toward a larger 'PC culture,' microaggressions, over-sensitivity, coddling, etc. &lt;/p&gt;

&lt;p&gt;I can kind of see how this is the only possible argument against something as small and easy as changing a few letters in a branch name. To oppose something so small, you really must be dreaming up some wild &lt;em&gt;1984&lt;/em&gt; slippery slope fallacies. These articles (&lt;a href="https://www.theatlantic.com/ideas/archive/2019/06/free-speech-crisis-campus-isnt-real/591394/"&gt;The Atlantic&lt;/a&gt; and &lt;a href="https://www.theguardian.com/news/2018/jul/26/the-free-speech-panic-censorship-how-the-right-concocted-a-crisis"&gt;The Guardian&lt;/a&gt;) address this better and more calmly than I can. &lt;/p&gt;

&lt;h1&gt;
  
  
  Why microaggressions matter
&lt;/h1&gt;

&lt;p&gt;I grew up in several very white communities, and I thought, up until college, that I &lt;em&gt;could not&lt;/em&gt; be racist because I didn't have any consciously racist thoughts. I thought racism was explicit - hate crimes, slurs, segregation. I heard the term micro-aggression for the first time in college, and I also wondered if it was 'the wrong hill to die on,' 'taking away from more serious issues,' etc. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.theatlantic.com/politics/archive/2015/09/microaggressions-matter/406090/"&gt;This&lt;/a&gt; is an excellent article with many sources on the general importance of micro-aggressions.&lt;/p&gt;

&lt;p&gt;I slowly learned more, but the most significant event was a course I took on &lt;em&gt;The Psychology of Stereotyping and Prejudice&lt;/em&gt;. I might be coming off too self-righteous, ivory tower white savior here, so I will try not to go too deep into this. I just feel like these kinds of courses and materials are not common in formal education, or even the debates all over the internet now. People love to debate about their experiences, and maybe articles they've read about current events, but are less likely to read about how abstract, experimental, and unconscious psychology might be affecting how we think about these problems.  &lt;/p&gt;

&lt;h1&gt;
  
  
  How psychology can help
&lt;/h1&gt;

&lt;p&gt;One of my favorite books on this topic, and in general, is &lt;em&gt;&lt;a href="https://www.amazon.com/Blink-Power-Thinking-Without/dp/0316010669"&gt;Blink&lt;/a&gt;&lt;/em&gt; by Malcolm Gladwell. It's not entirely focused on race, though, so you should probably first check out the many &lt;a href="https://www.nytimes.com/2019/05/29/books/review/antiracist-reading-list-ibram-x-kendi.html"&gt;Anti-Racist Reading Lists&lt;/a&gt; being discussed lately. But if those are too much for you or your white grandmother's fragility right now, this is an excellent place to start. &lt;/p&gt;

&lt;p&gt;If you want something shorter than a book, this is a great scholarly article: &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6007773/"&gt;Language Matters: Considering Microaggressions in Science&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clearly these debates can be polarizing and make people in the middle feel attacked and overly defensive, so I do want to stress - the whole point of understanding micro-aggressions and implicit bias is understanding how we all perpetuate negative things &lt;em&gt;without conscious awareness&lt;/em&gt; that we are doing it. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I'm still not entirely sure where I stand on this specific GitHub name change question. There's definitely too much white-splaining going on. That's why I tried to amplify as many other voices besides my own here. Regardless of where you stand on the GitHub question - it makes me uncomfortable to see these conversations still being dominated by white cishet men (regardless of their stance!) &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--MkshwulH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/818997879696195584/1_vmf7bc_normal.jpg" alt="Mina Markham 🧁 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Mina Markham 🧁
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @minamarkham
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      &lt;a href="https://twitter.com/zkat__"&gt;@zkat__&lt;/a&gt; I’ve never like the master/slave terminology. Similarly I don’t like the male/female analogy for peripherals.&lt;br&gt;&lt;br&gt;Changes like these are important because language matters. But if these are the only changes an organization wants to make, then yes it’s performative.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      19:35 PM - 15 Jun 2020
    &lt;/div&gt;


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


&lt;p&gt;Either way, this certainly cannot be the &lt;em&gt;only&lt;/em&gt; thing you do or care about in anti-racism. We should still criticize GitHub for other &lt;a href="https://www.vice.com/en_us/article/wjw4az/internal-email-github-plans-to-renew-ice-immigration-customs-enforcement-contract"&gt;things&lt;/a&gt;, just like we should with every organization right now putting up a BLM statement and nothing else. &lt;/p&gt;

&lt;p&gt;Changing &lt;code&gt;master&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; is small, and maybe won't make much of a difference whether it happens or not. But the larger idea here of micro-aggressions and implicit bias in perpetuating exclusivity in one of the most homogenous industries should be worth considering.&lt;/p&gt;

&lt;h1&gt;
  
  
  Further reading
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/afrodevgirl/replacing-master-with-main-in-github-2fjf"&gt;Replacing master with main in Github
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/mrsaeeddev/how-to-rename-your-master-branch-to-something-else-58bj"&gt;How to rename your master branch to something else&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>inclusion</category>
      <category>github</category>
      <category>git</category>
      <category>blacklivesmatter</category>
    </item>
    <item>
      <title>Setting Heroku Config Vars with Google Cloud JSON Credentials File and Rails</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Fri, 15 May 2020 05:27:41 +0000</pubDate>
      <link>https://dev.to/sylviapap/setting-heroku-config-vars-with-google-cloud-json-file-on-rails-4dnf</link>
      <guid>https://dev.to/sylviapap/setting-heroku-config-vars-with-google-cloud-json-file-on-rails-4dnf</guid>
      <description>&lt;p&gt;Setting config vars/secret API keys in Heroku is usually pretty straightforward. Here's a great &lt;a href="https://medium.com/better-programming/how-to-hide-your-api-keys-c2b952bc07e6"&gt;post&lt;/a&gt; I refer to a lot on hiding your API keys in general. But things get tricky when you have anything more than the standard &lt;code&gt;KEY=value&lt;/code&gt; setup. &lt;/p&gt;

&lt;p&gt;When you sign up for something like the Google Maps API, you get a standard API key - a single string of characters you can plug into a &lt;code&gt;.env&lt;/code&gt; and then Heroku config vars. But with Google Cloud APIs, you need a whole 'service account,' and .json file of various keys that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"service_account"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project-00000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"private_key_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"private_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-----END PRIVATE KEY-----&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"client_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx@xxxxxxxx.iam.gserviceaccount.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"client_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_provider_cert_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"client_cert_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxxxxxxxxxx"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it doesn't seem like you could just plug each of those into config vars individually. (But I didn't actually try it - so, lol if that does work! But the &lt;a href="https://cloud.google.com/translate/docs/basic/setup-basic"&gt;docs&lt;/a&gt; pretty clearly say to use the whole file).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HTbFdMj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uy6e82jwfeu9q8tinw92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HTbFdMj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uy6e82jwfeu9q8tinw92.png" alt="Alt Text"&gt;&lt;/a&gt;When the 'before you begin' of 'basic setup' takes a whole day&lt;/p&gt;

&lt;p&gt;It took me a while to figure out even the basic set up for local testing (I didn't install the SDK), but the process of hosting was even more stressful, because of the risk of getting credentials stolen, so assuming you've made it past all these steps, I thought I'd write a blog post about safely setting Heroku config vars when you have a .json credentials file.&lt;/p&gt;

&lt;p&gt;This might be kind of niche, but I'm writing this based on a bootcamp project that was built with a Rails frontend and backend - so no React/JavaScript here. It should be applicable regardless - the Heroku google-cloud buildpacks here are language non-specific - but a lot of my struggles revolved around the Ruby buildpack, so just be careful if you're using React, etc., that you have the appropriate React buildpack in addition to the Google buildpack. Are you sick of the word &lt;code&gt;buildpack&lt;/code&gt; yet?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;heroku create&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;So now let's assume you have an app set up and ready to go for Heroku. For Rails, this might involve some extra &lt;a href="https://medium.com/@siobhanpmahoney/deploying-a-react-frontend-rails-backend-project-to-heroku-4b2c4f6f630c"&gt;steps&lt;/a&gt; with &lt;code&gt;postgres&lt;/code&gt;. This might go without saying, but pretty much every step here can be done either from the command line or in browser. I liked to have both open, and refresh my Heroku settings page after command line changes just to sanity check things were working. But I'll show command line here, because I love code blocks! &lt;/p&gt;

&lt;p&gt;Make sure you're logged into Heroku (&lt;code&gt;heroku login&lt;/code&gt;) and in your main project directory, and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku create my-app
heroku buildpacks:set heroku/ruby
heroku buildpacks:add --index 1 https://github.com/buyersight/heroku-google-application-credentials-buildpack.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the &lt;code&gt;--index 1&lt;/code&gt; and the order here are important. Heroku docs re: &lt;a href="https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app"&gt;multiple buildpacks&lt;/a&gt;: "The buildpack for the primary language of your app should be the last buildpack added."&lt;/p&gt;

&lt;p&gt;Terminal should return, or you can verify with &lt;code&gt;heroku buildpacks&lt;/code&gt; at any time, the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buildpack added. Next release on example-app-test-123 will use:
  1. https://github.com/buyersight/heroku-google-application-credentials-buildpack.git
  2. heroku/ruby
Run git push heroku master to create a new release using these buildpacks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But at this point we haven't staged anything so don't forget to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "first heroku commit" 
git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;General reminder, before you run &lt;code&gt;git push heroku master&lt;/code&gt; after a buildpack change, you'll probably need to change something in the code (like even just adding a space in any file) so you can add/commit changes to be pushed and the app will be "re" built.&lt;/p&gt;

&lt;p&gt;At this point you should notice the long chain of ruby gems installing. If the build is fast, short, and has no gems, it probably means your Ruby buildpack didn't get through and this is bad news bears! Again, check &lt;code&gt;heroku buildpacks&lt;/code&gt; and/or settings in browser to verify it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku buildpacks
=== my-app Buildpack URLs
1. https://github.com/buyersight/heroku-google-application-credentials-buildpack.git
2. heroku/ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---0OdVPS_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tflzujw387lvih4l97vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---0OdVPS_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tflzujw387lvih4l97vz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now for the real config var stuff.&lt;/p&gt;

&lt;p&gt;As always, either in command line or browser, set the vars. In terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku config:set GOOGLE_CREDENTIALS='&amp;lt;copy and paste contents of your .json file&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and don't forget to wrap in quotes. But if you do it in browser, no quotes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2L5o1JZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/orbhm8xzzx6d1pakwlr4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2L5o1JZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/orbhm8xzzx6d1pakwlr4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and now, same thing, but:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku config:set GOOGLE_APPLICATION_CREDENTIALS='google-credentials.json'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and in browser to confirm (also a larger image so you can kind of see what the settings/config vars page should look like at this point):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F6vxrZTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7fpxqqb2qpso3j8i8w2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F6vxrZTA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7fpxqqb2qpso3j8i8w2h.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that it's important that you use exactly &lt;code&gt;google-credentials.json&lt;/code&gt; in this step. At first I thought I could/should use whatever name I had been using in my local directory, i.e. &lt;code&gt;my-config.json&lt;/code&gt;, but it didn't work, and I'm pretty sure it's part of how the buildpack works that this is named exactly like this. And it has nothing to do with your local directory (kind of the whole point I realized) so you don't need to make the names match or anything. &lt;/p&gt;

&lt;p&gt;Finally, if everything has gone according to plan, you should be able to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku run rake db:migrate
heroku run rake db:seed
heroku open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and for me, all I needed to confirm the credentials worked was if the db:seed was successful, because I used the API to get the list of languages and language codes in my seeds. &lt;/p&gt;

&lt;p&gt;Small note here - I actually call on the API in my code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;translate = Google::Cloud::Translate.new version: :v2, project_id: ENV["CLOUD_PROJECT_ID"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but I don't have &lt;code&gt;CLOUD_PROJECT_ID&lt;/code&gt; anywhere in Heroku config vars. It seems that I only needed this for local env/testing, and you could just take out the whole &lt;code&gt;project_id: ENV["CLOUD_PROJECT_ID"]&lt;/code&gt; part here if you were just using Heroku, because of the buildpack. &lt;/p&gt;

&lt;h2&gt;
  
  
  Mistakes I made
&lt;/h2&gt;

&lt;p&gt;I thought, with a Rails app, the Ruby buildpack gets added automatically when you run &lt;code&gt;heroku create&lt;/code&gt;. It doesn't seem that it does, but it also seems like if you aren't using additional buildpacks, you wouldn't need to explicitly set the Ruby one. But throughout my process of trying two different &lt;code&gt;google-buildpack&lt;/code&gt;s, I kept getting this error without realizing it was because I did not have the Ruby buildpack specified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku run rake db:migrate
Running rake db:migrate on ⬢ translation-chat-app... up, run.7099 (Free)
rake aborted!
LoadError: cannot load such file -- bundler/setup
/app/config/boot.rb:3:in `&amp;lt;top (required)&amp;gt;'
/app/config/application.rb:1:in `require_relative'
/app/config/application.rb:1:in `&amp;lt;top (required)&amp;gt;'
/app/Rakefile:4:in `require_relative'
/app/Rakefile:4:in `&amp;lt;top (required)&amp;gt;'
(See full trace by running task with --trace)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I recommend frequently running &lt;code&gt;heroku buildpacks&lt;/code&gt; and/or checking &lt;code&gt;Settings&lt;/code&gt; in your browser. After these &lt;code&gt;bundler&lt;/code&gt; errors, and some stack overflowing, I realized I somehow now only had two different Google buildpacks, and no Ruby buildpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku buildpacks
=== translation-chat-app Buildpack URLs
1. https://github.com/buyersight/heroku-google-application-credentials-buildpack.git
2. https://github.com/elishaterada/heroku-google-application-credentials-buildpack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This second one - from &lt;code&gt;elishaterada&lt;/code&gt; - did not work for me, although looking back now, this may have been because of the Ruby buildpack. So I can't entirely say it &lt;em&gt;doesn't&lt;/em&gt; work, but it didn't for me, so I'm going to say follow this buildpack strictly: &lt;a href="https://elements.heroku.com/buildpacks/buyersight/heroku-google-application-credentials-buildpack"&gt;&lt;code&gt;buyersight&lt;/code&gt;&lt;/a&gt;. It is a fork of the &lt;code&gt;elishaterada&lt;/code&gt; one. Either way, you're probably not going to want two of the same thing in your buildpacks!&lt;/p&gt;

&lt;p&gt;I found it easier to just click the 'x' button on browser to remove, but you can also do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku buildpacks:remove https://github.com/elishaterada/heroku-google-application-credentials-buildpack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then to get my Ruby back I did:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku buildpacks:set heroku/ruby
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Again, there were a ton of related stack overflow posts about this out there, but nothing exactly followed/explained this in a satisfying way. It's kind of a niche problem, and weird that Google can't just give a simple API key here, but there seem to be a lot of amazing Google Cloud services that might require this. I was almost discouraged from hosting my project because I was so scared of exposing my info. But I'm glad I got past that! Hope this helped you too. &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sylviapap/TalkR"&gt;My repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://translation-chat-app.herokuapp.com/"&gt;Site demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/translate/docs/basic/setup-basic"&gt;Google Cloud Translation Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Symptom Check and Self-Report COVID with React, Rails, Google Maps API</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Wed, 13 May 2020 21:47:08 +0000</pubDate>
      <link>https://dev.to/sylviapap/check-out-my-coding-bootcamp-final-project-1lc1</link>
      <guid>https://dev.to/sylviapap/check-out-my-coding-bootcamp-final-project-1lc1</guid>
      <description>&lt;p&gt;&lt;a href="https://racoon.digital/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjkkshlrpejbps79guyp3.png" alt="Alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Not another COVID app!
&lt;/h2&gt;

&lt;p&gt;Yes, I'm sorry, this is a COVID tracker. I know the market is pretty saturated on these. Some of my friends expected this to be my &lt;a href="https://silicon-valley.fandom.com/wiki/Pied_Piper_(company)" rel="noopener noreferrer"&gt;&lt;em&gt;Silicon-Valley-Pied-Piper&lt;/em&gt;&lt;/a&gt; moment, but sadly, all I have in common with Pied Piper is a weird name...&lt;/p&gt;

&lt;h2&gt;
  
  
  Racoon
&lt;/h2&gt;

&lt;p&gt;I'm proud of this, and willing to take the risk that people think this is some kind of dating app for raccoons. Racoon, with one 'C', is an anagram (and supposedly, the only anagram) of 'Corona.' It's a &lt;a href="https://www.merriam-webster.com/dictionary/racoon" rel="noopener noreferrer"&gt;valid&lt;/a&gt; alternate spelling - don't listen to that red dotted line. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[EDIT]&lt;/strong&gt; I also just finally got around to getting a custom domain. I wanted to be as cheap as possible about it though, so allow me to present... &lt;a href="https://racoon.digital/" rel="noopener noreferrer"&gt;racoon.digital&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;My goal here is just to show off something I'm proud of, not to try to win anything or start a real company. So if you're thinking, &lt;em&gt;This idea is not original!&lt;/em&gt; or, &lt;em&gt;This name would really confuse users and be hard to sell!&lt;/em&gt; - it's hopefully not that important, as long as I don't get any hiring managers who were attacked by raccoons in childhood. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.top13.net%2Fwp-content%2Fuploads%2F2017%2F07%2Fraccons-being-adorable-5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.top13.net%2Fwp-content%2Fuploads%2F2017%2F07%2Fraccons-being-adorable-5.jpg" alt="alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features and Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic Google Map &lt;/li&gt;
&lt;li&gt;Official, up-to-date worldwide COVID-19 data &lt;/li&gt;
&lt;li&gt;Custom markers to display cases by users' locations (anonymously)&lt;/li&gt;
&lt;li&gt;Symptom checker component &lt;/li&gt;
&lt;li&gt;Health profile for saving/editing symptoms and diagnoses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some highlights of what I feel were my biggest challenges/achievements/takeaways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorization and Authentication
&lt;/h3&gt;

&lt;p&gt;I wanted the two main components - the map and the symptom checker - to be available without an account. You need an account to post to the map, to see comments, and to save anything, such as bookmarks or diagnosis results.&lt;/p&gt;

&lt;p&gt;But, I now see why it is easier to make the whole app either login required or none at all. I ran into many difficulties with ternaries on whether or not a user was 'logged in,' especially with &lt;code&gt;react-router&lt;/code&gt; and Redux. In general, I absolutely loved Redux, but this is also the first time I've really used it, so some of my problems may have come from a faulty implementation of Redux/Thunk. The page loads as if there is no current user every time, and then cycles through several re-renders once the fetch to my backend has retrieved the current user. This caused a ton of problems with &lt;code&gt;undefined&lt;/code&gt; errors on the initial load. &lt;/p&gt;

&lt;p&gt;I should have used &lt;code&gt;localStorage.token ?&lt;/code&gt; for my ternaries instead of essentially &lt;code&gt;currentUser ?&lt;/code&gt; or &lt;code&gt;loggedIn ?&lt;/code&gt; based on a successful fetch to my backend auth route. Those return false on initial load, whereas if a user is logged in, &lt;code&gt;localStorage.token&lt;/code&gt; would return true on page load. I thought it made sense to set it up the second way just in case there were a token without a user, somehow. But, if your auth is solid, then a user would only ever have a token if they are &lt;code&gt;logged_in&lt;/code&gt;, and it makes more sense to base any auth conditionals on the frontend using &lt;code&gt;localStorage.token ? (showpage) : null&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;google-maps-react&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I used the library &lt;code&gt;google-maps-react&lt;/code&gt; for easily using the Google Maps JavaScript API in React. At first, this package was truly amazing, and I never realized how difficult it can be trying to use pure JS inside a React component without some kind of library. I only ran into problems with it once I wanted more customization, as you might expect. There were some small hiccups that they should definitely fix - such as forgetting to include the &lt;code&gt;&amp;lt;Circle /&amp;gt;&lt;/code&gt; component in the default version. But even that taught me the wonders of simply changing a version number in &lt;code&gt;package.json&lt;/code&gt; from &lt;code&gt;2.0.2&lt;/code&gt; to &lt;code&gt;2.0.3&lt;/code&gt;. Love it when that works. &lt;/p&gt;

&lt;p&gt;The deeper issues I had with &lt;code&gt;google-maps-react&lt;/code&gt;, and why I would almost recommend not using a wrapper package at all if you really wanted to get serious about your Google Maps React app, was all the hidden styling and mysterious &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;s that popped up. You can specify map styling - again, huge benefit - but only properties for the whole container/map, such as position, height, and width.&lt;/p&gt;

&lt;p&gt;As for the mystery &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;s - I was proud of myself for going back to vanilla JS roots and using the following solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#root &amp;gt; div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;map-container&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seems small, but for the longest time I had basically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"map"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with no idea how that 2nd, empty, classless &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; got there! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2F1e1e91921b5673607e3e62f27076e77d%2Ftenor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2F1e1e91921b5673607e3e62f27076e77d%2Ftenor.gif" alt="alt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I triple checked all my JSX, so without getting into the &lt;code&gt;google-maps-react&lt;/code&gt; source code, I thought it must have been from something the package does to wrap the map component.&lt;/p&gt;

&lt;p&gt;There was an easy solution for this particular example, but there are many more such struggles of unforeseen styling here. Still love &lt;code&gt;google-maps-react&lt;/code&gt;, but something to be careful of when using imports. Side note - there also exists a &lt;code&gt;google-map-react&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Symptom Checker API
&lt;/h3&gt;

&lt;p&gt;I used the Infermedica API for the diagnosis component. I wanted to make as few requests as possible (the API is free but limited) and that made things harder because it's designed for many requests. You're supposed to send a POST request with a patient's basic info (sex, age), then the response is a question, and then you go through an interview flow of follow-ups that add to the previous request body, and eventually returns a response of no further questions/diagnosis. &lt;/p&gt;

&lt;p&gt;I ended up with a big, ugly, repetitive function, and a less-than-ideal user experience form submission, but! it! works!!!! It's one of my biggest refactor goals to set it up in the intended interview, or even chatbot, style. But I now deeply understand &lt;a href="https://www.instagram.com/p/B-AJtycgYKU/?igshid=12f3s8qalj71s" rel="noopener noreferrer"&gt;this&lt;/a&gt; meme.&lt;/p&gt;

&lt;p&gt;I'm also looking into ways to replace the symptom-checker form with something cooler like a legitimate chatbot, and/or rewrite my own medical algorithm. This would be way more as an exercise in writing my own algorithms though - there have to be so many complex medical-knowledge things from real doctors that went into the Infermedica API. &lt;/p&gt;

&lt;h3&gt;
  
  
  Rails Serializers
&lt;/h3&gt;

&lt;p&gt;I got wrecked by serializers on this project. I'll write another blog post on it, because I have a lot to say on the subject now, and I didn't find a lot of helpful blog posts along this sub-journey. &lt;/p&gt;

&lt;p&gt;But for now I'll say that I severely underestimated serializers, started off with Active Model, then tried to switch to Fast JSON API, then saw my users' (luckily, fake) password digests exposed, then my life flash before my eyes, and then finally came back to a point of semi-understanding, security, and efficiency with AMS. Until my longer blog post - do not underestimate your Rails serializers. Make them as solid as possible, as early on as possible. &lt;/p&gt;

&lt;h3&gt;
  
  
  Speed!!!
&lt;/h3&gt;

&lt;p&gt;I've seen &lt;a href="https://neilpatel.com/blog/loading-time/?wide=1" rel="noopener noreferrer"&gt;this&lt;/a&gt; shared a couple times and always think of it now - 40% of people abandon a website that takes more than 3 seconds to load. Load times/query optimization aren't a big focus in bootcamps. It's maybe understandably too-much-too-soon for beginners. But I &lt;em&gt;think&lt;/em&gt; I learned some useful things about Active Record optimization, like avoiding &lt;code&gt;.all&lt;/code&gt;, and instead using &lt;code&gt;.includes()&lt;/code&gt; or &lt;code&gt;.where()&lt;/code&gt;, so that's a small victory. But I want to learn more about caching data, using &lt;code&gt;localStorage&lt;/code&gt;, minimizing fetches on the frontend, and of course optimizing the backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  TensorFlow and Machine Learning
&lt;/h3&gt;

&lt;p&gt;I wanted a basic audio component because I recently read some amazing project ideas for using audio recognition to diagnose patients through a recording of a &lt;a href="https://devpost.com/software/faco-fight-against-corona-jfcza9" rel="noopener noreferrer"&gt;cough&lt;/a&gt;. Pro: I used &lt;code&gt;react-mic&lt;/code&gt; and it worked as expected! Yay! Con: I didn't do much else with it, or anything at all with TensorFlow in the final version of the audio component here. &lt;/p&gt;

&lt;p&gt;I never claimed to be good enough with AI/ML to use TensorFlow here in a meaningful/diagnostic way, but I thought I had a decent enough understanding to tell the user whether or not their recording sounded like a cough. I still might. But the deadline came knocking and I abandoned that for simple audio that records, shows a frequency visualization, and lets you download your recording. But focusing on the positives here, I used a new react package, and I set up a general component for building upon later. &lt;/p&gt;

&lt;p&gt;I struggled with the basics of audio, JS, and HTML more than expected. I had never used any of the &lt;code&gt;getUserMedia()&lt;/code&gt; API, and was overwhelmed by all the &lt;code&gt;new AudioContext()&lt;/code&gt; and &lt;code&gt;new MediaRecorder(stream, options)&lt;/code&gt; so I want (need?) to understand all of this better before anything else re: audio/AI/TensorFlow.&lt;/p&gt;

&lt;p&gt;But I haven't given up! I got TensorFlow to tell me whether or not I was coughing into a microphone in a separate exercise, I just need to figure out making the 'cough training' persist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying
&lt;/h3&gt;

&lt;p&gt;A final note on deploying both the frontend and backend to Heroku - this &lt;a href="https://medium.com/@siobhanpmahoney/deploying-a-react-frontend-rails-backend-project-to-heroku-4b2c4f6f630c" rel="noopener noreferrer"&gt;post&lt;/a&gt; is my favorite article to follow. It's pretty standard, but this one is concise and direct. I didn't use &lt;code&gt;yarn&lt;/code&gt;, and I had no problems. I had tried Github pages and React before this, and did not like it, so I was surprised at how easy this was. If you are just looking for the fastest, easiest way to get your Rails backend, React frontend app online, I strongly recommend Heroku!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[EDIT]&lt;/strong&gt; I now strongly recommend deploying the frontend to Netlify!! I still have my backend on Heroku, but my frontend/new racoon.digital domain is on Netlify. I just generally love how easy it is to use continuous deployment with Netlify and React. I've only had minor setbacks with it, either from some dumb, easily fixed mistake I had in the build, and/or from forgetting to add a &lt;code&gt;_redirects&lt;/code&gt; file for &lt;code&gt;react-router&lt;/code&gt;. See &lt;a href="https://www.netlify.com/blog/2016/07/22/deploy-react-apps-in-less-than-30-seconds/" rel="noopener noreferrer"&gt;here&lt;/a&gt; for more in depth guide, but it really is straightforward. And so far, it definitely seems faster than Heroku. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I hope to add a video demo soon. That seems like a very key post-bootcamp thing to do for projects, but I hate the sound of my own voice so here we are. I hope that racoon.digital is good enough for now. This domain was surprisingly cheap - please let me know if I am missing something that makes this a terrible domain name lol! I just wanted something memorable and catchy for my LinkedIn, and honestly I like it, but I'm always open to feedback here. &lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1585252406583-b474fb5f5ade%3Fixlib%3Drb-1.2.1%26ixid%3DeyJhcHBfaWQiOjEyMDd9%26auto%3Dformat%26fit%3Dcrop%26w%3D1064%26q%3D80" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1585252406583-b474fb5f5ade%3Fixlib%3Drb-1.2.1%26ixid%3DeyJhcHBfaWQiOjEyMDd9%26auto%3Dformat%26fit%3Dcrop%26w%3D1064%26q%3D80" alt="Alt Text"&gt;&lt;/a&gt;Remember to social distance! Cover image: &lt;a href="https://unsplash.com/photos/jaWqPEPemvU" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://racoon.digital/" rel="noopener noreferrer"&gt;Live Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sylviapap/final-project-client" rel="noopener noreferrer"&gt;Frontend repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sylviapap/final-project-server" rel="noopener noreferrer"&gt;Backend repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.infermedica.com/docs/covid-19" rel="noopener noreferrer"&gt;Infermedica API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fullstackreact/google-maps-react" rel="noopener noreferrer"&gt;google-maps-react&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>A Beginner's Guide to Healthcare AI and TensorFlow.js</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Tue, 05 May 2020 00:31:40 +0000</pubDate>
      <link>https://dev.to/sylviapap/beginner-healthcare-ai-tensorflow-js-4ma1</link>
      <guid>https://dev.to/sylviapap/beginner-healthcare-ai-tensorflow-js-4ma1</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;I am a semi-beginner in all things tech and coming up on actually finally completing my coding bootcamp course with Flatiron on full stack web development! Woo 🎉 The course covers standard software engineering, and not AI/machine learning/data science, but I've always been interested in it, and wanted to learn general programming before one day moving into something more directly AI related. But I could definitely be like this meme about wannabe AI enthusiasts - so this is a post for - cannot emphasize enough - beginners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzf6iwhde0l78ogb2c3ea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzf6iwhde0l78ogb2c3ea.png" alt="Alt Text"&gt;&lt;/a&gt;Image credit: &lt;a href="https://www.instagram.com/p/B7a_r7TCwP0/?igshid=qcq4gbvg9jzq" rel="noopener noreferrer"&gt;@spicy_coding_memes&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  COVID-19
&lt;/h1&gt;

&lt;p&gt;Yes, this is a post about COVID-19. AI and coronavirus. Who needs another one of those? Not me! Send tweet. &lt;/p&gt;

&lt;p&gt;I promise I'll try to be original here. I've always been very interested in healthcare tech and AI - maybe because I love to watch &lt;em&gt;Grey's Anatomy&lt;/em&gt; and I've always wanted the glory of medicine without having to go to medical school! But for real - and at the risk of sounding like &lt;em&gt;Silicon Valley&lt;/em&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd2v7i6t2.map2.ssl.hwcdn.net%2Fcontent%2Fquotes%2F2371_500.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fd2v7i6t2.map2.ssl.hwcdn.net%2Fcontent%2Fquotes%2F2371_500.jpg" alt="Alt text"&gt;&lt;/a&gt;&lt;br&gt;
I really do want to use technology to make... the world... at least slightly less terrible than it is now. Whether or not that's possible is a question for another day!&lt;/p&gt;

&lt;p&gt;Most coding bootcamps have a 'final project' that combines everything we've learned in the past 15 weeks, and mine is due at the end of this week, so I've been spending a lot of time looking at trending projects/hackathon submissions to gather inspiration and try to think of something that hadn't been totally done a million times before (this might also be impossible). As I said, I've been generally interested in something healthcare-related for this final project since before I even started, and now with COVID, I couldn't help it.&lt;/p&gt;

&lt;p&gt;For inspiration, this &lt;a href="https://devpost.com/software/faco-fight-against-corona-jfcza9" rel="noopener noreferrer"&gt;project&lt;/a&gt; in particular caught my attention, because of the use of audio recognition and coughs. There doesn't seem to be a lot of specific research on the use of cough recognition and coronavirus, but the research on uses in other medical conditions/cases seems very promising. &lt;/p&gt;

&lt;p&gt;There are many other very cool uses for AI/COVID - using &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7187882/" rel="noopener noreferrer"&gt;imaging&lt;/a&gt;, fever detection &lt;a href="https://techcrunch.com/2020/04/16/chinese-startup-rokid-pitches-covid-19-detection-glasses-in-u-s/" rel="noopener noreferrer"&gt;glasses&lt;/a&gt;, &lt;a href="https://www.bbc.com/news/technology-52340651" rel="noopener noreferrer"&gt;cleaning robots&lt;/a&gt;, and - potentially more controversial - 'smart' &lt;a href="https://www.scmp.com/tech/article/3077964/ring-smart-doorbell-monitors-people-covid-19-isolation" rel="noopener noreferrer"&gt;doors&lt;/a&gt; that monitor people's activity and movement in quarantine. If all of these seem a little too sci-fi and impractical, there is also the more familiar example of AI chatbot technology, such as IBM &lt;a href="https://www.ibm.com/watson/covid-response" rel="noopener noreferrer"&gt;Watson&lt;/a&gt;, in helping to automate COVID diagnosis, questioning, and spread of information. While this is a beginner's post, it's no secret that AI in general has a ton of varying uses, some controversial and some, frankly, mundane, so I won't go into that too much more here. &lt;/p&gt;
&lt;h1&gt;
  
  
  TensorFlow
&lt;/h1&gt;

&lt;p&gt;All of this got me very interested in a basic implementation of &lt;a href="https://www.tensorflow.org/" rel="noopener noreferrer"&gt;TensorFlow&lt;/a&gt;, Google's open-source machine-learning platform. My final bootcamp project is a COVID-19 self-report tracker and symptom checker, with a Rails backend and React.js frontend, so I looked into using TensorFlow.js, specifically for &lt;a href="https://www.tensorflow.org/js/tutorials/transfer/audio_recognizer" rel="noopener noreferrer"&gt;audio&lt;/a&gt; recognition. TensorFlow and AI in general seem more common in Python, so I found this tutorial on implementing a simple audio recognizer in JavaScript especially exciting!! &lt;/p&gt;

&lt;p&gt;As I said, I was &lt;em&gt;inspired&lt;/em&gt; by examples of using AI to diagnose COVID, but I am nowhere near being able to do that in any meaningful way, so I really just wanted to implement the most basic possible use of AI in my app to show that I could. I was able to "train" the TensorFlow model by coughing with my microphone on for a few seconds, and there you go, a sliding bar would move to the right if I was trying to record a cough, and to the left if I was trying to record anything other than a cough (i.e. regular talking). &lt;/p&gt;

&lt;p&gt;I really did nothing impressive here - all the cool stuff is handled by TensorFlow and this excellent tutorial! The simple audio recognizer uses &lt;code&gt;Transfer learning&lt;/code&gt;, which "is a technique that shortcuts much of this by taking a piece of a model that has already been trained on a related task and reusing it in a new model" (straight from the old copy and paste here) but it's nice to know that so many of these seemingly complex AI technologies are actually just building on a ton of past work. So something relatively simple, like an image or audio recognizer, doesn't require as much re-training. This is why all I had to do to make my simple audio function the way I wanted was to "teach" it the sound of a cough. It already "knew" basic human speech pretty well, so then the distinction between that library and a new sound wasn't far off.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;INPUT_SHAPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;NUM_FRAMES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;toggleButtons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;oneHot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xsShape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;INPUT_SHAPE&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;flatten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="nx"&gt;xsShape&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

 &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;batchSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;callbacks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;onEpochEnd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;epoch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#console&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
           &lt;span class="s2"&gt;`Accuracy: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;% Epoch: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;epoch&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;});&lt;/span&gt;
 &lt;span class="nx"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
 &lt;span class="nf"&gt;toggleButtons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I thought, this could even be used just for a simple validation on an online symptom submission so the user knows if they are coughing enough into the microphone, and/or prevents the user from submitting useless audio. While small, these are all things that can make the process of doctors remotely diagnosing and treating patients even just a little bit easier, which is very exciting to me!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo5ewivr2gupw7pwxrlsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo5ewivr2gupw7pwxrlsw.png" alt="Alt Text"&gt;&lt;/a&gt;Image credit: &lt;a href="https://www.instagram.com/p/B9D1r4HAZap/?igshid=1j7blknevdbaz" rel="noopener noreferrer"&gt;@pure.python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This isn't a tutorial, and I don't have any unique insights on using TensorFlow (yet!) but there seem to be a ton of amazing tutorials and it really was easier than I expected to use TensorFlow in this simple way. If you, like me, are interested in AI/ML but haven't had time to do that Coursera course in full yet and are feeling overwhelmed, my advice is to just go for it and see what you can do!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs99x6k1aypkknr7ps4kx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs99x6k1aypkknr7ps4kx.png" alt="Alt Text"&gt;&lt;/a&gt;Cover image credit: &lt;a href="https://www.instagram.com/p/B86VG2BAIUU/?igshid=1wxurxx33v9u8" rel="noopener noreferrer"&gt;@coderhumor&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;p&gt;*&lt;a href="https://devpost.com/software/faco-fight-against-corona-jfcza9" rel="noopener noreferrer"&gt;https://devpost.com/software/faco-fight-against-corona-jfcza9&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://devpost.com/software/corona-mask-detector" rel="noopener noreferrer"&gt;https://devpost.com/software/corona-mask-detector&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7187882/" rel="noopener noreferrer"&gt;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7187882/&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://venturebeat.com/2020/03/03/how-people-are-using-ai-to-detect-and-fight-the-coronavirus/" rel="noopener noreferrer"&gt;https://venturebeat.com/2020/03/03/how-people-are-using-ai-to-detect-and-fight-the-coronavirus/&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://www.scmp.com/tech/article/3077964/ring-smart-doorbell-monitors-people-covid-19-isolation" rel="noopener noreferrer"&gt;https://www.scmp.com/tech/article/3077964/ring-smart-doorbell-monitors-people-covid-19-isolation&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://www.bbc.com/news/technology-52340651" rel="noopener noreferrer"&gt;https://www.bbc.com/news/technology-52340651&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://techcrunch.com/2020/04/16/chinese-startup-rokid-pitches-covid-19-detection-glasses-in-u-s/" rel="noopener noreferrer"&gt;https://techcrunch.com/2020/04/16/chinese-startup-rokid-pitches-covid-19-detection-glasses-in-u-s/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>machinelearning</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Mapbox and Tool Tips in React.js</title>
      <dc:creator>Sylvia Pap</dc:creator>
      <pubDate>Fri, 10 Apr 2020 20:29:39 +0000</pubDate>
      <link>https://dev.to/sylviapap/mapbox-and-tool-tips-in-react-30ie</link>
      <guid>https://dev.to/sylviapap/mapbox-and-tool-tips-in-react-30ie</guid>
      <description>&lt;p&gt;While perusing popular posts, I was inspired by this &lt;a href="https://dev.to/alemesa/how-to-create-a-covid-19-map-with-mapbox-and-react-3jgf"&gt;COVID-19 map&lt;/a&gt; to get into learning Mapbox. The &lt;a href="https://github.com/alemesa/mapbox-covid19" rel="noopener noreferrer"&gt;project&lt;/a&gt; covers a lot of what I do here and I hope I'm not coming off trying to steal anyone's thunder. This isn't a post about my creativity. I am a beginner/bootcamp student and felt like I could even further simplify the process of just using Mapbox at all, let alone connecting it to interesting COVID data and formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Setup of Mapbox
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.mapbox.com/mapbox-gl-js/api/" rel="noopener noreferrer"&gt;Mapbox&lt;/a&gt; GL JS is a JavaScript library that uses WebGL to render interactive maps from vector tiles and Mapbox styles. This &lt;a href="https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; on basic setup in React is very good and helpful! This post will mostly walk through/combine several already very good tutorials. Once again, not trying to reinvent the wheel here, but hoping to combine some good existing wheels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/XDdfmJosb0ojKrrG4g/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/XDdfmJosb0ojKrrG4g/giphy.gif" alt="Alt text"&gt;&lt;/a&gt;End goal!&lt;/p&gt;

&lt;p&gt;Basic React setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app your-app-name
cd your-app-name
npm install mapbox-gl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or add &lt;code&gt;mapbox-gl&lt;/code&gt; to &lt;code&gt;package.json&lt;/code&gt; manually and then run &lt;code&gt;npm install&lt;/code&gt;. Both seem to accomplish the same thing - creating &lt;code&gt;package-lock.json&lt;/code&gt; and having a &lt;code&gt;package.json&lt;/code&gt; that contains &lt;code&gt;mapbox-gl&lt;/code&gt; in &lt;code&gt;dependencies&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now this is probably a trivial difference, but the Mapbox tutorial includes everything in &lt;code&gt;index.js&lt;/code&gt;, I've been learning React with keeping &lt;code&gt;index.js&lt;/code&gt; short - like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/index.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then keeping most of my code in &lt;code&gt;App.js&lt;/code&gt; for now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mapboxgl&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mapbox-gl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;mapboxgl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_MAPBOX_ACCESS_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;};}&lt;/span&gt;

  &lt;span class="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mapboxgl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mapContainer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mapbox://styles/mapbox/streets-v11&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zoom&lt;/span&gt;
    &lt;span class="p"&gt;});}&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mapContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mapContainer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;)}}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;and now we have a basic Mapbox! For the access token, you simply sign up for a free and easy account on Mapbox, and then, small side note that isn't super important since it's unlikely anyone would want to steal your free token, but good practice to use &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;.gitignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// in project main directory
touch .env

// .env
REACT_APP_MAPBOX_ACCESS_TOKEN=&amp;lt;mytoken&amp;gt;

// App.js
mapboxgl.accessToken = process.env.REACT_APP_MAPBOX_ACCESS_TOKEN;

// .gitignore
.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fun note of caution! ⚠️ If you get the error &lt;code&gt;Invalid LngLat latitude value: must be between -90 and 90&lt;/code&gt; - you probably have your longitude and latitude mixed up! If you only knew how many things I tried to fix this without just simply googling the error because I didn't think I could be making such a simple mix up...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqcxkmt9qikf2z4ayg1fo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqcxkmt9qikf2z4ayg1fo.jpg" alt="Alt Text"&gt;&lt;/a&gt;Longitude boi&lt;/p&gt;

&lt;p&gt;Anyway, at this point I have my coords set to SF. You can mess around with console.logs and the React dev tools for state to experiment with different starting coords and zoom.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;37.7524&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.4343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;11.43&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still following the Mapbox tutorial - here is how you add a bar that shows your coordinates and zoom as you move around the map.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// added to existing componentDidMount() function &lt;/span&gt;

&lt;span class="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;move&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCenter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCenter&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getZoom&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and in &lt;code&gt;render()&lt;/code&gt;, add the follow &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; just under &lt;code&gt;&amp;lt;div className="App"&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;// added to existing render() 
...
   &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;className=&lt;/span&gt;&lt;span class="s"&gt;"App"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;className=&lt;/span&gt;&lt;span class="s"&gt;"sidebarStyle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        Longitude: {this.state.lng} | Latitude: {this.state.lat} | Zoom: {this.state.zoom}
     &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point you should also have something like this in &lt;code&gt;src/App.css&lt;/code&gt;. Note if something isn't working but you aren't getting any errors, it might be a CSS issue - a lot of this involves styling from Mapbox.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.mapContainer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.sidebarStyle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#404040&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A small tangent I found interesting but easy to look up - if you want to change the icon that appears in the browser tab next to title, save an image to your public folder, and add to &lt;code&gt;index.html&lt;/code&gt; where the default icon link is already set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"%PUBLIC_URL%/map.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and just change the portion after &lt;code&gt;%PUBLIC_URL%/&lt;/code&gt;. I had saved mine as 'map.png' as you can see here.&lt;/p&gt;

&lt;p&gt;This is where the Mapbox tutorial pretty much ends, and then links to examples on how to expand. As with everything in programming, there are so many good options! And different ways of doing every one of those options. For some reason, tool tips stood out to me. I didn't even know 'tool tips' was the official term for these little hover popups until now.&lt;/p&gt;

&lt;p&gt;I had also come across this great blog &lt;a href="https://dev.to/lindelof/6-very-useful-react-component-libraries-g41"&gt;post&lt;/a&gt; on React component libraries, and was interested in using &lt;code&gt;react-portal-tooltip&lt;/code&gt;. But, I found the Mapbox official example on tooltips a bit easier to follow directly after this setup. &lt;code&gt;react-portal-tooltip&lt;/code&gt; is more general, and useful for all sorts of apps, which is great, but it helped me to start with the Mapbox specific example to learn what was going on here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooltips
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://en.wikipedia.org/wiki/Tooltip" rel="noopener noreferrer"&gt;tooltip&lt;/a&gt; (or &lt;code&gt;infotip&lt;/code&gt;, or  &lt;code&gt;hint&lt;/code&gt;) is a common graphical user interface element — a small "hover box" with information about the item. Again, pretty basic stuff, but I am a coding bootcamp student, and we just finished vanilla JS/started React, so this seemed like a cool thing that would have been harder without React! I always like to think of a clear example in my mind of why I am learning something, instead of just accepting it because it's a buzzword. Anyway!&lt;/p&gt;

&lt;p&gt;This is the &lt;a href="https://github.com/mapbox/mapbox-react-examples/tree/master/react-tooltip" rel="noopener noreferrer"&gt;repo&lt;/a&gt; for the Mapbox specific tooltip example that I'm starting with.&lt;/p&gt;

&lt;p&gt;First, create a &lt;code&gt;components&lt;/code&gt; directory within &lt;code&gt;src&lt;/code&gt; and a &lt;code&gt;ToolTipBox.js&lt;/code&gt; &lt;code&gt;Component&lt;/code&gt; (or you could name it anything you want, something shorter like just &lt;code&gt;ToolTip.js&lt;/code&gt;, but if I end up using a tooltip library later, that could be not specific enough). Import the component, as well as &lt;code&gt;ReactDOM&lt;/code&gt; which we now need in &lt;code&gt;App.js&lt;/code&gt;, and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ToolTipBox&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/ToolTipBox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;mapRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRef&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
 &lt;span class="nx"&gt;tooltipContainer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

 &lt;span class="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// Container to put generated content in&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tooltipContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mapboxgl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
     &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mapRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;
 &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tooltip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mapboxgl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Marker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tooltipContainer&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;setLngLat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;addTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

   &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mousemove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queryRenderedFeatures&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="nx"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLngLat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lngLat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCanvas&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pointer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mapRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;absolute top right left bottom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;}&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice in &lt;code&gt;map.on('mousemove')&lt;/code&gt; I have &lt;code&gt;this.setTooltip(features)&lt;/code&gt;. I define this outside of &lt;code&gt;componentDidMount()&lt;/code&gt; and it connects to my &lt;code&gt;ToolTipBox&lt;/code&gt; component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
 &lt;span class="nf"&gt;setTooltip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
         &lt;span class="nx"&gt;ToolTipBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="nx"&gt;features&lt;/span&gt;
         &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tooltipContainer&lt;/span&gt;
     &lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unmountComponentAtNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tooltipContainer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important things used here - &lt;a href="https://reactjs.org/docs/react-api.html#reactcreateref" rel="noopener noreferrer"&gt;&lt;code&gt;React.createRef()&lt;/code&gt;&lt;/a&gt;, which is good for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Managing focus, text selection, or media playback.&lt;br&gt;
Triggering imperative animations.&lt;br&gt;
Integrating with third-party DOM libraries.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But should be avoided for anything that can be done declaratively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.mapbox.com/mapbox-gl-js/api/#map#queryrenderedfeatures" rel="noopener noreferrer"&gt;&lt;code&gt;queryRenderedFeatures&lt;/code&gt;&lt;/a&gt; comes from the Mapbox API and is how we get the 'features' that will gives us the tooltips/popups info!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/docs/react-api.html#createelement" rel="noopener noreferrer"&gt;&lt;code&gt;React.createElement()&lt;/code&gt;&lt;/a&gt; - this doesn't seem common/standard and would usually be done with JSX. The React docs recommend using JSX and not &lt;code&gt;React.createElement()&lt;/code&gt;, but it seems fine here.&lt;/p&gt;

&lt;p&gt;Now more on the &lt;code&gt;ToolTipBox&lt;/code&gt; component, which uses &lt;a href="https://reactjs.org/docs/typechecking-with-proptypes.html" rel="noopener noreferrer"&gt;&lt;code&gt;Static PropTypes&lt;/code&gt;&lt;/a&gt; to validate that the 'features' returned from &lt;code&gt;queryRenderedFeatures&lt;/code&gt; is an array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/components/ToolTipBox.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prop-types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Tooltip&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

 &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;propTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;
 &lt;span class="p"&gt;};&lt;/span&gt;

 &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;renderFeature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;strong&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mr3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;source-layer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]}:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/strong&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;color-gray-light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex-parent-inline absolute bottom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex-child&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;renderFeature&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There's a lot going on with CSS here, and you'll notice the actual example I am copying from had more styling, but I removed it and added some to my own &lt;code&gt;App.css&lt;/code&gt; for simplicity of code blocks here. Here's what I added to my CSS after this step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.flex-parent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.flex-child&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty simple, just enough styling to see a basic box show up. Not that aesthetic, but I can come back to that later, and so you can you!&lt;/p&gt;

&lt;p&gt;Either way, though, unless you want to completely define all your own CSS, which I did not, you should probably have your &lt;code&gt;index.html&lt;/code&gt; looking like the example as well, as they import stylesheets here from mapbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"%PUBLIC_URL%/map.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"theme-color"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"#000000"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
     &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt;
     &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Web site created using create-react-app"&lt;/span&gt;
   &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"manifest"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"%PUBLIC_URL%/manifest.json"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'https://api.mapbox.com/mapbox-assembly/mbx/v0.18.0/assembly.min.css'&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;'stylesheet'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'https://api.tiles.mapbox.com/mapbox-gl-js/v0.39.1/mapbox-gl.css'&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;'stylesheet'&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;MapBox React Example&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://api.mapbox.com/mapbox-assembly/mbx/v0.18.0/assembly.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  React Tooltip Library
&lt;/h2&gt;

&lt;p&gt;This post is already a little long so I won't actually go into &lt;code&gt;react-portal-tooltip&lt;/code&gt;. But one very annoying thing I overcame while exploring it and thought worth sharing - if you get this guy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb91a2kk12uwsvwkvqqx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb91a2kk12uwsvwkvqqx7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fti4f1okjrx9xsgp57i0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fti4f1okjrx9xsgp57i0d.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdwp9z6r5yc607mlzua6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdwp9z6r5yc607mlzua6l.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff1iwtmzenk5bp6k7vn9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff1iwtmzenk5bp6k7vn9l.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many solutions on StackOverflow. This one worked for me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch src/declare_modules.d.ts

// in declare_modules.d.ts
declare module "react-portal-tooltip";

// if it still doesn't work, add import in `App.js`
// App.js
...
import './declare_modules.d.ts'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2puv8k6ydutphs4zcesj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2puv8k6ydutphs4zcesj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.mapbox.com/mapbox-gl-js/api/" rel="noopener noreferrer"&gt;Mapbox API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/" rel="noopener noreferrer"&gt;Mapbox React Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mapbox/mapbox-react-examples" rel="noopener noreferrer"&gt;Mapbox React Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alemesa/mapbox-covid19" rel="noopener noreferrer"&gt;COVID-19 Mapbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/romainberger/react-portal-tooltip" rel="noopener noreferrer"&gt;React Tooltip Component Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sylviapap/map-example-react" rel="noopener noreferrer"&gt;My repo for this example&lt;/a&gt; :)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
  </channel>
</rss>
