<?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: Mike Bobadilla</title>
    <description>The latest articles on DEV Community by Mike Bobadilla (@mikebobadilla).</description>
    <link>https://dev.to/mikebobadilla</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%2F176987%2F7f3f8029-6b60-4fe5-a901-695fc4b72464.png</url>
      <title>DEV Community: Mike Bobadilla</title>
      <link>https://dev.to/mikebobadilla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikebobadilla"/>
    <language>en</language>
    <item>
      <title>Building a product part 2</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Fri, 29 Jan 2021 06:16:55 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/building-a-product-part-2-7ld</link>
      <guid>https://dev.to/mikebobadilla/building-a-product-part-2-7ld</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OiWTMyY---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1523726491678-bf852e717f6a%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDMxfHx1aS91eHxlbnwwfHx8%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OiWTMyY---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1523726491678-bf852e717f6a%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDMxfHx1aS91eHxlbnwwfHx8%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" alt="Building a product part 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the last post we created our MVP, setup our Gitlab repository, setup our hosting on Vercel, and pointed our domain to Vercel. It sounds like a lot and it kind of is, but the point was to just get the most minimal app deployed. This serves as the band-aid to delivering something useful to the internet, and once the first one is done, it becomes addictive. The main goal is deploy as much as possible without feature creep becoming an issue.&lt;/p&gt;

&lt;p&gt;The plan for today is going to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding analytics from &lt;a href="https://plausible.io/"&gt;Plausible Analytics&lt;/a&gt;.

&lt;ul&gt;
&lt;li&gt;The reason I went with them is because while they aren't free, it's minimal and I'm not just giving a ton of user data to Google.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Adding &lt;a href="https://tailwindcss.com/"&gt;Tailwinds&lt;/a&gt; and some minor styling to freshen up the site.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Adding the analytics script
&lt;/h3&gt;

&lt;p&gt;First you have to head over to &lt;a href="https://plausible.io/"&gt;Plausible&lt;/a&gt; and create an account. They give a 30 day trial without a credit card so no excuses. Once you have the account, &lt;code&gt;Add a website&lt;/code&gt; and create the snippet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZceYdDYD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.15.47-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZceYdDYD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.15.47-PM.png" alt="Building a product part 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now since we're using NextJS we need to use one their special pages named &lt;a href="https://nextjs.org/docs/advanced-features/custom-document"&gt;document.js&lt;/a&gt; and it goes in the pages directory. Here's what my &lt;code&gt;_document.js&lt;/code&gt; looks like.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Document, { Html, Head, Main, NextScript } from "next/document";

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);
    return { ...initialProps };
  }

  render() {
    return (
      &amp;lt;Html&amp;gt;
        &amp;lt;Head&amp;gt;
          &amp;lt;script
            async
            defer
            data-domain="whenarethefights.com"
            src="https://plausible.io/js/plausible.js"
          &amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;/Head&amp;gt;
        &amp;lt;body&amp;gt;
          &amp;lt;Main /&amp;gt;
          &amp;lt;NextScript /&amp;gt;
        &amp;lt;/body&amp;gt;
      &amp;lt;/Html&amp;gt;
    );
  }
}

export default MyDocument;

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

&lt;/div&gt;



&lt;p&gt;Give it a quick save, commit, push, and go to Plausible to make sure it's working. &lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m "Add analytics" &amp;amp;&amp;amp; git push&lt;/code&gt;. Then you get to see this cool screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--at0LFfju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.24.16-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--at0LFfju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.24.16-PM.png" alt="Building a product part 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Tailwinds
&lt;/h3&gt;

&lt;p&gt;So one of the main benefits of using something popular is getting pretty straightforward documentation. Here is how to &lt;a href="https://tailwindcss.com/docs/guides/nextjs"&gt;setup tailwinds with NextJs&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install tailwindcss@latest postcss@latest autoprefixer@latest
git commit -am "Add Tailwinds, postcss, and autoprefixer"

