<?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: Henry Quinn</title>
    <description>The latest articles on DEV Community by Henry Quinn (@quinncuatro).</description>
    <link>https://dev.to/quinncuatro</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%2F185431%2Fcb607d17-27cd-4f88-9fe3-f628d54b58e8.PNG</url>
      <title>DEV Community: Henry Quinn</title>
      <link>https://dev.to/quinncuatro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quinncuatro"/>
    <language>en</language>
    <item>
      <title>How A Free Web3 Project Is Helping Me Build a Locally Focused DAO On Solana</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Thu, 02 Dec 2021 13:47:41 +0000</pubDate>
      <link>https://dev.to/quinncuatro/how-a-free-web3-project-is-helping-me-build-a-locally-focused-dao-on-solana-145f</link>
      <guid>https://dev.to/quinncuatro/how-a-free-web3-project-is-helping-me-build-a-locally-focused-dao-on-solana-145f</guid>
      <description>&lt;p&gt;Back in 2017, I (and I imagine a LOT of other people on DEV.to) got really into cryptocurrencies. I made some beer money off Ethereum, followed some projects, and really dug into the kind of experiences blockchain technology was able to power.&lt;/p&gt;

&lt;p&gt;Everyone I talked to seemed understandably smitten with the concept of decentralized finance, but I was trying to cut through the noise of all the day trading in an attempt to find where actual bedrock innovation was being made.&lt;/p&gt;

&lt;p&gt;I sifted through a lot of altcoins and vaporware to find projects like &lt;a href="https://www.golem.network/" rel="noopener noreferrer"&gt;Golem&lt;/a&gt; (a way for folks to rent spare computing cycles to artists who need to render their work), &lt;a href="https://www.iota.org/" rel="noopener noreferrer"&gt;IOTA&lt;/a&gt; (a network built to handle IoT transactions), and &lt;a href="https://request.network/en/" rel="noopener noreferrer"&gt;Request Network&lt;/a&gt; (a suite of financial tools for crypto payments). These were teams that bucked the trend of trying to make a boatload of money and instead were actually trying to change the way that we interact with the Internet. Something about these teams of people in the middle of one of the craziest bull runs of history saying "screw the quick money, what we're working on is IMPORTANT" really stuck with me.&lt;/p&gt;

&lt;p&gt;Then the bubble burst, the hype died down, and I yanked out most of my (meager) investments. I kept a loose eye on the space just to keep up to speed over the years but was hesitant to get involved again.&lt;/p&gt;

&lt;p&gt;But somewhere around the beginning of this year, I started looking into decentralization technology that wasn't necessarily on a blockchain, as I didn't love the ecological impact of networks like Ethereum. That led to me spending time digging into &lt;a href="https://ipfs.io/" rel="noopener noreferrer"&gt;IPFS&lt;/a&gt; and getting closer with &lt;a href="https://twitter.com/jake_burden_/" rel="noopener noreferrer"&gt;Jake&lt;/a&gt; from my local tech Slack who's really into &lt;a href="https://solana.com/" rel="noopener noreferrer"&gt;Solana&lt;/a&gt; - a blockchain that's fast, cheap, and not burning down the rainforests.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Once I really understood what Solana could do, it felt like a switch got flipped in me.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's about when I caught a tweet from &lt;a href="https://twitter.com/dabit3/" rel="noopener noreferrer"&gt;Nader Dabit&lt;/a&gt; about &lt;a href="https://www.developerdao.com/" rel="noopener noreferrer"&gt;Developer DAO&lt;/a&gt;, saw that I had enough ETH left in an old wallet to cover the transaction fee, and just yolo'd it. I bought my first NFT and simultaneously joined my first decentralized autonomous organization (DAO).&lt;/p&gt;

&lt;p&gt;The first few days of being part of a DAO filled with people just like me were wild. Everyone in the Discord was trying to learn everything they could from each other about web3 technologies, work on their own separate projects, and then dump all that knowledge and energy back into the group. The value wasn't in a cryptocurrency attached to the project, it was in the community itself. That was like a breath of fresh air.&lt;/p&gt;

&lt;p&gt;I love helping run my local tech group but there's a certain freedom in how a DAO allows everyone to make decisions and collectively help shape the future of the thing. Every little proposed change doesn't have to route through a small team of admins. People can contribute development work, documentation, insights, or anything... whenever they have the time. And if something in the DAO needs to change everyone can discuss their viewpoints and vote on a proposal. It turns an online community into a sort of living organism rather than a top-down hierarchy where an organizing team gets to call the shots.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Ultimately, my point is that helping the group comes back to helping yourself.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;I distinctly remember sitting back and thinking of my crypto journey around 2017 when I was looking through projects trying to find innovative web experiences powered by blockchain technologies that just didn't make sense using web2 technologies at the time. In 2021, amidst all of the NFT sales going on, I really and truly feel that this new community-owned organization model is the killer app.&lt;/p&gt;

&lt;p&gt;Jake pointed me towards some more projects on Solana (surprise!) that shared that same sense of community. I ended up finding groups that welcomed me with open arms and immediately made me feel like one of their own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.niftynanas.com/" rel="noopener noreferrer"&gt;Nifty Nanas&lt;/a&gt;: This one is arguably where I spend most of my time on Discord. It's a community of wonderfully positive people who want to help support other projects in the Solana ecosystem. They do a lot of giveaways, game nights, and Twitter Spaces (with other web3 projects) and it feels like a real group of friends. Plus the NFT art is rad - just &lt;em&gt;look&lt;/em&gt; at my profile picture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://wgmi.cc/" rel="noopener noreferrer"&gt;WGMI NFT Collector's Club&lt;/a&gt;: A rad group of people doing a series of community art projects where holders of their WGMI token get airdrops throughout the year of NFTs that are part of interactive experiences. On day one of me being involved, I got to hop on a call and help brainstorm ideas for a future airdrop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://techfolk.io/" rel="noopener noreferrer"&gt;Tech Folk&lt;/a&gt;: A team who's working on an NFT game based around working together to build startups, upskill "employees", and vying for investors. They've been nothing but helpful in answering peoples' questions, including my own, about web3 development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.hoodieznft.net/" rel="noopener noreferrer"&gt;Hoodiez NFT&lt;/a&gt;: Just a bunch of people hanging out and using NFTs to raise money for both homeless and mental health-focused charities. This is actually the first project where I got to be involved in the initial mint and it's been fun watching the community grow. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;About two weeks ago, I remembered &lt;a href="https://twitter.com/jake_burden_/status/1455549038527406084" rel="noopener noreferrer"&gt;one of Jake's tweets&lt;/a&gt; from earlier in the month:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmq0p17rs963wobpq16z.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmq0p17rs963wobpq16z.PNG" title="ct3_dao Genesis Tweet" alt="A tweet from Jake Burden about the idea of a Connecticut based web3 community." width="602" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been wanting to find a way to get more involved in the crypto community and this seemed like the perfect opportunity. I have a few years of running a locally-focused tech community under my belt, and to be quite honest - the members there were getting fed up with the few of us talking about blockchain stuff. Jake had been joking for a while about "wen [local tech group] DAO," and I figured it was time to make it happen.&lt;/p&gt;

&lt;p&gt;So after letting him know I wanted to make it real, we (and our friend &lt;a href="https://twitter.com/Rory_Chillmore" rel="noopener noreferrer"&gt;Rory&lt;/a&gt;) jumped feet first into building it.&lt;/p&gt;

&lt;p&gt;We fleshed out a Discord server, set up a &lt;a href="https://twitter.com/ct3_dao" rel="noopener noreferrer"&gt;Twitter account&lt;/a&gt;, and built a &lt;a href="https://ct3dao.io" rel="noopener noreferrer"&gt;rad website&lt;/a&gt;. We were in the process of talking behind the scenes about what direction we wanted to nudge this new community in before we started inviting people in when I discovered &lt;a href="https://twitter.com/_buildspace" rel="noopener noreferrer"&gt;buildspace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Up to that point, I had been learning bits and pieces of existing projects I could pull together from the Solana ecosystem. But having buildspace provide a built-in community of developers working on similar project prompts allowed me to get my hands dirty with the real thing.&lt;/p&gt;

&lt;p&gt;Bear in mind, we're still going to use tools like &lt;a href="https://grapes.network/" rel="noopener noreferrer"&gt;Grape&lt;/a&gt; (for account/wallet verification on our Discord) and &lt;a href="https://sqds.io/" rel="noopener noreferrer"&gt;Squads&lt;/a&gt; (to handle on-chain voting). But I was low-key dreading having to roll my sleeves up and get dirty with the code to learn how any of it worked under the hood.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  If you've ever tried building with a new technology, you know the documentation isn't the best if it's even there at all.
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the vibe I've gotten from most of my forays into dApp development over the years: things are going to be messy and you're going to have to solve your own problems. Not a big deal. That's actually a great way to learn and make all those new concepts stick, but it's not the most attractive first experience with a tool.&lt;/p&gt;

&lt;p&gt;The "Build a Web3 App on Solana with React and Rust" project really helped me understand how the websites I've been using actually interacted with both my wallet and the Solana blockchain. I was able to get a &lt;a href="https://vercel.com/quinncuatro/gif-portal-starter/EmMEpi2xpLL5YDyTXnuif1GXR6yu" rel="noopener noreferrer"&gt;dApp for collecting rock climbing gifs&lt;/a&gt; that uses Phantom for authentication deployed to Solana's devnet within 24 hours of starting the project.&lt;/p&gt;

&lt;p&gt;I know the community management piece required to get a group like ct3_dao off the ground, but I'm helping build a community to help people learn web3 development partly because I want to learn how to code for web3 projects. And buildspace really comes in clutch there.&lt;/p&gt;

&lt;h2&gt;
  
  
  BUT Y'ALL. THEN THEY DID IT AGAIN.
&lt;/h2&gt;

&lt;p&gt;Right when we were starting to talk about how we wanted to handle minting (free) tokens to let people &lt;em&gt;officially&lt;/em&gt; be part of the community (and power the on-chain voting with Squads), I realized I was less than a week out from another buildspace project called "Ship your own custom NFT collection on Solana w/ Metaplex in a weekend".&lt;/p&gt;

&lt;p&gt;Through my discussions with folks in Nifty Nanas and WGMI, I knew that Metaplex and Candy Machine were the right move for what we needed (especially considering we wanted to do as much of this on Solana as possible). This buildspace project truly could not have come at a better time.&lt;/p&gt;

&lt;p&gt;I like &lt;em&gt;presently&lt;/em&gt; have a need to learn how to do use these tools so that I could help build a project that's going to help people in my local community learn how to build for the new web. Buildspace was ready and waiting with content to walk me through a tutorial on how to do that exact thing.&lt;/p&gt;

&lt;p&gt;I've seen people talking on Twitter about how they were able to apply what they learned in various buildspace courses to projects they ended up co-founding, but that's quickly becoming my reality. Imagine my surprise when they announced this week that they have another two projects coming up titled "Build your own DAO with just JavaScript in a weekend" and "Ship your own DeFi dApp on Avalanche in a weekend".&lt;/p&gt;

&lt;p&gt;Again, we're going to be utilizing Squads to power our DAO but I've never been burnt by learning what's going on under the hood of the tools I use, especially for adding custom additions later. And that Avalanche project is going to be helpful when I carve out time to work on a web3 iteration of my &lt;a href="https://techenthusiastscholarship.com/" rel="noopener noreferrer"&gt;Tech Enthusiast Scholarship&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjsk4m76ikn4ybweom05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjsk4m76ikn4ybweom05.png" title="ct3_dao Website Screenshot" alt="A screenshot of the ct3 DAO website." width="412" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ultimately, we were able to soft launch the website and finalize the Discord this past Sunday night. While writing this article on Wednesday, we're already up to 40 local members talking about helpful tools they find online, different projects they want to hack on, and figuring out how we can collaborate with other organizations to help more Connecticut developers make the jump to web3.&lt;/p&gt;

&lt;p&gt;We've already made connections with local Makerspaces in &lt;a href="https://makerspacect.com/home/" rel="noopener noreferrer"&gt;Hartford&lt;/a&gt; &amp;amp; &lt;a href="https://www.sparkmakerspace.org/" rel="noopener noreferrer"&gt;New London&lt;/a&gt;, set up a time to record a podcast episode with &lt;a href="https://ctstartup.com/" rel="noopener noreferrer"&gt;CTStartup&lt;/a&gt;, and are tentatively planning our first IRL meetup at &lt;a href="https://www.districtnhv.com/" rel="noopener noreferrer"&gt;District&lt;/a&gt; in New Haven.&lt;/p&gt;

&lt;p&gt;Jake and I had joked for a &lt;em&gt;while&lt;/em&gt; about making a DAO to experiment with what a locally-focused community-owned organization might evolve into. But it took a handful of things lining up just right to make it happen. Buildspace having content ready to teach me (and so many others) about Solana development with Anchor, NFT creation and minting with Metaplex, and about the general underpinnings of a DAO structure... all over the course of three weekends (albeit spread out a bit) really helps give me the knowledge and confidence I need to get this project over the finish line.&lt;/p&gt;

&lt;p&gt;I definitely could have ground through learning all of this on my own, but &lt;em&gt;dang&lt;/em&gt; if buildspace isn't the exact antithesis to my earlier point about documentation being rocky at best for new technologies. They really pushed me in the right direction to help turn a hopeful joke into a real-life community that's already helping people learn.&lt;/p&gt;




&lt;p&gt;Me, Jake, Rory, and the rest of the ct3 community are just getting started with ct3_dao, and I can't wait to fill you all in with more technical posts about how we end up implementing everything we want to build.&lt;/p&gt;

&lt;p&gt;Until then, stay frosty.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://henryneeds.coffee/blog/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blockchain</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>HenryGivesCoffee: Micro-Scholarships for Rad. Web. Stuff.</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Mon, 05 Apr 2021 17:55:13 +0000</pubDate>
      <link>https://dev.to/quinncuatro/henrygivescoffee-micro-scholarships-for-rad-web-stuff-40i8</link>
      <guid>https://dev.to/quinncuatro/henrygivescoffee-micro-scholarships-for-rad-web-stuff-40i8</guid>
      <description>&lt;p&gt;This is a blog post from the launch of my new side project &lt;a href="https://henrygives.coffee" rel="noopener noreferrer"&gt;Henry Gives Coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The short version is that I love this new boom we're seeing of folks building personal "non-corporate-y" corners of the web for themselves and I want to encourage fledgling developers to keep building!&lt;/p&gt;

&lt;p&gt;Are you working on something rad? Let me throw you some coffee money!&lt;/p&gt;

&lt;p&gt;This month's theme is "Web Projects for Local Communities." So if you (or anyone you know) is working on anything even vaguely under that umbrella, head on over to the website to tell me about it! Might just be a free coffee in it for you!&lt;/p&gt;




&lt;h2&gt;
  
  
  The web is astoundingly more interesting when people are building rad shit.
&lt;/h2&gt;

&lt;p&gt;I was born in 1992, had access to a computer since the age of four, and experienced firsthand the emergence of web 2.0.&lt;/p&gt;

&lt;p&gt;The internet seemed like a modern miracle. Plenty of folks have written about how the "early web" was like the Wild West where anything can happen. A free exchange of ideas, information, and art.&lt;/p&gt;

&lt;p&gt;In all seriousness, though, that's what it was.&lt;/p&gt;

&lt;p&gt;When I was seven years old, from the back of our living room, I was able to apply online for an audition for (and eventually act in) a traveling musical that would go on to have a few mentions in the &lt;a href="https://www.nytimes.com/2003/05/11/nyregion/jersey-children-let-them-entertain-you.html" rel="noopener noreferrer"&gt;New&lt;/a&gt; &lt;a href="https://www.nytimes.com/2001/12/21/arts/family-fare.html" rel="noopener noreferrer"&gt;York&lt;/a&gt; &lt;a href="https://www.nytimes.com/2007/01/05/arts/05kids.html" rel="noopener noreferrer"&gt;Times&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When I was fourteen, after moving every couple of years for most of my childhood, I was able to use social networks like Facebook to get back in touch with every best friend I've had since pre-school. And let me tell you, connecting those dots was a REALLY fun road trip.&lt;/p&gt;

&lt;p&gt;When I was twenty-one, I started learning modern web development in earnest. I wanted to start contributing towards building the amazing internet that I'd always taken for granted. Between free time at work and attending a local web dev bootcamp, I was able to build &lt;a href="https://crashthebot.net/fantasy/public_html/" rel="noopener noreferrer"&gt;all&lt;/a&gt; &lt;a href="https://crashthebot.net/hotonesdraftchallenge/" rel="noopener noreferrer"&gt;kinds&lt;/a&gt; &lt;a href="https://desolate-harbor-88855.herokuapp.com/" rel="noopener noreferrer"&gt;of&lt;/a&gt; &lt;a href="https://crashthebot.net/droves/" rel="noopener noreferrer"&gt;fun&lt;/a&gt; &lt;a href="https://crashthebot.net/MacDaddy/ChallengeOne/" rel="noopener noreferrer"&gt;stuff&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now, at twenty-eight, the web is starting to feel REALLY stale.&lt;/p&gt;

&lt;p&gt;The web I grew up with was full of personalized spaces that people built to share something they were passionate about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some developers built games for everyone to play.&lt;/li&gt;
&lt;li&gt;Enthusiasts created static sites to share information about their hobbies.&lt;/li&gt;
&lt;li&gt;Others just wanted to share what was going on in their lives, before &lt;a href="https://stackingthebricks.com/how-blogs-broke-the-web/" rel="noopener noreferrer"&gt;Movable Type commoditized the idea of a blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;And honestly, there was seemingly no end to what folks wanted to share.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It really feels like (&lt;a href="https://www.alexa.com/topsites/countries/US" rel="noopener noreferrer"&gt;and data from Alexa backs this up&lt;/a&gt;), the content part of the internet (at least in the US) is mostly a conglomeration of Google, YouTube, Yahoo, Facebook, Reddit, Wikipedia, Netflix, and Instagram.&lt;/p&gt;

&lt;p&gt;There's a lot of good content there, but it's from a lot of incredible creators on a small handful of platforms that incentivize (intentionally or not) a homogenization of content to please "the algorithm." It often seems like folks can't really be themselves when they're needing to bend their creative processes to match what garners better metrics through the lens of a machine learning backed recommendation engine.&lt;/p&gt;

&lt;p&gt;Counterpoint, though: the recent rise in popularity of static site generators and easy hosting platforms seems to be creating a new boom in people creating, owning, and populating their own personal spaces on the internet!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thesephist.com/" rel="noopener noreferrer"&gt;Blogs are back&lt;/a&gt;. Enthusiasts are &lt;a href="https://frontend.horse/" rel="noopener noreferrer"&gt;sharing information&lt;/a&gt; about their &lt;a href="https://wesbos.com/" rel="noopener noreferrer"&gt;favorite hobbies&lt;/a&gt;. Teachers are &lt;a href="https://woodworkingformeremortals.com/" rel="noopener noreferrer"&gt;releasing courses on their own platforms&lt;/a&gt;. Even &lt;a href="https://www.alexschmidty.com/" rel="noopener noreferrer"&gt;non-technical folks&lt;/a&gt; are getting in on the fun.&lt;/p&gt;

&lt;p&gt;The internet I grew up with is showing signs of life and seems to be crawling back to being fun and personal and weird.&lt;/p&gt;

&lt;p&gt;It's an incredible thing and I want to use the platform I have, however small, to do my part in encouraging this kind of growth to continue.&lt;/p&gt;

&lt;p&gt;We're in a period where all sorts of people are creating all manner of cool things on the web. &lt;/p&gt;

&lt;p&gt;Statistically, there have to be some really rad projects that aren't getting the kind of distribution and awareness they deserve.&lt;/p&gt;

&lt;p&gt;And on every project I've worked on, I've always come back to thinking "wouldn't it be rad if I could earn some beer money from this?".&lt;/p&gt;

&lt;p&gt;That's what Henry Gives Coffee is about.&lt;/p&gt;

&lt;p&gt;I want to highlight the incredible work that both newer and lesser-known web developers are doing. Hopefully throwing them some money for coffee (or beer) and signal boosting the cool projects they're working on lets them know that what they're contributing to the internet is worthwhile and motivates them to keep building.&lt;/p&gt;

&lt;p&gt;I've done okay for myself working on my little projects mostly in the shadows. Hopefully, whatever little nudges of encouragement I can provide will keep people building who might otherwise get frustrated with web development.&lt;/p&gt;

&lt;p&gt;And remember, the internet is fundamentally a way to connect all of us. It should be a lot more fun and a lot less corporate. I'm happy to be able to throw this project together and do my part but my hope is that at least one of you reading this might take away some action items and spread the "GivesCoffee" ethos of encouraging folks to both own and personalize their own corners of the web.&lt;/p&gt;




&lt;p&gt;I'm pumped to finally launch this project for real and see all of the incredible things y'all are working on.&lt;/p&gt;

&lt;p&gt;Hopefully, it's a wild ride.&lt;/p&gt;

&lt;p&gt;Stay frosty.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Website Update - Signal Boost Page</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Sun, 14 Feb 2021 01:07:36 +0000</pubDate>
      <link>https://dev.to/quinncuatro/website-update-signal-boost-page-8po</link>
      <guid>https://dev.to/quinncuatro/website-update-signal-boost-page-8po</guid>
      <description>&lt;h2&gt;
  
  
  I just finished giving HenryNeeds.Coffee its annual-ish refresh. I updated the menu bar, split up a lot of the homepage into separate content-specific pages, but my favorite addition is the new &lt;a href="https://henryneeds.coffee/signal-boost" rel="noopener noreferrer"&gt;Signal Boost&lt;/a&gt; page.
&lt;/h2&gt;




&lt;p&gt;When I was looking around for refresh inspiration, I came across &lt;a href="https://christine.website" rel="noopener noreferrer"&gt;Christine Dodrill's website&lt;/a&gt;. It has a similar terminal-ish design as mine but with way better colors for everything - which honestly is what I wanted to address with the refresh.&lt;/p&gt;

&lt;p&gt;But in looking through Christine's site, I found the Signal Boost page - designed to put a spotlight on other tech folks looking for work. After a year where a lot of people lost their jobs, I felt it was a better use of my time to set up a signal boost page of my own rather than making some colors look better.&lt;/p&gt;

&lt;p&gt;There are so many developers, engineers, ops folks, and all kinds of other tech workers trying to land a new gig right now. I'm lucky enough to still be working, so providing visibility to those who aren't is the least I can do with the small platform I have.&lt;/p&gt;

&lt;p&gt;I only got to where I am with the help of my friends and colleagues. This is something small I can do to pay that forward, and I encourage y'all to set up something similar.&lt;/p&gt;

&lt;p&gt;In that vein, I wanted to share how I threw this together so that you can, too.&lt;/p&gt;




&lt;p&gt;First off, this site's code is available in this &lt;a href="https://github.com/Quinncuatro/Henry-Personal-Website" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;, but I'll go into specifics about how this particular feature works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;HenryNeeds.Coffee&lt;/a&gt; was built using &lt;a href="https://www.gatsbyjs.com/" rel="noopener noreferrer"&gt;GatsbyJS&lt;/a&gt;, and it all sits on top of a hello-world base.&lt;/p&gt;