npx tailwindcss init -p

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

&lt;/div&gt;



&lt;p&gt;Following the instructions I updated &lt;code&gt;tailwind.config.js&lt;/code&gt; and &lt;code&gt;styles/globals.css&lt;/code&gt; to look like the following&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// tailwinds.config.js
module.exports = {
  purge: ['./pages/ **/*.{js,ts,jsx,tsx}', './components/** /*.{js,ts,jsx,tsx}'],
  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}


/* ./styles/globals.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

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

&lt;/div&gt;



&lt;p&gt;Save and commit again. This steps important just in case shit hits the fan, you have a known good starting place.&lt;br&gt;&lt;br&gt;
&lt;code&gt;git commit add . &amp;amp;&amp;amp; git commit -m "Configure Tailwind"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating the style
&lt;/h3&gt;

&lt;p&gt;So im going to cheat here and just go to &lt;a href="https://tailwindui.com/"&gt;https://tailwindui.com/&lt;/a&gt;. The reason being is I'm not the best designer and it's just easier. If you don't want to pay for this, there is an alternative free one that I've seen mentioned a few times &lt;a href="https://kitwind.io/"&gt;https://kitwind.io/&lt;/a&gt;. I'm not going to post the code because I feel like I would be distributing it, but look at the source if you want 🤷‍♂️. This is the component I'll be using. It's clean and has some badges on it. I think it's pretty close to what I need.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Muqm6hS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.55.11-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Muqm6hS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-9.55.11-PM.png" alt="Building a product part 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And heres the final layout with our current info:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xMDW538_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-10.14.10-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xMDW538_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-28-at-10.14.10-PM.png" alt="Building a product part 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think thats a good stopping point, so let's save, commit, and push. Once thats up we can start thinking about our next deploy with will be letting React build the layout for us.&lt;/p&gt;




&lt;p&gt;This is part of my experiment to try and write 250,000 words in 2021. It's not accurate and is just meant to loosely track progress.  &lt;/p&gt;

&lt;p&gt;Current word count: ~3376 / 250,000&lt;br&gt;&lt;br&gt;
Daily average: ~121&lt;br&gt;&lt;br&gt;
Daily average Goal: ~685&lt;/p&gt;

</description>
      <category>tailwinds</category>
      <category>analytics</category>
      <category>ux</category>
    </item>
    <item>
      <title>Building a product (whenarethefights)</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Thu, 28 Jan 2021 16:30:03 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/building-a-product-whenarethefights-3bc5</link>
      <guid>https://dev.to/mikebobadilla/building-a-product-whenarethefights-3bc5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LGx4lNjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1573867607131-872f83689352%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDV8fHBsYW58ZW58MHx8fA%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LGx4lNjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1573867607131-872f83689352%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDV8fHBsYW58ZW58MHx8fA%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" alt="Website layout doodles."&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@halacious?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Hal Gatewood&lt;/a&gt; / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been meaning to rebuild &lt;a href="https://whenarethefights.com"&gt;When are the fights&lt;/a&gt; and I keep getting stuck worrying about where the data is going to come from, how cool I can make it, and if I want to use any new technologies. I decided I didn't care anymore and just wanted to go back to when I first made the site. It was just a static page hosted on &lt;a href="https://netlify.com"&gt;Netlify&lt;/a&gt;. I decided to document the process of how I break down my process on building products, or at least how I try and approach them.&lt;/p&gt;

&lt;h3&gt;
  
  
  What problem are you solving
&lt;/h3&gt;

&lt;p&gt;I want to see what fights are coming up in the &lt;a href="http://ufc.com"&gt;UFC&lt;/a&gt;, &lt;a href="http://bellator.com"&gt;Bellator&lt;/a&gt;, &lt;a href="http://www.glorykickboxing.com/"&gt;Glory&lt;/a&gt;, etc. It's a problem that scratched my own itch so I'm not too worried how many people come to the site.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the MVP
&lt;/h3&gt;

&lt;p&gt;For this site I am thinking a static page with a few upcoming fights should work. Nothing crazy, just a static site. The hardest part of this is not trying to over-engineer at the very beginning. The only exception I am making currently is that I am going to use NextJS, and the only reason I am choosing that is because I know something more dynamic might be needed later. It's a tiny bit overkill, but it's ok.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology that is needed/wanted
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;NextJS for building&lt;/li&gt;
&lt;li&gt;Vercel for hosting&lt;/li&gt;
&lt;li&gt;Gitlab for tracking changes and CI/CD&lt;/li&gt;
&lt;li&gt;Cloudflare for DNS and CDN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a bit much, but I usually set up deployments before I build anything. The reason for this is that gearing up for deploying code after a session of coding starts off exciting and then kills the mode, so I prefer to start from a barebones app to track what ends up breaking the deploy. It's like TDD for deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  How will this be deployed
&lt;/h3&gt;

&lt;p&gt;Some sort of hook via gitlab and vercel. The goal here is whenever something is merged to master, we get a new build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Settings up the first deploy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setup the NextJS boilerplate
&lt;/h3&gt;

&lt;p&gt;I'm just going to follow the &lt;a href="https://nextjs.org/docs/getting-started#setup"&gt;getting started page&lt;/a&gt; on nextjs and get that deployed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rp8alP2G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.37.45-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rp8alP2G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.37.45-PM.png" alt="Screen-Shot-2021-01-27-at-10.37.45-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting it on Git{lab, hub}
&lt;/h3&gt;

&lt;p&gt;Follow the instructions on &lt;a href="https://gitlab.com/projects/new"&gt;Gitlab&lt;/a&gt; if you're using Gitlab. Github has something similar.&lt;/p&gt;

&lt;p&gt;Once that's done you will get instruction how to add your project to the repo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IcOfqEgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.46.03-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IcOfqEgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.46.03-PM.png" alt="Screen-Shot-2021-01-27-at-10.46.03-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting Vercel
&lt;/h3&gt;

&lt;p&gt;Luckily Vercel has a connect gitlab project button so it's basically just a one-click deploy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M0kEJCcZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.51.08-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M0kEJCcZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.51.08-PM.png" alt="Screen-Shot-2021-01-27-at-10.51.08-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---1s3iozu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.51.52-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---1s3iozu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.51.52-PM.png" alt="Screen-Shot-2021-01-27-at-10.51.52-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now &lt;a href="https://whenarethefights-com.vercel.app/"&gt;https://whenarethefights-com.vercel.app/&lt;/a&gt; has my app running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HSsxnElZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.52.13-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HSsxnElZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-10.52.13-PM.png" alt="Screen-Shot-2021-01-27-at-10.52.13-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Now lets add some fights
&lt;/h3&gt;

&lt;p&gt;I'm just going to put the next couple UFC fights on there and we'll call it finished so we can point our domain to our app on Vercel. We're just going to create the most basic and ugly site. No one cares, seriously.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Head from "next/head";
import styles from "../styles/Home.module.css";

export default function Home() {
  return (
    &amp;lt;div className={styles.container}&amp;gt;
      &amp;lt;Head&amp;gt;
        &amp;lt;title&amp;gt;¯\_(ツ)_/¯ When are the fights&amp;lt;/title&amp;gt;
        &amp;lt;link rel="icon" href="/favicon.ico" /&amp;gt;
      &amp;lt;/Head&amp;gt;

      &amp;lt;main className={styles.main}&amp;gt;
        &amp;lt;div className={styles.grid}&amp;gt;
          &amp;lt;a
            href="https://www.ufc.com/event/ufc-fight-night-february-6-2021"
            className={styles.card}
            target="_blank"
          &amp;gt;
            &amp;lt;h3&amp;gt;UFC Fight Night - Overeem vs Volkov&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt;Sat, Feb 6 / 5:00 PM PST&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;UFC APEX Las Vegas , NV United States&amp;lt;/p&amp;gt;
          &amp;lt;/a&amp;gt;

          &amp;lt;a
            href="https://www.ufc.com/event/ufc-258"
            className={styles.card}
            target="_blank"
          &amp;gt;
            &amp;lt;h3&amp;gt;UFC 258 - Usman vs Burns&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt;Sat, Feb 13 / 7:00 PM PST&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;UFC APEX Las Vegas , NV United States&amp;lt;/p&amp;gt;
          &amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QDTpIXMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-11.06.59-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QDTpIXMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/Screen-Shot-2021-01-27-at-11.06.59-PM.png" alt="Screen-Shot-2021-01-27-at-11.06.59-PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save and push 🚀&lt;/p&gt;

&lt;p&gt;Now that the ci/cd stuff is done, let's point whenarethefights.com to our app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pointing the domain to our vercel app
&lt;/h3&gt;

&lt;p&gt;I followed &lt;a href="https://vercel.com/docs/custom-domains"&gt;these instructions&lt;/a&gt; loosley to get it working. I did however go through cloudflare as well so there was &lt;a href="https://vercel.com/knowledge/using-cloudflare-with-vercel"&gt;an extra step&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;This is part of my experiment to try and write 250,000 words in 2021. It's not accurate and is just meant to loosely track progress.  &lt;/p&gt;

&lt;p&gt;Current word count: ~2723 / 250,000&lt;br&gt;&lt;br&gt;
Daily average: ~101&lt;br&gt;&lt;br&gt;
Daily average Goal: ~685&lt;/p&gt;

</description>
      <category>product</category>
    </item>
    <item>
      <title>Update on 250,000 #1</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Tue, 26 Jan 2021 05:53:56 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/update-on-250-00-1-4jd7</link>
      <guid>https://dev.to/mikebobadilla/update-on-250-00-1-4jd7</guid>
      <description>&lt;p&gt;I started trying to do this challenge without any sort of schedule or plan. I just started writing about whatever came to my mind. The problem with that thinking is it really only works for tweets and small paragraphs. I was stuck just getting half-baked idea on the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problems I noticed:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I spent way too much time worrying about hitting my daily word count that It stopped me from even writing anything down.&lt;/li&gt;
&lt;li&gt;I found myself looking at ways to monetize the site with newsletters, affiliate links, etc. No ones even read the fucking thing.&lt;/li&gt;
&lt;li&gt;I was being really shy for whatever reason while I was writing.&lt;/li&gt;
&lt;li&gt;I completely forgot that this was just supposed to be fun and who give a fuck about anything else.&lt;/li&gt;
&lt;li&gt;I was worrying too much about writing the way that I speak. I say fuck. so what.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was listening to Atomic Habits and in the first chapter my problem was pointed out; I was spending too much thinking about the goal and not enough time thinking about the process (He called it a system). So now I need to create a system that will work for me and help me succeed in this goal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action Items:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Update the word count to reflect the year instead of whatever I have now.&lt;/li&gt;
&lt;li&gt;Spend a day or two outlining a topic and working on a rough draft. Then I can write a longer post but meet my daily word count.&lt;/li&gt;
&lt;li&gt;Don't worry if I hit the word count or not. Just work on the habit of writing consistently.&lt;/li&gt;
&lt;li&gt;Fuck around more. This is just a personal life goal.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Current word count: ~1964 / 250,000&lt;br&gt;&lt;br&gt;
Daily average: ~79&lt;br&gt;&lt;br&gt;
Daily average Goal: ~685&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting up a Raspberry Pi Cluster</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Tue, 12 Jan 2021 05:31:08 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/setting-up-a-raspberry-pi-cluster-1o1d</link>
      <guid>https://dev.to/mikebobadilla/setting-up-a-raspberry-pi-cluster-1o1d</guid>
      <description>&lt;p&gt;For whatever reason, in my head, running software on a raspberry pi is a lot cooler than running it on my macbook. I have one running &lt;a href="https://pi-hole.net/"&gt;pi-hole&lt;/a&gt; and a couple others just lying around, so I thought of something to use them for. I have a couple web scrapers running for whenarethefights.com on lambda and thought it would be nice to move those to a pi-cluster.&lt;/p&gt;

&lt;p&gt;I already had 3 pis so here was my shopping list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3bDEoFY"&gt;Rack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2XwDfrJ"&gt;Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3qcEg4m"&gt;Ethernet Cables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2Lfamhj"&gt;microSD Cards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing the OS
&lt;/h3&gt;

&lt;p&gt;So after I got everything I just need to flash each sd card with an OS. A list of them can be &lt;a href="https://www.raspberrypi.org/software/operating-systems/"&gt;found here&lt;/a&gt;. I chose Ubuntu Server for no reason other than I have used it before on &lt;a href="https://m.do.co/c/aacdd15c8d35"&gt;Digital Ocean&lt;/a&gt;. To flash each card I used &lt;a href="https://www.balena.io/etcher/"&gt;Etcher&lt;/a&gt;. Its pretty straight forward and keeps me from having to use dd. I knew I wanted to run these in a headless mode so I need to place an empty file named &lt;code&gt;ssh&lt;/code&gt; on each drive after they were done flashing. To do this you will need to re-mount the drive after Etcher ejects it; The easiest way to do that on Mac is to use the disk utility.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GTJeOvP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GTJeOvP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-6.png" alt=""&gt;&lt;/a&gt;This is the disk utility panel&lt;/p&gt;

&lt;p&gt;Once mounted, you can open up the terminal to place the empty file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /Volumes
# find the drive with the rpi OS
cd &amp;lt;OS Drive&amp;gt;
touch ssh
cd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unmount the drive and repeat for each drive you have&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up each Raspberry Pi
&lt;/h3&gt;

&lt;p&gt;I like to set one pi up at a time because each pi sets its hostname as ubuntu and I don't want to arp for the ip of each one and guess. My plan was to name each pi green-pi, white-pi, etc according to whatever color ethernet cable is plugged into it. Load all the sd cards but only plug one of the pi in and wait a min. You should now be able to ssh into the first pi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh ubuntu@ubuntu

# When asked for a password, enter 'ubuntu'. You will be asked to change it to a new one.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to change the hostname and restart so our dnsserver picks up the new name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hostnamectl set-hostname green-pi
sudo reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you try to ssh to &lt;code&gt;ubuntu&lt;/code&gt; again it won't let you since the ssh keys changed, so you will need to delete &lt;code&gt;ubuntu&lt;/code&gt; from known users. Open up &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; and delete the line with &lt;code&gt;ubuntu&lt;/code&gt; on it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vim ~/.ssh/known_hosts
ubuntu,192.168.0.88 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGGRsJ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeat for each pi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log into each Pi
&lt;/h3&gt;

&lt;p&gt;So now that they are all set up, we need to log into each one so we know we can. Since the hostname was updated we should be able to use the new hostname.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh ubuntu@green-pi

# Enter the new password you created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we know that works, let's copy our keys over so we don't need to enter a password anymore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-copy-id ubuntu@green-pi

# Enter the password again. When it's successful it will log you out and tell you to login again.

ssh ubuntu@green-pi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should be able to login without a password now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup your ssh config
&lt;/h3&gt;

&lt;p&gt;Less typing is always better for me so the final step is to set our ssh config so I don't have to type the username anymore. Open up ~/.ssh/config and place the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host green-pi
  HostName green-pi
  User ubuntu

Host white-pi
  HostName white-pi
  User ubuntu

Host blue-pi
  HostName blue-pi
  User ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After adding that you can just ssh with the hostname and be done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh green-pi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that the pi cluster is set up it can be used to do anything. We can do all the buzzword things like Blockchain, Kubernetes, crypto mining.&lt;/p&gt;

&lt;p&gt;Just kidding, we're just gonna put some web scrapers on them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N9SKOcFH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1562813733-b31f71025d54%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDV8fGhhY2tlcnxlbnwwfHx8%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N9SKOcFH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1562813733-b31f71025d54%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDV8fGhhY2tlcnxlbnwwfHx8%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D1080" alt="Pictured - a man at a computer disguised as an anonymous hacker wearing a Guy Fawkes mask."&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@cbpsc1?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Clint Patterson&lt;/a&gt; / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Current word count: ~1681 / 250,000&lt;br&gt;&lt;br&gt;
Daily average: ~560&lt;/p&gt;

</description>
      <category>raspberrypi</category>
      <category>ssh</category>
    </item>
    <item>
      <title>My Remote Workflow</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Fri, 08 Jan 2021 04:59:24 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/my-remote-workflow-5dl2</link>
      <guid>https://dev.to/mikebobadilla/my-remote-workflow-5dl2</guid>
      <description>&lt;p&gt;I love my 2012 Macbook Pro. It got me through school, helped me learn JavaScript and Python, got me my first full time tech job, etc. I took it everywhere and used it all the time, but it started to get old. JS libraries and frameworks began to become extremely bloated and CPU intensive for development. All those libraries/frameworks are great when optimized for production, but to keep a great developer experience it comes at a cost. Now it's more about standing up an entire infrastructure locally like PostgresSQL, Redis, , plus all my Chrome tabs. My poor MBP couldn't handle it all so I started looking at ways to offload as much as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KcS-n0Ne--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KcS-n0Ne--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The easiest thing to offload is the database layer. Some people like to use sqlite, but I'm not really a fan since I like to use one DB in all stages to avoid any surprises. The easiest and free way is stand one up on &lt;a href="https://mikebobadilla.com/my-remote-workflow/heroku.com"&gt;Heroku&lt;/a&gt; or something similar. The &lt;a href="https://devcenter.heroku.com/articles/heroku-cli"&gt;heroku-cli&lt;/a&gt; is pretty nice and easy to use and only downside is having to learn it like every other abstraction layer. This method just means for every DB you want to setup, you have to go through the same process and keep the URI saved locally. Not a big deal, but can be kind of annoying.&lt;/p&gt;

&lt;p&gt;This worked fine for persisting data, but I still need a backend server and a frontend. So usually it's something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--42Qm6dIr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--42Qm6dIr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it's actually two servers running two sets of code. Frontend is usually a React app using Create React App and the backend is some flavor of Node (Express, Fastify, Hapi). This is pretty standard but I really only wanted the frontend code to run on my laptop since Im usually just on the couch or my bed and my desktop is in my office. So the next step was to just run the backend code on my desktop like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u6h5twGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u6h5twGr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is better. Well, not really. Now if I want to update both the backend and frontend I have to do it in two places. I'm kind of lazy, so I'm thinking the ideal setup is to keep the everything in one place and treat my laptop as the client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8m9OFnkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8m9OFnkW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now my laptop is just running a browser and I can connect to my react app with &lt;code&gt;http://desktop:3000&lt;/code&gt;. The only problem is now I have to update my frontend code to point to the desktop IP instead of &lt;code&gt;localhost&lt;/code&gt;. I don't want to that. I just want to hit everything with &lt;code&gt;localhost&lt;/code&gt; like I would be if I was running everything on my laptop. &lt;a href="https://www.ssh.com/ssh/tunneling/example#what-is-ssh-port-forwarding,-aka-ssh-tunneling?"&gt;SSH port forwarding&lt;/a&gt;, or &lt;a href="https://www.ssh.com/ssh/tunneling/"&gt;SSH tunneling&lt;/a&gt;, to the rescue.&lt;/p&gt;

&lt;p&gt;So I would open up my terminal and type the following to connect to my CRA running on my desktop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -L 3000:localhost:3000 desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would also open up another session to connect to my backend service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -L 8080:localhost:8080 desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P4SSzGJt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4SSzGJt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mikebobadilla.com/content/images/2021/01/image-5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This works and is pretty neat, but like I said earlier, I'm lazy. Two separate shell sessions just to connect to two ports is a bit redundant and wasteful, we can let our ssh config take care of this. So let's open ~/.ssh/config and add the following lines&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host remote-desktop
  HostName &amp;lt;desktop-ip or hostname&amp;gt;
  User ubuntu
  LocalForward 3000 localhost:3000
  LocalForward 8080 localhost:8080

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

&lt;/div&gt;



&lt;p&gt;The reason I create a new host for &lt;code&gt;remote-desktop&lt;/code&gt; is because I don't want it linked to the same hostname since it will try to open the same ports and create errors. I think it's better to keep it separated.&lt;/p&gt;

&lt;p&gt;It is still a work in progress, but I'll cover how I have it set up to edit code remotely as well using VSCode and Tmux in the next article.&lt;/p&gt;

&lt;p&gt;Current word count: ~1000 / 250,000&lt;br&gt;&lt;br&gt;
Daily average: ~500&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The road to 250,000 words</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Wed, 06 Jan 2021 16:40:31 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/the-road-to-250-000-words-3l9j</link>
      <guid>https://dev.to/mikebobadilla/the-road-to-250-000-words-3l9j</guid>
      <description>&lt;p&gt;Im not even sure where to start, but &lt;code&gt;250,000 / 350 = ~715&lt;/code&gt; so that sounds  kinda doable. So the thinking is that I write around 715 words a day and by the end of the year, I will have written 250,000 words. I'm sure most of it will be crap, but who cares. At this point I'm writing for myself.&lt;/p&gt;

&lt;p&gt;I always wanted to try and write so the main topics I am thinking of writing about are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Deploying code&lt;/li&gt;
&lt;li&gt;Mentality&lt;/li&gt;
&lt;li&gt;Stuff I find interesting&lt;/li&gt;
&lt;li&gt;My family (maybe)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the programming posts that I work on I am going to avoid beginner tutorials. I think there is plenty of content, made by really good developers, so Im not going to do that. The main focus here will be things that save me time and stress.&lt;/p&gt;

&lt;p&gt;Deploying code is weird. I remember just using FTP to push my new pages to my shared hosting provider. Now, you can do a JAM stack, Serverless, VPS, blah blah blah. There are so many that it's a bit overwhelming. Deployment posts will be more of a documentation for myself instead of a tutorial. I will be writing for my future self, kinda like coding.&lt;/p&gt;

&lt;p&gt;Mentality posts are going to be the most difficult ones since they can be super intimate. I hope these posts can shed some light on how much a toll imposter syndrome can take on you. I still struggle with imposter syndrome every day, so maybe these will be a bit therapeutic and might actual help someone else.&lt;/p&gt;

&lt;p&gt;My things Im interested in posts are the ones I am actually looking forward to. I like a lot of random shit and I am hoping this will give me reason to just share some weirdness with others. And also for me to remember what my flavor of the week was.&lt;/p&gt;

&lt;p&gt;Im sure the word count will go up as I write more of these, but I just need to get the first one out.&lt;/p&gt;

&lt;p&gt;Current word count: 343 / 250,000&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My last year with a side project</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Sat, 04 Jan 2020 03:19:25 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/my-last-year-with-a-side-project-7na</link>
      <guid>https://dev.to/mikebobadilla/my-last-year-with-a-side-project-7na</guid>
      <description>&lt;p&gt;I started &lt;a href="https://whenarethefights.com"&gt;https://whenarethefights.com&lt;/a&gt; a year ago now and it kinda flew by. It all started out with a post on &lt;a href="https://www.reddit.com/r/MMA/comments/8js200/i_created_a_site_that_has_a_countdown_to_the_next/"&gt;Reddit&lt;/a&gt; and I was completely shocked that more than just me had a use for it. I  was immediately starting to think of ways to improve the site and the  easiest way to do so. I tried to listen to everyone on Reddit and tried  to find ways to improve the way I collected fights. This was a mistake. I  forgot about the actual problem I was trying to solve and that was just  to let people know when the next fight was. Over the last couple weeks I  have started to think about how I can just go back to square one and do  what I set out to do. I wanted to build a community around combat  sports in the spirit of &lt;a href="https://www.mixedmartialarts.com/forums"&gt;The Underground&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/MMA/"&gt;/r/mma&lt;/a&gt;. These were the places that I found out about all the fights that were coming up and which fighters to pay attention to.&lt;/p&gt;

&lt;p&gt;Since  I started it, I went through 3 designs on the frontend and one change  on the backend. The site first started out as a React app using &lt;a href="https://facebook.github.io/create-react-app/docs/getting-started"&gt;Create React App&lt;/a&gt;, hosted on &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; (where this is now) just to get things moving. I quickly found out that Google’s search results weren’t really nice for &lt;a href="https://jamstack.org/"&gt;JAM&lt;/a&gt; stacks and being that I wasn’t well versed in SEOfu, I thought maybe just use a static site generator. I wanted to mess around with &lt;a href="https://www.gatsbyjs.org/"&gt;GatsbyJS&lt;/a&gt;,  so why not. It’s been one of the better decisions I made since starting  the project. Another big change was switching my data store from  Google’s Firebase to Postgres on Heroku with &lt;a href="https://hasura.io/"&gt;Hasura&lt;/a&gt;.  I’m at the point now where I want to start trying to build a community  where smaller promotions and other users can add events. I created &lt;a href="https://www.reddit.com/r/whenarethefights"&gt;/r/whenarethefights&lt;/a&gt; for a spot to talk about some future ideas.&lt;/p&gt;

&lt;p&gt;Some things I have planned for the next few months are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly newsletter on Sundays with upcoming fights and results&lt;/li&gt;
&lt;li&gt;Accounts with locations and preferences&lt;/li&gt;
&lt;li&gt;Social media sharing and notifications&lt;/li&gt;
&lt;li&gt;New design with a smaller payload. I want to ditch Semantic UI&lt;/li&gt;
&lt;li&gt;Once  ^ happens I can start thinking about an native app for people that  prefer something like that, if there is enough demand for it&lt;/li&gt;
&lt;li&gt;Open up the API to the public so other sites can let people know when the fights are&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here  is the last year on Google Analytics. Every spike is a Saturday, the  common fight day during the week. I think the most interesting part  about this is you can actually see when bigger fights are happening.  Data is pretty cool.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting up git autocomplete on mac</title>
      <dc:creator>Mike Bobadilla</dc:creator>
      <pubDate>Thu, 05 Sep 2019 02:39:32 +0000</pubDate>
      <link>https://dev.to/mikebobadilla/setting-up-git-autocomplete-on-mac-31ol</link>
      <guid>https://dev.to/mikebobadilla/setting-up-git-autocomplete-on-mac-31ol</guid>
      <description>&lt;p&gt;Mac's git doesn't come with auto complete, which is obnoxious, so I just run this is on my new systems. You don't have to do it this way and just piece it together for yourself using the &lt;a href="https://git-scm.com/book/en/v1/Git-Basics-Tips-and-Tricks"&gt;git site&lt;/a&gt; like I did.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd
curl -O https://github.com/git/git/blob/master/contrib/completion/git-completion.bash
echo "source ~/git-completion.bash" &amp;gt;&amp;gt; ~/.bash_profile
source ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
This is the code I run. Trust but verify ☑️





&lt;p&gt;This is also stored in my &lt;a href="https://mikebobadilla.com/current-setup/"&gt;current setup page&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