&lt;p&gt;In Gatsby sites, data has to come from somewhere, and I already had certain plugins (like &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-source-filesystem/" rel="noopener noreferrer"&gt;gatsby-source-filesystem&lt;/a&gt; and &lt;a href="https://www.gatsbyjs.com/plugins/gatsby-transformer-yaml/" rel="noopener noreferrer"&gt;gatsby-transformer-yaml&lt;/a&gt;) installed and my &lt;code&gt;./gatsby-config.js&lt;/code&gt; file configured to ingest yaml so that it can be queried with GraphQL.&lt;/p&gt;

&lt;p&gt;I had that part of Gatsby's content mesh set up to turn &lt;code&gt;./src/resume/resume.yaml&lt;/code&gt; into content for my &lt;code&gt;Resume&lt;/code&gt; and &lt;code&gt;Talks // Pods&lt;/code&gt; pages. I expanded that out to power my &lt;code&gt;Blog&lt;/code&gt; page with markdown files, and expanded it again to handle &lt;code&gt;Signal Boost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First off, though, I needed to make a new page so that &lt;code&gt;https://henryneeds.coffee/signal-boost&lt;/code&gt; would resolve to something:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Whole of ./src/pages/signal-boost.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="s2"&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;Layout&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../components/Layout&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;SignalBoostLogin&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../components/SignalBoostLogin&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="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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SignalBoostLogin&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Layout&lt;/span&gt;&lt;span class="p"&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;All this file does is import and render a component named &lt;code&gt;SignalBoostLogin&lt;/code&gt;. That component handles things like important the menu bar, doing some date math for the "Current login" header. But its main job is querying data provided by &lt;code&gt;./src/signalboost/signalboost.yaml&lt;/code&gt; (more on that later) and then iterating over those results to set up individual &lt;code&gt;SignalBoost&lt;/code&gt; components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Selection from ./src/components/SignalBoostLogin/index.js&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StaticQuery&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="s2"&gt;`
      query signalBoostQuery {
        allSignalboostYaml {
          edges {
            node {
              people {
                name
                tech
                github
                twitter
              }
            }
          }
        }
      }
    `&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SignalBoostPage&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the GraphQL query that pulls information defined in that &lt;code&gt;/.src/signalboost/signalboost.yaml&lt;/code&gt; file then renders the &lt;code&gt;SignalBoostPage&lt;/code&gt; component (in the same file) which ingests the GraphQL results as &lt;code&gt;data&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Selection from ./src/components/SignalBoostLogin/index.js&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="nx"&gt;allSignalboostYaml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;edges&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="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;people&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;person&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SignalBoost&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tech&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;github&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;twitter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&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;Like I said earlier, this page is just meant to grab the data provided by the yaml file, iterate over it, and generate individual &lt;code&gt;SignalBoost&lt;/code&gt; components for each entry via that &lt;code&gt;.map()&lt;/code&gt; method. The whole &lt;code&gt;name={person.name}&lt;/code&gt; bit passes all the individual data points from the GraphQL results as props that can be picked up and used by the child component (&lt;code&gt;SignalBoost&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Whole of ./src/components/SignalBoost/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="s2"&gt;react&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="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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tech&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;github&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"noopener noreferrer"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;[ GitHub ]&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;twitter&lt;/span&gt; &lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"noopener noreferrer"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;[ Twitter ]&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&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;And this (finally) is the template that takes those props, throws the values into the HTML, and renders out individual divs of name/tech/links on the final Signal Boost page.&lt;/p&gt;




&lt;p&gt;So to recap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The actual data gets updated in the &lt;code&gt;./src/signalboost/signalboost.yaml&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;The page served by the &lt;code&gt;https://henryneeds.coffee/signal-boost&lt;/code&gt; URL calls the &lt;code&gt;./src/components/SignalBoostLogin/&lt;/code&gt; component.&lt;/li&gt;
&lt;li&gt;That component queries the data provided by the &lt;code&gt;./src/signalboost/signalboost.yaml&lt;/code&gt; file, iterates over it, and calls multiple &lt;code&gt;./src/components/SignalBoost/&lt;/code&gt; components.&lt;/li&gt;
&lt;li&gt;Each of those components takes the data passed to it as props and renders out HTML for each person being signal boosted.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;So yaml like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ./src/signalboost/signalboost.yaml&lt;/span&gt;
&lt;span class="na"&gt;people&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;John&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Doe"&lt;/span&gt;
    &lt;span class="na"&gt;tech&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bash&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;devops&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;gatsby&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;javascript&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;kubernetes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;linux&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sql&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;web"&lt;/span&gt;
    &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://github.com/username"&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://twitter.com/username"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;John&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Doe&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;
    &lt;span class="na"&gt;tech&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pandas&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;golang"&lt;/span&gt;
    &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://github.com/username2"&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://twitter.com/username2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Will render this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftjhe7q2m6e61a2m8u9ut.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftjhe7q2m6e61a2m8u9ut.jpg" alt="Signal Boost YAML Render" width="556" height="272"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If anyone wants to add themself, all they need to do is follow the &lt;a href="https://github.com/Quinncuatro/Henry-Personal-Website/tree/master/src/signalboost" rel="noopener noreferrer"&gt;instructions here&lt;/a&gt;, edit the YAML file, and submit a pull request.&lt;/p&gt;

&lt;p&gt;Once I get the notification, check the formatting, and roll the change into my main branch: builds will automatically kick off on Netlify and Fleek to deploy the updated version.&lt;/p&gt;




&lt;p&gt;It took me a couple of days' worth of free cycles to figure this all out and get it working the way I like it, but the current version works great!&lt;/p&gt;

&lt;p&gt;So far I've had two folks submit PR's and it went off without a hitch. They submitted their PR, I hit the "Merge" button, and the builds kicked off all on their own.&lt;/p&gt;

&lt;p&gt;Building the feature was pretty painless given that I already had my site built on Gatsby's engine. However, adding something like this to a different static site generator or build process should be fairly easy once you understand the data flow.&lt;/p&gt;

&lt;p&gt;Lots of folks lost their jobs over the past year, and really what's the point of having a voice, site, blog, or whatever if we don't help others climb up behind us on the same ladders?&lt;/p&gt;

&lt;p&gt;Just something to chew on.&lt;/p&gt;

&lt;p&gt;Stay frosty.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt; (&lt;a href="https://dev.toipfs://bafybeid36rtd2rpjzhz7ll4foruef3vj3n3pbrev53wcwj6pj6q3u4ie7q/"&gt;IPFS Version&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; (&lt;a href="https://ipfs.fleek.co/ipfs/bafybeid36rtd2rpjzhz7ll4foruef3vj3n3pbrev53wcwj6pj6q3u4ie7q/blog" rel="noopener noreferrer"&gt;IPFS Version&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>discuss</category>
      <category>gatsby</category>
    </item>
    <item>
      <title>IPFS - The Decentralized Web Is Finally Here</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Fri, 29 Jan 2021 14:56:21 +0000</pubDate>
      <link>https://dev.to/quinncuatro/ipfs-the-decentralized-web-is-finally-here-3npk</link>
      <guid>https://dev.to/quinncuatro/ipfs-the-decentralized-web-is-finally-here-3npk</guid>
      <description>&lt;h2&gt;
  
  
  It's the spring of 2011. I've already been accepted to college. Senioritis is setting in and 3OH!3 is blaring on my headphones as I sit at my desk at 2 AM on a school night...
&lt;/h2&gt;

&lt;p&gt;Homework long since done, I'm staring at the screen of the heavily used 17" Gateway laptop I managed to get off my boss at The Computer Shack in place of actual payment.&lt;/p&gt;

&lt;p&gt;I'm trying to test a tool on a Windows XP partition so that I could confidently install it on my high school's network.&lt;/p&gt;

&lt;p&gt;I had already hidden a handful of games on a shared drive meant for our teachers' math and science tools.&lt;/p&gt;

&lt;p&gt;My friends and I had plenty there to keep us occupied at the end of long lab periods, but we wanted to be able to chat with each other while we fragged each other in Blood Gulch.&lt;/p&gt;

&lt;p&gt;And of course, phones weren't allowed.&lt;/p&gt;

&lt;p&gt;This tool would let us piggyback on (the since sunsetted) &lt;code&gt;net send&lt;/code&gt; command to effectively let us private message each other over the local network.&lt;/p&gt;

&lt;p&gt;Being the "nerd" of the group, it was my responsibility to get this set up. The IT guys may not have loved what I was getting up to, but we had an &lt;em&gt;understanding&lt;/em&gt;. I could bend the rules a bit as long as I let them know what parts of their security they needed to shore up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But this tool, though&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Someone wrote an entire chat application written on top of a network command, put it online &lt;strong&gt;for free&lt;/strong&gt;, and I had the ability (and unintended privileges) to do something rad with it and make the tail end of high school more exciting.&lt;/p&gt;




&lt;p&gt;I remember explicitly taking a moment to sit back to think about how god damned cool that was.&lt;/p&gt;




&lt;p&gt;Now, about 10 years later, I'm living that moment all over again.&lt;/p&gt;

&lt;p&gt;Work was done at 5:00 today. My girlfriend, tired from nursing school, is in bed. Dishes are... well, sitting in the sink dirty.&lt;/p&gt;

&lt;p&gt;I'm sitting at my computer: late at night, working on a project, and thinking about how lucky I am to be alive and a few years into my development career &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Last week, I stumbled onto a &lt;a href="https://www.theverge.com/2021/1/19/22238334/brave-browser-ipfs-peer-to-peer-decentralized-transfer-protocol-http-nodes" rel="noopener noreferrer"&gt;Verge article&lt;/a&gt; about a new (well, 5 years old) technology that's just starting to pick up steam, called &lt;a href="https://ipfs.io/" rel="noopener noreferrer"&gt;InterPlanetary File System&lt;/a&gt; (IPFS).&lt;/p&gt;

&lt;p&gt;Folks who came to this post from a Tweet or something probably know what I'm talking about. But for those who don't:&lt;/p&gt;

&lt;p&gt;Wikipedia defines IPFS as&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;...a protocol and peer-to-peer network for storing and sharing data in a distributed file system. IPFS uses content-addressing to uniquely identify each file in a global namespace connecting all computing devices.&lt;/p&gt;

&lt;p&gt;IPFS allows users to not only receive but host content, in a similar manner to BitTorrent. As opposed to a centrally located server, IPFS is built around a decentralized system of user-operators who hold a portion of the overall data, creating a resilient system of file storage and sharing. Any user in the network can serve a file by its content address, and other peers in the network can find and request that content from any node who has it using a distributed hash table (DHT).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Long story short, the future of the internet is here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A group of people worked for years to actually make the decentralized internet that Pied Piper was trying to make on the later seasons of &lt;a href="https://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)" rel="noopener noreferrer"&gt;Silicon Valley&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;They built an entirely new protocol for accessing the web. It's meant to work alongside (not replace) HTTPS and operates similarly to BitTorrent in that data (for websites, videos, games, apps, anything) is shared amongst peers and not fetched from central servers owned by Amazon or some other Evil Corp™.&lt;/p&gt;

&lt;p&gt;The ramifications here are HUGE.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Have you ever had a resource on the web disappear on you?
&lt;/h3&gt;

&lt;p&gt;That's a dumb question because so have I.&lt;/p&gt;

&lt;p&gt;There's this mashup called "Ketchup V1" from an artist named The Deaf DJ that I'd love to be able to find again.&lt;/p&gt;

&lt;p&gt;I'm sure you all have your own white whales.&lt;/p&gt;

&lt;p&gt;Content that we care about on Web 2.0 (the HTTPS based one we're on now) only sticks around if the people creating and hosting that content want to keep it available.&lt;/p&gt;

&lt;p&gt;If some publisher or individual decides they want to take a site down or stop paying for a monthly web server bill, then whatever information they were hosting effectively disappears.&lt;/p&gt;

&lt;p&gt;The internet is supposed to be the culmination of all human knowledge, but small and easy to host files (like sheet music or a set of woodworking instructions) could disappear because someone needs to reign in their budget.&lt;/p&gt;

&lt;p&gt;IPFS allows anyone to go "Hey, that blog post on how to code this feature was really helpful to me, I'd like to re-host it so that other people will always be able to find it later."&lt;/p&gt;

&lt;p&gt;The Brave browser, mentioned in that Verge article, implemented IPFS features that let me do that with two mouse clicks.&lt;/p&gt;

&lt;p&gt;That's a beautiful thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Speaking of resources disappearing, did you know that for a few years Turkey blocked their citizens from accessing Wikipedia?
&lt;/h3&gt;

&lt;p&gt;Again, the culmination of all human knowledge, but sequestered from citizens.&lt;/p&gt;

&lt;p&gt;Kind of fucked up, right? Especially when you know the importance of tools like social media sites during times like the Arab Spring. Being able to block entire portions of the web, like China's Great Firewall, is a dangerous precedent.&lt;/p&gt;

&lt;p&gt;Turkey was able to block Wikipedia because web addresses are currently based on file locations.&lt;/p&gt;

&lt;p&gt;You tell your browser to go all the way to the group of servers that the Wikimedia Foundation set up to host Wikipedia and then, once there, pull up the page on water filtration.&lt;/p&gt;

&lt;p&gt;Since Turkey could see where those web requests were pointing (the addresses assigned to Wikipedia servers), they were able to stop them from completing.&lt;/p&gt;

&lt;p&gt;Since everything on IPFS is content-addressed (via a hash), whenever you request a page, your browser pulls it from whoever happens to be closest to you and is also hosting that file.&lt;/p&gt;

&lt;p&gt;With this new model of web browsing, we're not dependent on corporations renting servers from even bigger corporations to keep the information we care about, and they currently control, on the internet.&lt;/p&gt;

&lt;p&gt;Instead of relying on publishers like the New York Times keeping articles hosted on their servers, or platforms like Stack Exchange seeing the value in keeping answers to years old questions online, we can just click a button to rehost web content so that it's always accessible on a massive P2P network.&lt;/p&gt;

&lt;p&gt;No more going all the way to specific servers that governments, ISPs, or rogue actors may be able to cut off access to in the future.&lt;/p&gt;

&lt;p&gt;This gives the people the ability to decide what's worth keeping around in perpetuity. Theoretically, the good stuff will be pinned by enough users that it'll be around forever, while the bad stuff will fall to the wayside.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. It harkens back to the markedly non-corporate early internet so many of us fell in love with.
&lt;/h3&gt;

&lt;p&gt;I, for one, am tired of &lt;a href="https://www.reddit.com/r/NoStupidQuestions/comments/l2r5da/does_anybody_else_hate_how_the_internet_now_feels/" rel="noopener noreferrer"&gt;the internet being mostly a collection of the same seven sites over and over again&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So many of our favorite old websites and interesting things we bookmarked just don't exist anymore.&lt;/p&gt;

&lt;p&gt;All of that effort and content and knowledge is just lost forever, only to be replaced by "community of communities" sites like Facebook and Reddit.&lt;/p&gt;

&lt;p&gt;I miss the days where we'd go to AddictingGames to play some games, check out some tech news on whichever blog we liked, get involved in separate niche community forums, and generally exist without having to move all our data through massive corporations.&lt;/p&gt;

&lt;p&gt;This move to a decentralized web has been encouraging early builders to make fun little web pages, more niche community apps, and just experimenting with the new format.&lt;/p&gt;

&lt;p&gt;It's like the wild west on the web again, and while a lot of the tooling and architecture still needs to be figured out, the possibilities are endless.&lt;/p&gt;

&lt;p&gt;The new web is weird and that's a good thing.&lt;/p&gt;




&lt;p&gt;That brings me back to my earlier point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm sitting at my computer: late at night, working on a project, and thinking about how lucky I am to be alive and a few years into my development career &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This kind of decentralized web that lives on all of our devices and frees us from our dependencies on corporations is something me and my computer lab buddies have wanted to exist for a long time.&lt;/p&gt;

&lt;p&gt;Over the years since college, I've headed up tech communities, led nationwide teams of developers, and traveled around the country giving and listening to talks.&lt;/p&gt;

&lt;p&gt;All that and I've honestly never been more excited about a new &lt;code&gt;$web_thing&lt;/code&gt; crossing my desk.&lt;/p&gt;

&lt;p&gt;IPFS is the real deal. From nerd dreams of old to HBO jokes to your ears (well, eyes).&lt;/p&gt;

&lt;p&gt;It's finally here, it's being given away &lt;strong&gt;for free&lt;/strong&gt;, and I understand enough modern web development to help build it.&lt;/p&gt;

&lt;p&gt;That's something 18-year-old me would be absolutely hype about. I just hope I can make him proud.&lt;/p&gt;




&lt;p&gt;I'm working on a project built on IPFS with a buddy of mine from GitLab.&lt;/p&gt;

&lt;p&gt;Without giving too much away: it's built with &lt;a href="https://www.gatsbyjs.com/" rel="noopener noreferrer"&gt;GatsbyJS&lt;/a&gt;, hosted on IPFS with &lt;a href="https://fleek.co/" rel="noopener noreferrer"&gt;Fleek&lt;/a&gt;, and should help folks adapt to the early days of this new web protocol.&lt;/p&gt;

&lt;p&gt;I should another blog post with some more information to share soon.&lt;/p&gt;

&lt;p&gt;Stay frosty.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt; (&lt;a href="https://dev.toipfs://QmWgX1D5PfsSBZAnNquBddunXwA9XcSnLFjw5bZCbAWXfH/"&gt;IPFS Version&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; (&lt;a href="https://dev.toipfs://QmWgX1D5PfsSBZAnNquBddunXwA9XcSnLFjw5bZCbAWXfH/blog/"&gt;IPFS Version&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>motivation</category>
      <category>webdev</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Hacktoberfest Markdown Editor Challenge: Day -2 (Prep Work)</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Wed, 30 Sep 2020 13:32:19 +0000</pubDate>
      <link>https://dev.to/quinncuatro/hacktoberfest-markdown-editor-challenge-day-2-prep-work-54fk</link>
      <guid>https://dev.to/quinncuatro/hacktoberfest-markdown-editor-challenge-day-2-prep-work-54fk</guid>
      <description>&lt;h2&gt;
  
  
  Real quick, as an aside:
&lt;/h2&gt;

&lt;p&gt;As an aside - in the spirit of Hacktoberfest, y'all should all check out &lt;a href="https://2020.allthingsopen.org/" rel="noopener noreferrer"&gt;All Things Open&lt;/a&gt; - A polyglot technology conference focusing on the tools, processes, and people making open source possible. &lt;/p&gt;

&lt;p&gt;It's a free virtual conference taking place on October 19th and 20th, with tracks covering topics like DevOps, community leadership, inclusion and diversity, and various workshops.&lt;/p&gt;

&lt;p&gt;It's going to be a great time full of great talks. I'll be giving a full-length talk on tech debt and an ignite on digital transformations in government myself, but I'm very excited to hear from folks like &lt;a href="https://2020.allthingsopen.org/speakers/liz-fong-jones/" rel="noopener noreferrer"&gt;Liz Fong-Jones&lt;/a&gt;, &lt;a href="https://2020.allthingsopen.org/speakers/john-papa/" rel="noopener noreferrer"&gt;John Papa&lt;/a&gt;, and &lt;a href="https://2020.allthingsopen.org/speakers/remy-decausemaker/" rel="noopener noreferrer"&gt;Remy DeCausemaker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sign up and come hang out for a couple of days to get the open source juices flowing! Now back to the blog!&lt;/p&gt;




&lt;p&gt;If you're reading this, I'm assuming you saw my last post on how I want to bump up the Hacktoberfest challenge a bit above just making four pull requests.&lt;/p&gt;

&lt;p&gt;I want to build my own open source cross-platform cloud-synced desktop markdown editor in just 31 days.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Henry, why do you keep doing these things to yourself?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great question. I'm unsure of the answer, though. I find that when I get stuck on a problem like this for so long (at this point a couple of years of trying to find a markdown editor that fits all my needs) that I just need to buckle down and solve it. It's mostly just a fun bonus that it gives me some material to blog about on DEV and to stream on my &lt;a href="https://twitch.com/henryneedscoffee" rel="noopener noreferrer"&gt;Twitch channel&lt;/a&gt; (Tuesday nights at 6!).&lt;/p&gt;

&lt;p&gt;Much in the same way that novelists prepare a bit for National Novel Writing Month (NaNoWriMo) by figuring out their characters, sketching out the plot beats of their story, and spending some time thinking about the hell they're going to put themselves through in November... I feel that it's appropriate to prep for this markdown editor a bit.&lt;/p&gt;

&lt;p&gt;You wouldn't jump into a half marathon without doing a few half marathons first, right? Well, I might have in 2018, but that's a story for a different time.&lt;/p&gt;




&lt;p&gt;Let's get right into it: this is a BIG project to take on in just a month. For a refresher, here are the big bullet points I want to hit by the end of Halloween:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Being cross-platform (Linux/Mac/Windows and eventually Android/iOS)&lt;/li&gt;
&lt;li&gt;Ability to cloud sync data between those platforms&lt;/li&gt;
&lt;li&gt;Having one editor pane where markdown syntax is rendered on the spot (like Bear and Typora)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;You idiot, you didn't even put "build a markdown editor" on your list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hey, thanks! That's the first thing I wanted to talk about.&lt;/p&gt;

&lt;p&gt;Much like writing a book, or running a marathon, building this app is going to be a slog - even if I'm just aiming for an MVP that I can keep iterating on. I'll be proud as hell if I can get through those main three items without getting too far into the other 20+ feature ideas I want to bake into this thing.&lt;/p&gt;

&lt;p&gt;But the truth is that the actual markdown editor part of it is pretty easy. Part of my prep work for this was Googling around for some "electron markdown editor tutorial" tutorials. I wanted to get my feet wet both with how Electron apps are put together and with what a markdown editor might look like in JavaScript.&lt;/p&gt;

&lt;p&gt;After trying a few, I found that one written by Tzahi Vidas was the simplest that both showed me how to build a simple Electron app and how to parse markdown with JavaScript. I highly recommend y'all give it a shot if you're at all interested in what I'm working on. It's a solid primer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/heres-how-i-created-a-markdown-app-with-electron-and-react-1e902f8601ca/" rel="noopener noreferrer"&gt;Tzahi Vidas - Here's how I created a markdown app with Electron and React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did, however, find that I had to use a different command to run Electron apps on my MacBook Pro than the one provided in the above tutorial, though. In package.json, I had to change the run script from something like &lt;code&gt;electron .&lt;/code&gt; to &lt;code&gt;electron-builder build --mac -c.extraMetadata.main=build/main.js --publish never&lt;/code&gt; to get the app to actually launch. Odd, and took me a bit to figure out (&lt;a href="https://medium.com/@johndyer24/building-a-production-electron-create-react-app-application-with-shared-code-using-electron-builder-c1f70f0e2649" rel="noopener noreferrer"&gt;source on the fix&lt;/a&gt; - thanks John Dyer!), but it was a solvable problem.&lt;/p&gt;

&lt;p&gt;In a bit of backward thinking, I then went on to checking out the Electron docs to see if they had any getting started docs. Turns out they have all kinds of cool nuggets in there, but some of them are a bit buried in an interesting hierarchy of links and pages. Within there, I found two really helpful things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Electron "Simple Samples" GitHub repo has a few sample projects already built out that interact with your computer's resource monitor, your app tray, and some other bits of their API. You can just run &lt;code&gt;npm install&lt;/code&gt; and &lt;code&gt;npm start&lt;/code&gt; to pull one of the projects up on your local machine and dig around in the code to see how it all fits together. They even give you a set of challenges per sample project to try and add functionality.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;* &lt;a href="https://github.com/electron/simple-samples" rel="noopener noreferrer"&gt;Electron Simple Samples Repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;The second helpful thing I found probably would have been better off if it were the first, even before Tzahi's tutorial - the "Electron API Demos" repo. When you &lt;code&gt;npm install &amp;amp;&amp;amp; npm start&lt;/code&gt; this bad boy will pull up a window telling you all about the different parts of the Electron API you can use to interact with a user's desktop, has buttons to show on your desktop what each one does, and has code snippets to show you how to use them.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;* &lt;a href="https://github.com/electron/electron-api-demos" rel="noopener noreferrer"&gt;Electron API Demos Repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Between those, and digging through the Electron docs a little more, I got most of what I needed to get ready for this challenge. I have a cursory understanding of how Electron apps work, how to parse markdown with JavaScript, and feel mostly ready for October. At least as prepared for it as writers are for NaNoWriMo or runners are for a marathon. I know the basics of what I'm taking on, but the event itself is going to bring plenty of its own challenges.&lt;/p&gt;

&lt;p&gt;There are still a handful of things to figure out as I get started in October.&lt;/p&gt;

&lt;p&gt;Like, am I going to use an existing markdown library, or am I going to make my own parser with slightly altered markdown syntax rules?&lt;/p&gt;

&lt;p&gt;How do I handle the cloud syncing: through something like PouchDB or by treating the whole thing as a progressive web app and use service workers to keep local offline changes synced with a SQL database somewhere? &lt;/p&gt;

&lt;p&gt;On that last point, a buddy gave me some words of wisdom today:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I would start with the simplest possible solution, probably some form of long-polling, evaluate the UX once the app was a further bit along, and reassess then." - Ben J, a SWE and former tech co-founder&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And I mean, smart. Knowing myself, it would be all too easy for me to forget that I'm just aiming for an MVP within like three days. I'll always have time to add features later.&lt;/p&gt;

&lt;p&gt;Past that, there are all kinds of things I'll have to figure out as problems pop up all through November, but I'm glad I did the prep work I did to get myself ready to tackle this whole thing with a little prior knowledge.&lt;/p&gt;

&lt;p&gt;Tomorrow is day -1. My last "day off" before the development work starts. And I also have a new conference talk (titled The Tech Debt of Monopoly House Rules - it's gonna be a fun time) due in a few weeks for &lt;a href="https://2020.allthingsopen.org/" rel="noopener noreferrer"&gt;All Things Open&lt;/a&gt;. It's going to be a busy month for sure, but I'm excited to get some work done. I'm going to cook something fun tomorrow, relax a bit, and get back to y'all with an update on October 1st.&lt;/p&gt;

&lt;p&gt;Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>learninpublic</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>How would you handle cloud syncing data for an Electron app?</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Tue, 29 Sep 2020 16:10:55 +0000</pubDate>
      <link>https://dev.to/quinncuatro/how-would-you-handle-cloud-syncing-data-for-an-electron-app-4354</link>
      <guid>https://dev.to/quinncuatro/how-would-you-handle-cloud-syncing-data-for-an-electron-app-4354</guid>
      <description>&lt;p&gt;So I'm going to be building an open source markdown-editor-of-my-dreams for Hacktoberfest and one of the things I want it to do is handle cloud syncing note data across multiple platforms.&lt;/p&gt;

&lt;p&gt;App is going to be JavaScript, Node, Electron.&lt;/p&gt;

&lt;p&gt;I'm not sure how to handle the native cloud syncing, though.&lt;/p&gt;

&lt;p&gt;My gut reaction was to just toss it all in Firebase.&lt;/p&gt;

&lt;p&gt;I think a better approach would be to treat it like a Progressive Web App and use service workers to keep track of local offline changes and update a SQL database whenever a user reconnects to the internet.&lt;/p&gt;

&lt;p&gt;How would you handle this?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>discuss</category>
      <category>learninpublic</category>
      <category>node</category>
    </item>
    <item>
      <title>Hacktoberfest 2020: Building a Better Markdown Editor</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Sun, 27 Sep 2020 18:24:51 +0000</pubDate>
      <link>https://dev.to/quinncuatro/hacktoberfest-2020-building-a-better-markdown-editor-5gh5</link>
      <guid>https://dev.to/quinncuatro/hacktoberfest-2020-building-a-better-markdown-editor-5gh5</guid>
      <description>&lt;p&gt;What's up, y'all? Long time, no... blog?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hacktoberfest.digitalocean.com/" rel="noopener noreferrer"&gt;Hacktoberbest&lt;/a&gt; is almost upon us and this year I want to take things a little farther than just submitting a few pull requests. The event is meant to help people get more into open source development, and in that vein I wnat to treat October the same way authors treat National Novel Writing Month (NaNoWriMo).&lt;/p&gt;

&lt;p&gt;I want to start and finish a useful project within those 31 days.&lt;/p&gt;




&lt;p&gt;I owe a lot of my career to folks putting their open source projects, packages, and products on the internet for everyone to use and I want to pay part of that back to the community I've gained so much from.&lt;/p&gt;

&lt;p&gt;In the past, I had a lot of success on DEV.to when writing my series on &lt;a href="https://dev.to/quinncuatro/learning-devops-in-public-c26"&gt;Learning DevOps In Public&lt;/a&gt; (which itself was inspired by &lt;a href="https://www.swyx.io/writing/learn-in-public/" rel="noopener noreferrer"&gt;Shawn Wang's post&lt;/a&gt;). Making sure I was able to write clearly about what I was learning and applying turned out to be an incrdible way to learn, and it turns out that people vibe with that content! That series had a cumulative 13,500 views!&lt;/p&gt;

&lt;p&gt;After having a good cadence in getting posts up for a while, I got caught up in the busy season at work and then the world kind of... blew up. Kind of fell off the grid for a long time and missed out on a lot of moments of good community building and interaction.&lt;/p&gt;

&lt;p&gt;Honestly, for a while I was doing my best just to keep my head above water. There were projects I wanted to hack on but between work, cooking, and trying to find new ways to spend time with my friends... I didn't have the energy. I've been wanting to get back into tech writing and project work but needed the right idea to come along and the right motivation to get back to it. &lt;/p&gt;

&lt;p&gt;Finally found the next thing I'll learn in public, and just in time for Hacktoberfest: &lt;/p&gt;

&lt;p&gt;Building a better markdown editor.&lt;/p&gt;

&lt;p&gt;I know I'm one of thousands (likely more) developers to take a whack at making the "perfect markdown editor", but hear me out.&lt;/p&gt;

&lt;p&gt;My buddy, &lt;a href="//atrost.com"&gt;Alex Trost&lt;/a&gt; (curator of the &lt;a href="https://www.swyx.io/writing/learn-in-public/" rel="noopener noreferrer"&gt;Frontend Horse&lt;/a&gt; newsletter - which you should all check out), and I have been trying out different markdown editors over the last year or so and while the 85% of their features have a solid overlap, it's often the other 15% that we love about each individual editor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bear.app/" rel="noopener noreferrer"&gt;Bear&lt;/a&gt; (what I currently use on my work MBP) has a fantastic layout and organizational system, but doesn't support anything other than macOS and iOS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://typora.io/" rel="noopener noreferrer"&gt;Typora&lt;/a&gt; (what this post was written with) has solid cross platform support, but doesn't have any native cloud syncing functionality.&lt;/li&gt;
&lt;li&gt;Other editors have WYSIWYG bars (not really markdown), some are web based (not ideal for me), and still others cost money when they feel feature incomplete or have stale codebases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After doing a survey of a ton of different options, I landed on my dream editor having three main features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Being cross platform (Linux/Mac/Windows and eventually Android/iOS)&lt;/li&gt;
&lt;li&gt;Ability to cloud sync data between those platforms&lt;/li&gt;
&lt;li&gt;Having one editor pane where markdown syntax is rendered on the spot (like Bear and Typora)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It seems odd to me that I didn't come across a mainstream markdown editor that covers all three of those points. Maybe I'm getting in over my head with this project, but I feel like this is a solvable proble, you know?&lt;/p&gt;

&lt;p&gt;I've been wanting to dig into Electron for years now, and I'm sure plenty of other web application developers feel a similar trepidation of making the move over to desktop applications (even if it is the same technology in the background). There are a number of tools I've built with JavaScript for my job, and being able to wrap a GUI around them quickly would make it easier for me to share them with folks who feel less at home on a command line.&lt;/p&gt;

&lt;p&gt;After running through a couple of Electron tutorials (which I'll write about early on in October), I found that it's a pretty simple technology to use if you already have some familiarity with Node projects. I hope that by writing about my development process I'll be able to help some of y'all make the jump from web to the desktop.&lt;/p&gt;

&lt;p&gt;A good markdown editor obviously means more than those previous three bullet points to help boost productivity, though. I whittled my wishlist down to a "top 20" list of other features (in order of importance to me):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Local storage in something like SQLite&lt;/li&gt;
&lt;li&gt;Left side bar for list of notes (title, first couple lines preview)&lt;/li&gt;
&lt;li&gt;Auto save&lt;/li&gt;
&lt;li&gt;Add todo's/task list with Bear's &lt;code&gt;-&lt;/code&gt;  syntax&lt;/li&gt;
&lt;li&gt;Code blocks (MarkText uses GFM code fence, syntax highlighting - PrismJS?, line numbers)&lt;/li&gt;
&lt;li&gt;Syntax support for popular programming languages&lt;/li&gt;
&lt;li&gt;Word count (word/characters/paragraph/read time)&lt;/li&gt;
&lt;li&gt;In-line styles (like strong, strikethrough, underline, comment, etc)&lt;/li&gt;
&lt;li&gt;Table of contents generated by headers&lt;/li&gt;
&lt;li&gt;Show creation/edit date and last editing device&lt;/li&gt;
&lt;li&gt;Full in-line image support&lt;/li&gt;
&lt;li&gt;Table blocks (MarkText uses GFM table block)&lt;/li&gt;
&lt;li&gt;Shortcut keys for styles&lt;/li&gt;
&lt;li&gt;Focus mode - new note in Bear&lt;/li&gt;
&lt;li&gt;Light/dark modes&lt;/li&gt;
&lt;li&gt;Project bundle support similar to FastAuthor (&lt;a href="https://github.com/ExamProCo/fast-author#The-Anatomy-of-a-Project" rel="noopener noreferrer"&gt;https://github.com/ExamProCo/fast-author#The-Anatomy-of-a-Project&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Export as different file types (HTML/PDF/MD)&lt;/li&gt;
&lt;li&gt;Organize notes with hashtags?&lt;/li&gt;
&lt;li&gt;Ability to cross-link and reference other notes&lt;/li&gt;
&lt;li&gt;Encrypt individual notes and lock the app&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's an aggressive project to tackle in just a month, but I don't see myself getting too deep into my backlog of wishlist items. Figured that having a bigger project to tackle during the month of October would help keep me motivated and make it feel like I actually earn my t-shirt and sticker pack this year - and leave me plenty to do while I try to flesh this app out through the end of the year.&lt;/p&gt;

&lt;p&gt;Plus, there's the added benefit of me being able to use a tool I've been wanting for a while and getting full creative control over it!&lt;/p&gt;

&lt;p&gt;I plan on working throughout the month to get at least an MVP put together and want to get a post up every few days on what I've been doing. I learned in the last round of learning in public that posting daily was too lofty a goal. &lt;/p&gt;

&lt;p&gt;But I'm hoping to use this opportunity to really dig into using Electron to build desktop apps, get back into writing, and hopefully become a better developer while taking y'all on this journey with me!&lt;/p&gt;

&lt;p&gt;Here's to tackling something big in 2020, and I'll see y'all on October 1st!&lt;/p&gt;

&lt;p&gt;Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>hacktoberfest</category>
      <category>learninginpublic</category>
    </item>
    <item>
      <title>Organizing Local Tech Scenes, A Podcast Episode</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Wed, 21 Aug 2019 16:24:17 +0000</pubDate>
      <link>https://dev.to/quinncuatro/organizing-local-tech-scenes-a-podcast-episode-1ppo</link>
      <guid>https://dev.to/quinncuatro/organizing-local-tech-scenes-a-podcast-episode-1ppo</guid>
      <description>&lt;p&gt;Hey everyone! I haven't forgotten about all of you. Just had a wild week and a half at work that we're just now getting on top of.&lt;/p&gt;

&lt;p&gt;There are still some posts in the pipeline about building, configuring, and running applications on my Raspberry Pi Kubernetes cluster!&lt;/p&gt;

&lt;p&gt;Until then, I thought it would be worth sharing an episode of a podcast I was on this past weekend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://betweentworocks.com/episode-22-newhaven-io/" rel="noopener noreferrer"&gt;Between Two Rocks Podcast: Episode 22 - NewHaven.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my free time, I help run a local tech group called &lt;a href="https://newhaven.io" rel="noopener noreferrer"&gt;NewHaven.io&lt;/a&gt;. Several years ago, this group was created to pull all of the disparate Meetup groups in town (different languages, stacks, technologies) under one banner. I've been involved as a board member for about a year now and it's been a wild ride.&lt;/p&gt;

&lt;p&gt;We were invited onto this podcast by another of our board members and we discussed how we want to grow out our local scene and focus more on inclusivity and diversity.&lt;/p&gt;

&lt;p&gt;Hopefully, this might provide some nugget of wisdom to any of you out there who might be wanting to get more involved in your local developer community. Whether you want to help organize more events or stand up a Meetup group of your own, rest assured that there are developers in your area who will greatly appreciate the effort you put in to help grow your scene.&lt;/p&gt;

&lt;p&gt;For all of you already helping run similar groups, what are you doing to provide more value for your members? We're always trying to find ways to do more with less help organizing, so I'm curious about anything and everything you're doing regarding throwing events, growing a sense of community, and fostering a support group.&lt;/p&gt;




&lt;p&gt;Again, Raspberry Pi cluster articles inbound! Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What kind of DevOps content do you want?</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Fri, 02 Aug 2019 15:39:43 +0000</pubDate>
      <link>https://dev.to/quinncuatro/what-kind-of-devops-content-do-you-want-2oep</link>
      <guid>https://dev.to/quinncuatro/what-kind-of-devops-content-do-you-want-2oep</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;If you've been following along with my &lt;a href="https://dev.to/quinncuatro/learning-devops-in-public-c26"&gt;Learning DevOps In Public&lt;/a&gt; series, you know I have some content in the pipeline. Mostly about building out a Raspberry Pi K8s/K3s cluster and about how to migrate your Docker Compose projects to Kubernetes manifests to Helm charts.&lt;/p&gt;

&lt;p&gt;But, since there seem to be a lot of people who are interested in starting to work with containers, I'm curious what you all want to read about!&lt;/p&gt;

&lt;p&gt;I've had to teach myself everything from writing my first bits of PHP to getting applications ready for a production OpenShift environment, and I really don't want any of you to have to experience that pain alone.&lt;/p&gt;

&lt;p&gt;If there's anything you're interested in learning about or need some kind of clarification on, throw it in the comments. We can start a discussion and I'm sure people can pop in to answer questions in the moment, but it'll also give me an idea of the kind of content that will help everyone here become stronger developers!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The Promise of Docker Containers</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Thu, 01 Aug 2019 10:02:35 +0000</pubDate>
      <link>https://dev.to/quinncuatro/the-promise-of-docker-containers-57fd</link>
      <guid>https://dev.to/quinncuatro/the-promise-of-docker-containers-57fd</guid>
      <description>&lt;p&gt;Hey folks! My last post, titled &lt;a href="https://dev.to/quinncuatro/cool-but-what-can-you-actually-use-containers-for-228d"&gt;How To Incorporate Containers Into Your Daily Duties&lt;/a&gt;, was all about how you can use containers to improve your work as a developer. &lt;/p&gt;

&lt;p&gt;The problem with that is that it necessitates y'all knowing how to set up, configure, and run Docker containers.&lt;/p&gt;

&lt;p&gt;I shouldn't have assumed that everyone came to that post with the prerequisite knowledge, so here's an article I wrote a little over a year and a half ago. It covers two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What benefits containers provide you, as a developer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A demo/walkthrough of building an image based on a CentOS LAMP stack from scratch and spinning up a container to serve a web application.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've also updated the additional resources at the end of this one so that they're the current links/documents/installers as of July 31, 2019.&lt;/p&gt;

&lt;p&gt;Hope you enjoy!&lt;/p&gt;




&lt;h2&gt;
  
  
  The Promise of Containers
&lt;/h2&gt;

&lt;p&gt;As a web developer, I’m sure you’ve built a server or two. You probably spun up a Linux box and installed some packages like Apache, MySQL, or PHP. Maybe you pulled some of your code from GitHub, threw a database together, and edited some config files to bend the server to your liking.&lt;/p&gt;

&lt;p&gt;(If you haven’t built a server and are interested in learning how, check out my LearnToProgram.TV course titled “Introduction to Server Administration”. - &lt;a href="https://www.udemy.com/introduction-to-server-administration/" rel="noopener noreferrer"&gt;https://www.udemy.com/introduction-to-server-administration/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;But what happens if your server becomes corrupted, your backups have been failing without you noticing, or your site goes viral and traffic starts outpacing what your infrastructure can handle?&lt;/p&gt;

&lt;p&gt;If you’re new to server administration, any of those events could seem daunting. If one occurred, you would have a bigger problem than manually rebuilding your server. You also have to hope that your documentation is thorough enough to cover every modification you made to your original system. You do have documentation, right?&lt;/p&gt;

&lt;p&gt;Simply put, a disaster of any magnitude would make for a frustrating day or a late night. Disasters do happen and it’s prudent to be prepared for them. Let me introduce you to Docker, which is a container management system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“But Henry, what in the world are containers and why should I care about them?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Great question. Containers, in the context of software development, are best defined as segmented and sequestered user-space instances existing on top of a kernel.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Yeah… can you make that simpler?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I sure can. The easiest way to explain containers is to compare them to virtual machines (VM's). One method to run three different apps on one server is to run three different VM's, which consist of an operating system, the app, and whatever dependencies that app needs in order to run. A container, in the context of this example, is a bundle of the bare minimum of code and dependencies it takes to run an application. Docker functions as the guest operating system for any number or type of containers. The obvious benefit is that it is much more resource-efficient than running several VM's.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq88iy5xvgoqzd1wf82ky.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq88iy5xvgoqzd1wf82ky.jpg" width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: &lt;a href="https://images.idgesg.net/images/article/2017/06/virtualmachines-vs-containers-100727624-large.jpg" rel="noopener noreferrer"&gt;https://images.idgesg.net/images/article/2017/06/virtualmachines-vs-containers-100727624-large.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Word. This is starting to make sense. Paint me a word picture."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You got it. Let's dive in on how Docker (and containers in general) are going to take your game to another level. The benefits of using Docker are fiftyfold, but for the sake of brevity, I want to key in on the five which I believe are the most important.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Speed
&lt;/h3&gt;

&lt;p&gt;The main key to wrap your head around is that Docker allows you to programmatically build out your infrastructure. That means instead of having to manually build another server every time you need a new one, you can just spin one up based on a predefined image of what you need the resulting container to be. It's a little more time-intensive to build that image at the beginning of a new project, but every time you need to stand up a duplicate environment, it takes minutes instead of hours.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Ease of Use
&lt;/h3&gt;

&lt;p&gt;In addition to speed, the ability to quickly spin up instances of infrastructure you need at any given moment can be a great boost to your organization. Let's say the app you're building hits the front page of Reddit and your traffic goes out of control. You could also get hacked and have your site knocked offline. Either way, you need to get back online quickly. Your business very well might depend on it. At least nine out of ten times, starting a container is faster than building a fresh server.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Security
&lt;/h3&gt;

&lt;p&gt;A basic tenet of containers is that they are walled gardens. An initial benefit is that you can bundle apps with their respective dependencies so that if container A needs PHP5 and container B needs PHP7, that can be handled without having to worry about dependency clashes. The two containers may run side by side, but they won't get in each other's way.&lt;/p&gt;

&lt;p&gt;The walled garden approach also means you can define exactly how you want and if you want data flowing in and out of a container. You'll see in the demo that we explicitly tell our container to "EXPOSE 80". That is saying it is okay to open up port 80 in the container to the broader system we're running it on so that Apache can do its job and host content over that port. When you start building more complicated systems with Docker, you can use that kind of security to link certain containers running applications up to other specific containers holding databases or running some specific micro-services.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Portability
&lt;/h3&gt;

&lt;p&gt;Since containers (in a simplistic view) are meant to be an app packaged with the bare minimum of resources it needs to run correctly, you can run that container on anything that can run Docker. Whether it is on Red Hat Enterprise Linux, your MacBook Pro, or Windows Server 2016, that container will spin up and function exactly as it should.&lt;/p&gt;

&lt;p&gt;An added benefit is that you can develop in an environment that will eventually be your production environment. Your containers will be based on an image, which is a compiled list of instructions on how to build a specific environment. You can use that image to spin a container up on your laptop and build your app in it. When you're ready to launch, you can use that same image to deploy a container on a public server and be completely confident that it'll run the same there as it did locally.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Version Controllability
&lt;/h3&gt;

&lt;p&gt;Finally, since Docker lets you build out your infrastructure as code, your infrastructure can be entered into version control system. One more time for the people in the back. YOUR INFRASTRUCTURE CAN NOW BE VERSION CONTROLLED. If you make a change and something breaks, just roll it back. If your data center somehow burns to the ground, you can pull your images and code from your remote repositories. Future you is going to thank present you for making their life that much easier.&lt;/p&gt;


&lt;h2&gt;
  
  
  Docker Demo
&lt;/h2&gt;

&lt;p&gt;With all that said, let's build our first container. I'm assuming that I've convinced you of Docker's usefulness enough that you've already downloaded and installed it on your system. If you haven't yet, please go do that now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/install/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just for laughs, let's say I need a basic site running on a CentOS server for a demo. There are two ways I can go about that: I can spend the twenty minutes it can take to create a new server from scratch, or I can use Docker to build one image that can then instantiate innumerable identical containers to run my site.&lt;/p&gt;
&lt;h3&gt;
  
  
  1 - Create a Dockerfile
&lt;/h3&gt;

&lt;p&gt;First, make a new project directory and create a file named &lt;code&gt;Dockerfile&lt;/code&gt;, which is a list of instructions on how to build a system on top of a base image. Base images can be based around languages like PHP, run-times like Node, or operating systems like Ubuntu. They are generally provided by the maintainers of the source product. That means they're built by the creators of the software specifically to work well with Docker.&lt;/p&gt;

&lt;p&gt;We then need instructions on how to build on top of that base. There are commands we can use, like: &lt;code&gt;RUN&lt;/code&gt;, &lt;code&gt;ADD&lt;/code&gt;, and &lt;code&gt;CMD&lt;/code&gt;. They run shell level commands, map files from the host to a container and specify commands to run on boot, respectfully. We take the steps of configuring a server and translate them into tasks that Docker can use to automate the process.&lt;/p&gt;

&lt;p&gt;It's similar to how Git works behind the scenes, in that each commit (or instruction) is a set of changes to be made to the last commit, not the entire codebase at that moment.&lt;/p&gt;

&lt;p&gt;For the sake of simplicity, we're going to be building a very basic image. our Dockerfile will be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile&lt;/span&gt;
&lt;span class="c"&gt;# Basic Setup&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; centos:7&lt;/span&gt;
&lt;span class="k"&gt;LABEL&lt;/span&gt;&lt;span class="s"&gt; maintainer="henry@tld.com"&lt;/span&gt;

&lt;span class="c"&gt;# Update repos and install httpd&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;yum &lt;span class="nt"&gt;-y&lt;/span&gt; update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;httpd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    yum clean all

&lt;span class="c"&gt;# Expose a port from the container to Docker and run the startup script on launch&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["/usr/sbin/apachectl", "-DFOREGROUND"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Dockerfile reads surprisingly like English. All it is saying is that we want to use CENTOS y as a base, install Apache, expose port 80 to map to a different host port, and start-up Apache on boot.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - Build Your Image
&lt;/h3&gt;

&lt;p&gt;Once the Dockerfile is saved, we'll run a "build" command in the terminal/ This tells Docker (the utility) to use our Dockerfile (the list of instructions) to build a system.&lt;/p&gt;

&lt;p&gt;First, we need to open our terminal and enter the directory that contains our Dockerfile. For me, that directory is &lt;code&gt;~hquinn/dev/forDevTo/TheFutureIsDocker/DockerDemo/&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;We then need to tell the Docker utility to build the image being described by the Dockerfile.&lt;/p&gt;

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

&lt;p&gt;The &lt;code&gt;--rm&lt;/code&gt; denotes that we want to automatically delete the intermediate containers that are generated during the build process, the &lt;code&gt;-t hquinn/dockerdemo&lt;/code&gt; is tagging our build with a name so we can more easily refer to it later, and the &lt;code&gt;.&lt;/code&gt; at the end indicates that we want to run this command in the present working directory.&lt;/p&gt;

&lt;p&gt;This command will log out every part of the build process to the console. It may take a few minutes, which is totally normal. Let it sit for a minute; it will tell you when it's finished.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - Verify Your Image
&lt;/h3&gt;

&lt;p&gt;Once Docker pulls down the base we chose to use (CentOS 7), installs Apache, and completes all other instructions, we're given a finished image that is named based on the tag in the build command. You can see it (and the CentOS 7 base image) by listing the Docker images on your system.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  4 - Spin Up A Container
&lt;/h3&gt;

&lt;p&gt;Since the image is now built, we can use it to spawn a running container. We're going to change directory to the project we want running on this first container and then run a &lt;code&gt;docker run&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;(Here, I'm using a sample project from Dave Moran's LTP course titled "Learn SASS and SCSS" - &lt;a href="https://www.udemy.com/learn-sass-and-scss/" rel="noopener noreferrer"&gt;https://www.udemy.com/learn-sass-and-scss/&lt;/a&gt;)&lt;/p&gt;

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

&lt;p&gt;This command is telling Docker to run a container-based on the image that we just build, but it was a few other parameters. The &lt;code&gt;-d&lt;/code&gt; is telling Docker to run the container as daemon (in the background), the &lt;code&gt;-p 80&lt;/code&gt; is to map port 80 on the container to a port on the host, so it can be viewable via a browser, the &lt;code&gt;--name Project1&lt;/code&gt; is again a way to name the resource, and the &lt;code&gt;--mount type=bind,source="$(pwd)"/app/,target=/var/www/html/&lt;/code&gt; is telling Docker to map our local &lt;code&gt;./app/&lt;/code&gt; directory to &lt;code&gt;/var/www/html/&lt;/code&gt; in the container so that Apache can host it for us.&lt;/p&gt;

&lt;h3&gt;
  
  
  5 - Verify Your Container
&lt;/h3&gt;

&lt;p&gt;Now that the container is running with our code loaded into it, we can go see it in a browser. First, we need to figure out what local port the container's exposed port got bound to.&lt;/p&gt;

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

&lt;p&gt;We can see that the running container named &lt;code&gt;Project1&lt;/code&gt; has mapped our local port 32769 to port 80 on the container (the host port may be different on your machine). If we open a browser and head to &lt;code&gt;localhost:32769&lt;/code&gt;, we can see our code running live.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  6 - Drop Into Your Container's Shell
&lt;/h3&gt;

&lt;p&gt;That's all there is to it. We could keep moving to different directories that have basic HTML/CSS/JS applications in a subdirectory called &lt;code&gt;./app/&lt;/code&gt; and keep using that same command to spawn more containers. They'll each spin up, map that code to &lt;code&gt;/var/www/html/&lt;/code&gt;, and assign a port on &lt;code&gt;localhost&lt;/code&gt; to each container.&lt;/p&gt;

&lt;p&gt;We can verify that the container is pulling in our code by running a Docker command that grants us shell access to it. It'll drop us right into the root of that CentOS system as the root user. If we look in the web directory, we can see that it pulled our files in and uses Apache to host them, the same way would on a traditional VPS.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  7 - Clean Up
&lt;/h3&gt;

&lt;p&gt;What demo would be complete without some file cleanup? If we keep spawning containers without doing any sort of maintenance, we will eventually hit the limits of our hardware. That's not ideal. Let's shut down and delete the container we spun up, then remove the image it's based on.&lt;/p&gt;

&lt;p&gt;Containers are ethereal. Once one is stopped with the &lt;code&gt;docker stop&lt;/code&gt; command, we could spin it right back up, and it would be identical to the first time that we started it. To get rid of a stopped container, we'd run a &lt;code&gt;docker rm&lt;/code&gt; command. To get rid of the image it was based on, we would run a &lt;code&gt;docker rmi&lt;/code&gt; command.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Outro
&lt;/h2&gt;

&lt;p&gt;Docker isn't as insurmountable a technology as it seems. It can be tricky to wrap your head around, but once you do, it's pretty easy to see the benefits that it can provide. Not only does it let you develop locally in the same environment you'll use for production, but it lets you spin your infrastructure up and down to suit your needs: whether it's scaling to meet viral demand or recovering from a disaster incident.&lt;/p&gt;

&lt;p&gt;Furthermore, this is just a very small taste of what Docker can do. Your builds can be as simple or as complicated as you need. For instance, I have one build that consists of a group of three containers: one running a Node application, another container running PostgreSQL with data persistence through the help of a data volume, and the third acting as a query cache.&lt;/p&gt;

&lt;p&gt;As a developer, Docker is an incredibly powerful tool to have in your arsenal. Honestly, even if it's meant to solve a problem you haven't had yet. You'll eventually find yourself in a situation where Docker can save your bacon, and when you do, you'll be ready for it. The documentation is incredible and it sounds corny, but the only real limit is your imagination. Now, get started building your infrastructure as code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Quinncuatro/TheFutureIsDocker.git" rel="noopener noreferrer"&gt;Article &amp;amp; Corresponding Code&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/install/" rel="noopener noreferrer"&gt;Docker Desktop Edition Installers&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/get-started/" rel="noopener noreferrer"&gt;Docker Getting Started Guide&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.katacoda.com/courses/docker" rel="noopener noreferrer"&gt;Docker Labs - Katacoda&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.docker.com/engine/reference/builder/" rel="noopener noreferrer"&gt;Dockerfile Documentation&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Containers can be a hard subject to initially broach, since, from the outside, it can seem that there is just too much in that realm to learn. However, once you dig in, it's just some light system administration work that's being automated so you only have to put in a decent amount of effort the first time. &lt;/p&gt;

&lt;p&gt;Hopefully, this post is enough to help at least one of you start your journey towards container enlightenment!&lt;/p&gt;

&lt;p&gt;Also, the parts for my Raspberry Pi K8s bramble are all slowly coming in the mail. Just waiting on my cooling rack tomorrow afternoon. Can't wait to start putting that together and creating some more content for you all.&lt;/p&gt;

&lt;p&gt;Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>productivity</category>
      <category>linux</category>
    </item>
    <item>
      <title>How To Incorporate Containers Into Your Daily Duties</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Mon, 29 Jul 2019 13:30:28 +0000</pubDate>
      <link>https://dev.to/quinncuatro/cool-but-what-can-you-actually-use-containers-for-228d</link>
      <guid>https://dev.to/quinncuatro/cool-but-what-can-you-actually-use-containers-for-228d</guid>
      <description>&lt;p&gt;We're going to take a bit of a sidestep this week.&lt;/p&gt;

&lt;p&gt;I was planning on converting a Docker-Compose project into a Kubernetes one, but I had a small project pop up this week. That project involved me setting up a container to mimic a production environment so I could test my script without disrupting any of our clients.&lt;/p&gt;

&lt;p&gt;Figured a practical example of how a container saved the day would be a better topic than me learning something just to learn something.&lt;/p&gt;




&lt;p&gt;Every once in awhile I'm given a task that, once explained to me, seems like it's going to take a lot of time. Like hours of my attention every time this bit of work comes up.&lt;/p&gt;

&lt;p&gt;I'll usually ask how often this task comes up in a given quarter. If the combined time for a quarter is more than a day or two, I usually throw the XKCD comic on automation out the window just go for it.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Photo Credit: &lt;a href="https://xkcd.com/1319/" rel="noopener noreferrer"&gt;https://xkcd.com/1319/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's more worth my time to write and maintain an automation script than it is to have me out of "the fight" for a few hours to deal with something mundane while the rest of my team is tackling a production issue.&lt;/p&gt;

&lt;p&gt;This week I was given a task that requires me to hop on a server and programmatically clean out some files. Sometimes it's just looping over a list and using some simple &lt;code&gt;*&lt;/code&gt; matching to nuke some stuff. Sometimes it needs some sed magic to make things work.&lt;/p&gt;

&lt;p&gt;Once I decided that it was worth it to automate this task, I copied the Confluence outlining steps into a new document in VS Code. I chunked up the tasks based on similar work that needed to be done, played around with some Bash scripting, cried a bit, and eventually came up with a more sophisticated version of the following GitHub repo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PROJECT CODE: &lt;a href="https://github.com/Quinncuatro/ReleaseTheHounds" rel="noopener noreferrer"&gt;Release The Hounds&lt;/a&gt; &amp;lt;-- GitHub Link&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's dive into what exactly is going on in there.&lt;/p&gt;

&lt;p&gt;The README is mostly just telling you how to start the container and run the scripts in the &lt;code&gt;./code/&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker pull centos:5.11

&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/code/:/var/theHounds/ &lt;span class="nt"&gt;--name&lt;/span&gt; DogHouse &lt;span class="nt"&gt;-it&lt;/span&gt; centos:5.11 /bin/bash

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/theHounds/

&lt;span class="nv"&gt;$ &lt;/span&gt;./SetUpEnv.sh

&lt;span class="nv"&gt;$ &lt;/span&gt;./ReleaseTheHounds.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"But Henry, why are you using a container for this?"&lt;/p&gt;

&lt;p&gt;Great questions! Presently I have three answers for you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We, like a lot of companies, run Red Hat Enterprise Linux in production. Spinning up a CentOS (downstream project from RHEL) server allows me to closely approximate the environment I want my script to run in. This gives me a more similar testing environment than say, Windows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containers are meant to be ethereal. One of the scripts in &lt;code&gt;./code/&lt;/code&gt;, &lt;code&gt;SetUpEnv.sh&lt;/code&gt; creates dirs and files for me to test against. If I need to test again, I can restart the container, and my setup script will create the same env every time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containers don't have access to any local storage that you don't explicitly give them access to. That way, if I mess up my script, I won't accidentally delete a local directory I want to keep.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# EXCERPT FROM SETUPENV.SH:&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/hoodlums

&lt;span class="nb"&gt;touch&lt;/span&gt; /opt/hoodlums/2019-03-07_Thief.zip
&lt;span class="nb"&gt;touch&lt;/span&gt; /opt/hoodlums/2019-06-12_Ruffian.zip
&lt;span class="nb"&gt;touch&lt;/span&gt; /opt/hoodlums/2019-07-25_Vandal.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, once I start up my container and run this script, I'll always have the same environment to test my script against. And that's where &lt;code&gt;./code/ReleaseTheHounds.sh&lt;/code&gt; comes into play.&lt;/p&gt;

&lt;p&gt;This script exists solely to help me get rid of some files. Sometimes that can be as easy as looping over a variable and shredding any files that kind of match.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Set up vars&lt;/span&gt;
&lt;span class="nv"&gt;HOODLUMTYPES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Thief Ruffian Hooligan Delinquent Vandal"&lt;/span&gt;
...
&lt;span class="c"&gt;# A HOODLUMS&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/hoodlums/
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$HOODLUMTYPES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;shred&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 7 &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;.zip&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
...
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"------------------------------"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LEFTOVER FILES IN /opt/Hoodlums/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /opt/hoodlums/&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can run this script inside of my Docker container to make sure that it's catching any edge cases I set up in &lt;code&gt;SetUpEnv.sh&lt;/code&gt; without worrying about accidentally touching my local &lt;code&gt;/opt/&lt;/code&gt; dir on my MacBook Pro. &lt;/p&gt;

&lt;p&gt;Which is good, because I don't want to accidentally nuke Gradle or Vagrant!&lt;/p&gt;

&lt;p&gt;Sometimes I need to run my data through a sanitizer before I can use it to find files.&lt;/p&gt;

&lt;p&gt;For example, one of our inputs is &lt;code&gt;163Killer&lt;/code&gt; and a file we're testing against is &lt;code&gt;0277_Killer.yaml&lt;/code&gt;. We need to extract &lt;code&gt;Killer&lt;/code&gt; to match that yaml file. That's easy enough with an extra loop and some sed magic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;WHALETYPES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"123Fin 456_Gray 495Beluga 385_Livyatan 012_Blue 978Bowhead 149_Humpback 163Killer"&lt;/span&gt;
&lt;span class="nv"&gt;SANITIZEDWHALES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;whaleSanitizer &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
  &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/^[0-9]*//'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/^_*//'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# B WHALES&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$WHALETYPES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;SANITIZEDWHALES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SANITIZEDWHALES&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;whaleSanitizer &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"------------------------------"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LEFTOVER FILES IN /var/lib/docker/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /var/lib/docker/&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without turning this into a Bash post, we're running the &lt;code&gt;WHALETYPES&lt;/code&gt; var through the &lt;code&gt;whaleSanitizer&lt;/code&gt; function and into the fresh &lt;code&gt;SANITIZEDWHALES&lt;/code&gt; var. We're then using that new var to find files we need to shred.&lt;/p&gt;

&lt;p&gt;Then, at the end of the script, I &lt;code&gt;ls&lt;/code&gt; all of the dirs I touched to make sure the files I wanted to get rid of are no longer there.&lt;/p&gt;

&lt;p&gt;After I simplified this a bit in order to share it, it ended up being a pretty simple example.&lt;/p&gt;

&lt;p&gt;I'm spinning up a container, creating a temporary test environment, then running my cleanup script against that test environment. If it doesn't work right, I can make some changes, set my environment back up quickly, and try again. &lt;/p&gt;

&lt;p&gt;An added benefit is that this is easily repeatable. The &lt;code&gt;README.md&lt;/code&gt; file with the instructions on setting up and running the test environment is only 176 bytes. That's right. Bytes.&lt;/p&gt;

&lt;p&gt;When I inevitably need to update this script, pulling down the GitHub repo will take a few seconds. I can make my changes, and have a container stood up and ready to test against in a matter of minutes. Shorter, if I already have the &lt;code&gt;centos:5.11&lt;/code&gt; image pulled locally.&lt;/p&gt;




&lt;p&gt;Hopefully, this makes the benefits of containers seem a little more real. If any of you read this far and have had to spin up containers for a similar kind of project (work or personal) drop it in the comments. Let's get some discussions going and help the newer folks learn when to reach for containers!&lt;/p&gt;

&lt;p&gt;Also, as I work on my Compose -&amp;gt; Kubernetes project/article, I'm also waiting on some fun toys to come in from Amazon. This will for sure be its own article, but I'm hopping on the Raspberry Pi Kubernetes cluster bandwagon.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Photo Credit: &lt;a href="https://www.c4labs.com/product/8-slot-stackable-cluster-case-raspberry-pi-3b-and-other-single-board-computers-color-options/" rel="noopener noreferrer"&gt;https://www.c4labs.com/product/8-slot-stackable-cluster-case-raspberry-pi-3b-and-other-single-board-computers-color-options/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>linux</category>
      <category>bash</category>
    </item>
    <item>
      <title>The One Where It Turns Out I Misunderstood Kubernetes</title>
      <dc:creator>Henry Quinn</dc:creator>
      <pubDate>Fri, 19 Jul 2019 18:15:44 +0000</pubDate>
      <link>https://dev.to/quinncuatro/the-one-where-it-turns-out-i-misunderstood-kubernetes-18b</link>
      <guid>https://dev.to/quinncuatro/the-one-where-it-turns-out-i-misunderstood-kubernetes-18b</guid>
      <description>&lt;p&gt;I just finished &lt;a href="https://twitter.com/nigelpoulton" rel="noopener noreferrer"&gt;Nigel Poulton's&lt;/a&gt; &lt;a href="https://leanpub.com/thekubernetesbook" rel="noopener noreferrer"&gt;The Kubernetes Book&lt;/a&gt;. I highly recommend it, even though it pointed out some pretty big misconceptions I had about how some important K8s components work.&lt;/p&gt;

&lt;p&gt;It's a great surface level intro to the world of Kubernetes and how it can help build projects that can scale and self heal. Excellent for beginners and intermediate users alike.&lt;/p&gt;

&lt;p&gt;I also took some time off from posting. Turns out that DevOps stuff takes a little longer to learn and internalize than I thought. Going to try and scale down to weekly posts and keep this going longer than a month.&lt;/p&gt;

&lt;p&gt;Burnout is a really real thing.&lt;/p&gt;




&lt;p&gt;I've touched on this in some previous posts, but my time with the U.S. Courts was a lot of trial under fire "learn as you go." In most work environments that wouldn't be a problem, but there isn't much in the way of traditional Sr./Jr. developer relationships within the judiciary.&lt;/p&gt;

&lt;p&gt;What that means, in a practical sense, was that I was responsible for teaching myself any technologies that I didn't start the job already knowing.&lt;/p&gt;

&lt;p&gt;At a certain point, I was handed a ColdFusion/Informix/MariaDB application and was tasked with getting the application into a certain amount of other districts within a certain amount of time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a good laugh before your weekend starts, take a look through this &lt;a href="https://henryneeds.coffee/files/MyOldCourtProgrammerJob.pdf" rel="noopener noreferrer"&gt;job posting for my old position&lt;/a&gt; that just went up. I'll be very surprised if they find a developer they're happy with for those job requirements and salary range.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think it's telling about the career path I would eventually take that my first thought wasn't about ColdFusion being a garbage language, but rather about how I would both deploy and maintain this application in multiple courts.&lt;/p&gt;

&lt;p&gt;Enter: containers.&lt;/p&gt;

&lt;p&gt;I had to teach myself Docker, and eventually OpenShift, from scratch. There were a couple of folks working for the Administrative Office in D.C. moonlighting as developer advocates who helped me along the way. I owe the current state of my career to Jonathan, Carl, and Tom; but for the most part, I was learning these complicated technologies in a silo.&lt;/p&gt;

&lt;p&gt;I'm unsure if it was real or false competence that made me think I had a handle on everything as we were rushing towards our initial rollout, but I thought knew everything. Typical 20-something bravado.&lt;/p&gt;

&lt;p&gt;That is, at least until I read &lt;a href="https://leanpub.com/thekubernetesbook" rel="noopener noreferrer"&gt;The Kubernetes Book&lt;/a&gt;. I learned that even though I had monkey wrenched our application into a deployable state, I had three big misconceptions about how Kubernetes works under the hood.&lt;/p&gt;

&lt;p&gt;1.) How services and deployments differ:&lt;/p&gt;

&lt;p&gt;When I was getting our JDash product ready for our initial deployment I was mostly just taking known good .yaml files and modifying them to fit my own needs - basic round peg -&amp;gt; round hole stuff.&lt;/p&gt;

&lt;p&gt;It was enough to get the job done, but I wasn't understanding what I was doing.&lt;/p&gt;

&lt;p&gt;I had a basic understanding that pods were wrapped in containers that can optionally be wrapped in deployments, but didn't have a firm understanding of what these first-class Kubernetes objects provided.&lt;/p&gt;

&lt;p&gt;Turns out that there's a base paradigm of separation of concerns that stated that pods should typically (with a few exceptions) only contain one type of container.&lt;/p&gt;

&lt;p&gt;Then, those pods can be wrapped in deployments. Those deployments can be configured to keep a certain amount of pods available at all times (including rolling updates) so that your applications gain the ability to scale and self heal.&lt;/p&gt;

&lt;p&gt;Thus, the power of containers (mostly easy scaling) in K8s lies in deployments managing pods, rather than the containers themselves.&lt;/p&gt;

&lt;p&gt;Understanding that clicked some things into place for me.&lt;/p&gt;

&lt;p&gt;2.) How PVs and PVCs work:&lt;/p&gt;

&lt;p&gt;I had a loose understanding that PVCs (persistent volume claims) were related to PVs (persistent volumes) in that they both facilitated some kind of persistent data storage to power our ethereal containers.&lt;/p&gt;

&lt;p&gt;However, I thought that a PVC was always what provisioned the space a PV took up.&lt;/p&gt;

&lt;p&gt;Turns out, I was half right.&lt;/p&gt;

&lt;p&gt;Typically, in K8s, you would create a PV that utilized some sort of storage from a storage provider that would then be "claimed" by the PVC. The PVC acts as a ticket that allows a pod to access the storage provisioned in the PV.&lt;/p&gt;

&lt;p&gt;Additionally, though, there are K8s resources called &lt;code&gt;storage classes&lt;/code&gt;. These set up a connection to a storage provisioner that allow for dynamic storage allocations. That way, you can point a pod's PVC to a storage class and have your PV automatically created and connected to your pod. This behavior works across local solutions (NFS, SMB, etc) and cloud services (AWS, Azure, GCE, etc).&lt;/p&gt;

&lt;p&gt;Not having to manually create persistent storage for applications at scale is a HUGE benefit of K8s that I had no solid understanding of.&lt;/p&gt;

&lt;p&gt;3.) What exactly labels do:&lt;/p&gt;

&lt;p&gt;I had played with labels before, but mainly as adding my name as an author to Dockerfiles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;FROM lucee/lucee5:5.0.1.85&lt;/span&gt;

&lt;span class="s"&gt;LABEL author="Henry Quinn &amp;lt;henryquinniv@gmail.com&amp;gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# TOMCAT CONFIGS --&amp;gt; OPTIONAL to implement if you need custom Tomcat config.&lt;/span&gt;
&lt;span class="s"&gt;COPY config/lucee/setenv.sh /usr/local/tomcat/bin/&lt;/span&gt;
&lt;span class="nn"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That said, I had no idea what kind of insane power they provide you with an orchestrator like Kubernetes.&lt;/p&gt;

&lt;p&gt;Turns out labels are what connect everything. Let's take &lt;code&gt;services&lt;/code&gt; for example.&lt;/p&gt;

&lt;p&gt;Services are what enable easy networking within a cluster. Short story is that services provide a stable IP address, DNS name, and port. They handle all of the complicated networking bits of forwarding traffic on to ever-changing amounts of pods, containers, and other resources.&lt;/p&gt;

&lt;p&gt;That way &lt;code&gt;https://domain.tld&lt;/code&gt; always points to your application, regardless of how many pods have been created to accommodate traffic.&lt;/p&gt;

&lt;p&gt;But, as your service is handling load balancing for you, it needs to know which node(s) it can throw requests to. You may have a six node cluster with a particular app only running pods on three of those nodes. If a user tries to visit your application, that service is going to be using &lt;code&gt;labels&lt;/code&gt; to figure out how to handle it.&lt;/p&gt;

&lt;p&gt;That service will be configured to have certain label selectors that will match certain labels you provide to your pods in your yaml. &lt;/p&gt;

&lt;p&gt;In short, those labels appear to be what provide most of the magic in Kubernetes. They're what help your cluster master node draw the complicated map across your entire cluster so that it knows how to navigate any kind of request that comes in.&lt;/p&gt;

&lt;p&gt;Understanding that is really what made everything click for me.&lt;/p&gt;




&lt;p&gt;All in all, I think I was able to get 80% of my way to a solid understanding of Kubernetes on my own.&lt;/p&gt;

&lt;p&gt;And I'm damn proud of that.&lt;/p&gt;

&lt;p&gt;However, reading this short (160 page) book made the last 20% click into place. And that understanding is going to power a big new project I'm picking up at work.&lt;/p&gt;

&lt;p&gt;But more on that later. ;)&lt;/p&gt;




&lt;p&gt;Now that I have a better understanding of K8s, I'm going to &lt;code&gt;$ kubectl apply myWeekend.yaml&lt;/code&gt;. See y'all next week. Until then, stay frosty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://henryneeds.coffee" rel="noopener noreferrer"&gt;https://henryneeds.coffee&lt;/a&gt;&lt;br&gt;
&lt;a href="https://henryneeds.coffee/blog" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;&lt;br&gt;
&lt;a href="https://linkedin.com/in/henryquinniv" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/quinncuatro" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>docker</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
