<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Corey Schaf</title>
    <description>The latest articles on Forem by Corey Schaf (@coreyjs).</description>
    <link>https://forem.com/coreyjs</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%2F44598%2F6ff2a619-87e7-4123-b1f6-8d07a261f754.jpeg</url>
      <title>Forem: Corey Schaf</title>
      <link>https://forem.com/coreyjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/coreyjs"/>
    <language>en</language>
    <item>
      <title>Don't think of it as "Quitting"</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Thu, 22 Apr 2021 15:52:13 +0000</pubDate>
      <link>https://forem.com/coreyjs/don-t-think-of-it-as-quitting-4dmd</link>
      <guid>https://forem.com/coreyjs/don-t-think-of-it-as-quitting-4dmd</guid>
      <description>&lt;h2&gt;
  
  
  Lets talk about leaving one job for another,
&lt;/h2&gt;

&lt;p&gt;and why this is scary, stressful at times but important to our growth.  &lt;/p&gt;

&lt;p&gt;The first thing is the idea of “Quitting your job”.  This in itself has a negative connotation.  That you “Quit” on your team, “Quit” on your company and let people down you worked with.  Let's take a step back and reframe how we think about quitting.  First let's not call it quitting, let us call it leaving, resigning your current position or just moving on to new opportunities.  Let's remove that negative sentiment.  &lt;/p&gt;

&lt;p&gt;Second, let's not think of it as failing your teammates and abandoning the company.  Think of it as the company failed to set you up for success.  The company failed you and you have recognized that it is time to take action and invest in yourself, your happiness and your growth as a person and engineer.  There are many reasons why we move on to different places in our careers and it is often a difficult decision to make especially when you are close with your team, and these moments can be bittersweet, but in the end you need to trust yourself and your intuition on what is best for you in this point in time.  You do not want to look back in years time and ask yourself “what if….I took that offer… what if I had the courage to take that interview and overcome imposter syndrome…what if I trusted myself in those moments”. &lt;/p&gt;

&lt;p&gt;I have said this before, but we are a sum of our experiences in life, both personally and professionally.  If those experiences and short and shallow then we are doing ourselves an injustice in our development.  This is the point in my writing where I usually ramble and let the brain to the typing, and I really want to quote a line from Transformers 1 but the other movies were so terrible I doubt anyone would remember, but fifty years from now and you are looking back at your life don’t you wanna say you had the guts to get in the car.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>motivation</category>
      <category>growth</category>
    </item>
    <item>
      <title>Quick Bit:  Github Action to Test a Rails App</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Mon, 19 Apr 2021 20:08:56 +0000</pubDate>
      <link>https://forem.com/coreyjs/quick-bit-github-action-to-test-a-rails-app-1k0a</link>
      <guid>https://forem.com/coreyjs/quick-bit-github-action-to-test-a-rails-app-1k0a</guid>
      <description>&lt;h2&gt;
  
  
  Hello there!
&lt;/h2&gt;

&lt;p&gt;In this quick little post I am going to quickly show how I built a Github Action that will run my Rails application's test suite.  Now there are many posts on this topic, but I legit could not get anything I found on google to work.  So after "days" of banging my head against the wall I was able to piece together a working Github Action.  So if there is anyone in a similar place I hope this helps.  As always, you can find me on &lt;a href="https://twitter.com/corey_s_"&gt;twitter&lt;/a&gt;, cheers.&lt;/p&gt;

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

&lt;p&gt;For my Ruby on Rails application I am using the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rails v6.1.3.1&lt;/li&gt;
&lt;li&gt;Postgres v12&lt;/li&gt;
&lt;li&gt;Standard minitest rails integration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;On my many pushes I would like to have a Github Action run that verifies my code and tests.  This should also test any branch that is set to be PR'd into the &lt;code&gt;main&lt;/code&gt; branch.  Also for note, this is a personal project so I commit a lot and my commit msg's are quite sparse.&lt;/p&gt;

&lt;h3&gt;
  
  
  In the Rails Application.
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;config/database.yml&lt;/code&gt; update the settings to use the env vars that we will establish later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;test:
  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;
  &lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV.fetch('PG_DATABASE', 'myapp_test') %&amp;gt;
  host:     &amp;lt;%=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'PG_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="s1"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="ss"&gt;username: &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV.fetch('PG_USER', nil) %&amp;gt;
  password: &amp;lt;%=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'PG_PASSWORD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="ss"&gt;port:     &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= ENV.fetch('PG_PORT', 5432) %&amp;gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  And the Github Action
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Rails&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp_registry&lt;/span&gt;
  &lt;span class="na"&gt;DB_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
  &lt;span class="na"&gt;DB_USERNAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp&lt;/span&gt;
  &lt;span class="na"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;


&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;tests&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="s"&gt;Tests&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:12&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp_test&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
          &lt;span class="s"&gt;--health-cmd pg_isready&lt;/span&gt;
          &lt;span class="s"&gt;--health-interval 10s&lt;/span&gt;
          &lt;span class="s"&gt;--health-timeout 5s&lt;/span&gt;
          &lt;span class="s"&gt;--health-retries 5&lt;/span&gt;
    &lt;span class="na"&gt;steps&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="s"&gt;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&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="s"&gt;Setup Ruby&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ruby/setup-ruby@v1&lt;/span&gt;
        &lt;span class="c1"&gt;#with:&lt;/span&gt;
        &lt;span class="c1"&gt;#  ruby-version: 2.7.2 not needed with .ruby-version file&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="s"&gt;Setup Node&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10.18.0&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="s"&gt;Find yarn cache location&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yarn-cache&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "::set-output name=dir::$(yarn cache dir)"&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="s"&gt;JS package cache&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.yarn-cache.outputs.dir }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}&lt;/span&gt;
          &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-yarn-&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="s"&gt;Install packages&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;yarn install --pure-lockfile&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="s"&gt;Install PostgresSQL 12 Client&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;sudo apt-get -yqq install libpq-dev&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="s"&gt;Cache Ruby Gems&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vendor/bundle&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}&lt;/span&gt;
          &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;${{ runner.os }}-gems-&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="s"&gt;Bundle Install&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;bundle config path vendor/bundle&lt;/span&gt;
          &lt;span class="s"&gt;bundle install --jobs 4 --retry 3&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="s"&gt;Setup test database and run tests&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
          &lt;span class="na"&gt;PG_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
          &lt;span class="na"&gt;PG_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp_test&lt;/span&gt;
          &lt;span class="na"&gt;PG_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp&lt;/span&gt;
          &lt;span class="na"&gt;PG_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
          &lt;span class="na"&gt;WITH_COVERAGE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;DISABLE_SPRING&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;bin/rails db:setup&lt;/span&gt;
          &lt;span class="s"&gt;bin/rails test&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="s"&gt;Upload Code Coverage&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&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="s"&gt;code-coverage&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;coverage/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Where is this file?
&lt;/h3&gt;

&lt;p&gt;With Github Actions, you can set them up directly in the Github repo.&lt;/p&gt;

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

&lt;p&gt;This will create a file in your code base under &lt;code&gt;.github/workflows/{filename}.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With this in place you should now see the build steps execute 1 by 1 and complete successfully, if your project is indeed passing all tests.&lt;/p&gt;

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

&lt;p&gt;Cover credit: &lt;a href="https://unsplash.com/photos/sJjvg1ybXRk"&gt;https://unsplash.com/photos/sJjvg1ybXRk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>devops</category>
      <category>showdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>A Few Things I Learned.  10 Years as a Software Engineer.</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Thu, 01 Apr 2021 18:27:10 +0000</pubDate>
      <link>https://forem.com/coreyjs/a-few-things-i-learned-10-years-as-a-software-engineer-2e1p</link>
      <guid>https://forem.com/coreyjs/a-few-things-i-learned-10-years-as-a-software-engineer-2e1p</guid>
      <description>&lt;p&gt;Hello there, I am Corey.  This is my first post in (&lt;em&gt;checks notes&lt;/em&gt;) a year and a half.&lt;/p&gt;

&lt;p&gt;I am a software engineer focusing on backend technologies and distributed systems.  I have worked in a variety of fields since graduating in 2010.  I entered the industry working for an e-commerce marketing firm building custom e-commerce solutions in C# and .NET.  After a few years of that (which was a learning experience while also being a negative depressing environment that ruined me until I left) I took another job at a local company that builds data and engagement platforms for Higher education.  This was a beautiful time that allowed me to shed the negativity of my previous position and get to work with amazing people.  &lt;/p&gt;

&lt;p&gt;In the same time span I started a few small companies to various degrees of failure, published games on the iOS app store and built a few SaaS applications in my spare time.  Finally I find myself where I am today, a growing Series B startup that I joined at the seed stage.  &lt;/p&gt;

&lt;p&gt;What follows this is just a few of the things I learned along my way.  I am in no way perfect, and at times quite confused on what my future in this world holds, but these are things rattling around in my head.  Here goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Down:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; You will never get anything unless you ask for it&lt;/li&gt;
&lt;li&gt; EQ &amp;gt; IQ&lt;/li&gt;
&lt;li&gt; Workplace empathy&lt;/li&gt;
&lt;li&gt; Interview skills&lt;/li&gt;
&lt;li&gt; Curiosity. &lt;/li&gt;
&lt;li&gt; Handling burnout and career confusion&lt;/li&gt;
&lt;li&gt; Years Experience != Experience.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  1.  You will never get anything unless you ask for it.
&lt;/h3&gt;

&lt;p&gt;Do not assume you will get that raise, that promotion, that team transfer or anything just by waiting your turn.  You need to be explicit in your intentions.  Many times we hesitate to ask for things to avoid sounding needy or that we are scared of hearing “no”.  Being told “no” is the worst case scenario, and that is such a simple inconsequential thing that it really doesn't matter.  What it shows is that the company sees you in a different light than you see yourself.  This knowledge is powerful.  At the end of the day you get what you want (granted you have to earn it) or you have the knowledge that you wont be getting it and you can use that to drive your future career moves.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.  EQ &amp;gt; IQ
&lt;/h3&gt;

&lt;p&gt;If you have ever worked in a negative place at a hostile company, you will understand how IQ is not a means to an end.  I would rather work with amazing people that are not the greatest engineers than I would want to work with geniuses who are ego driven ass hats.  Great people have the ability to make the people around them better, they amplify positivity.   EQ will take you farther than IQ ever will.  Now with all things moderation is key, this doesn't mean people with high IQ are always negative or high EQ means they are sub-par engineers.  You will know those alpha ego’s when you come across them.  &lt;/p&gt;

&lt;h3&gt;
  
  
  3.  Workplace Empathy.
&lt;/h3&gt;

&lt;p&gt;We are all going through some shit these days.  Some more so than others.  Being able to understand others helps us develop closer relationships with those people.  This can then in turn help build bonds between teammates and foster a culture of positivity and inclusiveness. &lt;/p&gt;

&lt;p&gt;A great quick video: &lt;a href="https://www.youtube.com/watch?v=KZBTYViDPlQ"&gt;Empathy vs Sympathy&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Interview Skills
&lt;/h3&gt;

&lt;p&gt;Working in the real world makes you rusty.  Im sure we all had interviews that we look back on and just are astonished at how ill prepared we were.  Interview skills differ from those used in day-to-day work, and you never know when you will need those skills to be sharp and pristine.  Verbal communication, technical communication, technical comprehension, system design.  All critical skills we must posses when we try to impress prospective employers but skills that deteriorate over time in the real world (maybe not for all, if you are lucky).&lt;/p&gt;

&lt;p&gt;Interview every ~10-12 months wether you need a job or not.  The worst that can happen is you say no.  The goal is to keep our interview skills honed and sharp.  This part is important for the verbal and behavioral communications.  Being able to engage with new people and to have conversations about yourself, your background and your goals is critical.&lt;/p&gt;

&lt;p&gt;Don't Fear the technical interview.  Yes these don't represent day to day work.  Yes they suck.  Yes it makes you have dreams of traversing binary trees and running sliding windows on arrays.  For many years I would shy away from anything that involved live coding, hackerrank or leetcode.  How many opportunities have I missed because I doubted myself and refused to prepare? These technical interviews are for showcasing skill but more so its about showing you took the time to prepare.  Plus its always good to understand arrays, lists, strings, trees, tries, searches, big-o and how to piece together scalable systems.  Prepare little by little, day by day, week by week.  These are things that can take months to fully prepare to a point that we are confident in whatever is thrown at us.  Also, don't overfit your memory on specific LC questions.  Learn the theory, patterns and ideas behind the data structures and algorithms and how they can be applied to any problem.  I recommend "Grokking the Coding Interview" for learning about the ideas and patterns behind the different types of questions and "Cracking the Coding Interview" as a good reference and refresher on those rusty skills. &lt;/p&gt;

&lt;h3&gt;
  
  
  5. Curiosity
&lt;/h3&gt;

&lt;p&gt;As engineers we must always be curious about many things.  Exploring new languages, frameworks, ideas or exploring parallel fields.  It's important to not be complacent with what you know and that it's a critical skill to continue to compound your knowledge and skill day by day.  There is an overwhelming amount of technology out there these days and it can become cumbersome to try and wrap your head around any of it.  They goal here is not to become a 10x'er super engineer, but to just be curious and find things that interest you and keep you excited.  Its easy to loose the passion in engineering, especially working in the real world.  Never stop exploring, learning and pushing yourself forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Handling burnout and career confusion
&lt;/h3&gt;

&lt;p&gt;When I first jotted down a list of items I wanted to talk about, this was one of the first ones I noted.  Truthfully though, I don't have an answer for this one.  It's something I fight through everyday hoping to better understand everything.  Point 5 above does help, finding the excitement again in the engineering field keeps the hope alive.  If anyone has any ideas or helpful methods, that would be fantastic.&lt;/p&gt;

&lt;p&gt;Career confusion is something I define as: Do I want to keep doing what I am doing?  Why am I not happy?  Do I have any applicable skills outside of programming?  Did I waste the past decade?  What can I do that I would be happy doing?  Every day is just going through the motions, not solving problems that push your creative brain forward, not being taken seriously and just a complete disjoint confusion around your place in this world, professionally speaking.  &lt;/p&gt;

&lt;h3&gt;
  
  
  7. Years Experience != Experience.
&lt;/h3&gt;

&lt;p&gt;We exist as the sum of our experiences.  The more we experience and push ourselves outside of our comfort zone the more we grow both personally and professionally.  It is easy to fall into the trap of accepting mediocrity and being complacent.  I have had done this in the past.  Staying at a job too long, not learning new skills, not earning much salary, just being complacent.  Think to yourself if I had to define success what does it look like to me?  Can you achieve that where you are?  Are you getting better day by day?  Or are you stuck?  Fear not, we all experience this.  The key is to invest in yourself, don't give up even when things seem hopeless and acknowledge failures.  For failures are the building blocks of success.&lt;/p&gt;

&lt;p&gt;p.s.  I was going to use more picture, but I didnt.  Are pictures good?  Distracting? Pallet cleansing?&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>learning</category>
      <category>tips</category>
    </item>
    <item>
      <title>The Pit Called Burnout</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Thu, 21 Nov 2019 18:43:50 +0000</pubDate>
      <link>https://forem.com/coreyjs/the-pit-called-burnout-620</link>
      <guid>https://forem.com/coreyjs/the-pit-called-burnout-620</guid>
      <description>&lt;h2&gt;
  
  
  Prologue
&lt;/h2&gt;

&lt;p&gt;The concept of burnout has always been an interesting one to me.  How do you know when it hits vs just having a bad day/week?  Personally I think its about retrospective.  Looking back and reflecting on the months and years you can identify the trends.  You can view the timeline of your career and life and what got you to this point now.  By reflecting on past choices and mistakes it can offer a small step forward.  I find some semblance of understanding by turning thoughts into words on this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Story
&lt;/h2&gt;

&lt;p&gt;For me, burnout is more than just physical and emotional exhaustion.  It is more the depression around spending half your life writing code, first for fun then for living, only to realize is this really what I want to be?  The idea of wasting my 20's and early 30's at simple engineering jobs and starting failed company after failed company is what is the most draining(are they really wasted? thats a reflection point for the future).  Day in and day out not learning anything.  Not spending your daily allowance of creativity and problem solving brain power.  The acceptance of mediocrity cuts deep.  I also think the fear of change is what keeps me locked in place at times, and its not lost on me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finale
&lt;/h2&gt;

&lt;p&gt;I realized my own struggle with burnout a few years ago.  Its still a struggle to find any passion in being an engineer.  Maybe its the simplicity of the problems being solved, or lack of career evolution; I am still finding that out.  But I have found something that helps.  I now say yes to almost everything, because I never know what I will like or what just clicks.  From writing this blog, to building games, writing tutorials, streaming on twitch, writing fiction, public speaking or building stuff.  I found being open to everything forces you out of your comfort zone.  Comfort kills creativity.  &lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Podcasts for Engineers and Programmers of All Levels</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Tue, 05 Nov 2019 14:55:26 +0000</pubDate>
      <link>https://forem.com/coreyjs/podcasts-for-engineers-and-programmers-of-all-levels-1fjd</link>
      <guid>https://forem.com/coreyjs/podcasts-for-engineers-and-programmers-of-all-levels-1fjd</guid>
      <description>&lt;p&gt;Lately I have been on a big podcast kick and I found a ton of great engineering related ones.  I saw some recent articles like this so I decided to make my own list. These are in no particular order of importance.&lt;/p&gt;

&lt;h2&gt;
  
  
  1 . Software Engineering Daily
&lt;/h2&gt;

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

&lt;p&gt;This is one of my favorite podcasts out there.  There are so many episodes available that range from Flutter, to scaling engineering at Facebook, Slack Messaging Architecture and so on.  These are real world examples of technologies in use at various companies.  Its an excellent resource to learn about new tech and how companies handle innovation.&lt;/p&gt;

&lt;p&gt;It can be found here: &lt;a href="https://softwareengineeringdaily.com/"&gt;https://softwareengineeringdaily.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The RayWenderlich.com Podcast
&lt;/h2&gt;

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

&lt;p&gt;This is also one of my go to's.  I have learned so much from this site in turns of iOS and Swift development.  The podcast has a broad range of topics from iOS, Android and Unity and beyond.  They are quick listens that are great for a morning commute.&lt;/p&gt;

&lt;p&gt;It can be found here: &lt;a href="https://www.raywenderlich.com/"&gt;https://www.raywenderlich.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Go Time
&lt;/h2&gt;

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

&lt;p&gt;An excellent Go focused podcast.  "A diverse panel and special guests discuss cloud infrastructure, distributed systems, microservices, Kubernetes, Docker…oh and also Go!"&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Python Podcast.__ init __
&lt;/h2&gt;

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

&lt;p&gt;Their words say it best:  "The podcast about Python and the people who make it great".  A python focused podcast that talks all things from Machine Learning to Web API's to, well anything.  And thats Python for ya.  Check it out &lt;a href="https://www.pythonpodcast.com/"&gt;https://www.pythonpodcast.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Engineering Culture by InfoQ
&lt;/h2&gt;

&lt;p&gt;Engineering goes beyond just building things.  Its about the how as much as the who.  This is a great listen to learn and familairize yourself with the otherside of the software world.  Excellent for learning about engineering management.  If you are like me and are transitioning from a full time coder to coder/leader then this is a great listen.&lt;/p&gt;

&lt;p&gt;Get it: &lt;a href="https://www.infoq.com/engineering-culture-podcast/"&gt;https://www.infoq.com/engineering-culture-podcast/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Bike Shed
&lt;/h2&gt;

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

&lt;p&gt;One of my newly favorite podcasts.  They range from Ruby to React to SQL and just life in the software world as a whole.  I have this at 6, but numbers are made up and ranks dont matter.  &lt;/p&gt;

&lt;p&gt;Here: &lt;a href="https://bikeshed.fm/"&gt;https://bikeshed.fm/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ALAS, if you have any other suggestions post them!  Im always looking for new listens and learning never stops.  &lt;/p&gt;

</description>
      <category>podcast</category>
    </item>
    <item>
      <title>Compounding as an Unstoppable Tool</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Thu, 17 Oct 2019 15:13:41 +0000</pubDate>
      <link>https://forem.com/coreyjs/compounding-as-an-unstoppable-tool-527a</link>
      <guid>https://forem.com/coreyjs/compounding-as-an-unstoppable-tool-527a</guid>
      <description>&lt;p&gt;Compounding.  I am often asked what traits/actions/paths are important for personal and professional growth.  The idea of compounding, I believe, is one of the more important ideas.  Continually building on top of previous goals and actions.  Just as dividends and investments compound and grow over time, we can continually grow results in many aspects of our lives.  From learning to health to happiness, with many small incremental steps we can incubate growth in our daily lives.&lt;/p&gt;

&lt;p&gt;The idea of compounding is simple.  Every day build on the previous day's results.  This can be stringing together workouts, working on side projects or just maintaining a schedule.  Eventually as we build up our routines they will become habit.  I found it easiest to progress by breaking everything up into smaller pieces.  As I achieve even the simplest of items this gives me visual affirmation that I am moving towards my goal.  On a large Unity project I am working on, I like to break out all my weekly tasks into 4-5 items each with their own subtasks.  Over the course of a week I can clearly see my progress, where I am lacking and what I can prioritize.  &lt;/p&gt;

&lt;p&gt;I also use this idea when I set my workouts and cardio for the week.  I found it difficult at first to set my objectives and goals, but by building little by little each day/week you begin to see progress.  Progress that is used as fuel to move you even further, you just have to light the embers.  Everything matters as far as keeping the mindset.  There are some days where I can only lift a few weights, or just walk on the treadmill because I am completely drained from the day.  Its ok to go 10/20/30% on some activities, but its important to do it anyways.  Train your mind that you can do it.  As a full time software engineer there are many times I come home and just cant write any code or even sit in front of a computer, but instead of throwing the day away I usually sit down and physically write down and review my objectives for the week (then I fire up some Destiny for some stress releasing crucible action).&lt;/p&gt;

&lt;p&gt;Those are my rambles.  Any progress is still progress, regardless of how small you think it is.  Every stone makes the foundation stronger.&lt;/p&gt;

</description>
      <category>growth</category>
      <category>mentalhealth</category>
      <category>personaldevelopment</category>
    </item>
    <item>
      <title>How do you define success?</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Wed, 16 Oct 2019 14:08:49 +0000</pubDate>
      <link>https://forem.com/coreyjs/how-do-you-define-success-2121</link>
      <guid>https://forem.com/coreyjs/how-do-you-define-success-2121</guid>
      <description>&lt;p&gt;It is a simple question but at times hard to understand: How does one define success? We each have our own goals, ambitions and traits that drive us towards this goal. This idea of success for many is driven by comparisons instead of the result of our own personal pillars.&lt;/p&gt;

&lt;p&gt;My idea of success is a simple question I ask myself everyday: &lt;strong&gt;Am I better today than I was yesterday.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have I accomplished some small goals? Have I learned more at work to push myself farther? Have I helped someone in need? The idea of bettering yourself everyday is something I can hope will bring me happiness. If I can quote Steve Jobs for a second:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“For the past 33 years,  I have looked in the mirror every morning and asked myself: “If today were the last day of my life, would I want to do what I am about to do today?” And whenever the answer has been “No” for too many days in a row, I know I need to change something.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do not become stagnate. Do not accept mediocrity. Do not settle for the mundane and lifeless. Is your job too easy? Are you unchallenged? Move on. Never stop building, never stop creating, never stop learning.  Find what drives you to be a better person.  Do not cheat your well being for short term dividends.&lt;/p&gt;

&lt;p&gt;What's the point?  The point is... don't lose your dinosaur.&lt;/p&gt;

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

</description>
      <category>career</category>
      <category>success</category>
      <category>goals</category>
    </item>
    <item>
      <title>Project Serenity: Dev Blog 0; Picking an Engine</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Fri, 06 Sep 2019 18:39:32 +0000</pubDate>
      <link>https://forem.com/coreyjs/project-serenity-dev-blog-0-picking-an-engine-4def</link>
      <guid>https://forem.com/coreyjs/project-serenity-dev-blog-0-picking-an-engine-4def</guid>
      <description>&lt;p&gt;Project Serenity is a game I have been working on for the better part of a year and a half.  Although a majority of that time was spent learning different engines, 3d modeling, writing and planning.  I will be using this dev blog to give insight into the different things I have learned along the way, as a way to help others and to keep myself on track!   &lt;/p&gt;

&lt;p&gt;When I initially started prototyping I was using Unity2018.  There are a few concepts and technologies I was going to need in an engine as I went forward such as terrain tools, a nice lighting system and a not so steep learning curve to get some ideas mapped out.  I picked Unity because I have been using it for simple prototypes since the Unity3 days.  So it was a no brainer to jump in and start development.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3nxq8sm2mylf9op5x673.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3nxq8sm2mylf9op5x673.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core of Serenity is exploring different landscapes.  I wanted to build unique areas, from islands to red wood forests to desolate decaying valleys.  One of the first issues I ran into was I kept needing to buy assets to help in this development.  Such as Gaia to help build terrain and Amplify to build shaders.  I eventually ran into an issue with an update to the tooling which ended up wiping all textures from my terrain.  Even with source control, this led me to explore other options. &lt;/p&gt;

&lt;p&gt;Some Screens from the early prototyping in Unity2018&lt;/p&gt;

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

&lt;p&gt;I decided to take Unreal Engine for a spin.  Being 100% new to UE4 I grabbed a few courses from the &lt;a href="https://www.gamedev.tv/" rel="noopener noreferrer"&gt;GameDev.tv&lt;/a&gt; guys on Udemy (they make amazing courses for UE, Unity, Godot, Blender, etc!).  I really fell in love with UE.  I had access to amazing terrain tools, lighting, volumetric fog.  A ton of excellent features that came packaged in without the need to add third party support.  After a few months I was able to prototype pretty fast using their Blueprint system.  I would say one of the downsides is there does not seem to be as much community help/tutorials/support as compared to Unity's massive community (thou there was still a lot!). &lt;/p&gt;

&lt;p&gt;Some UE4 shots:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F859d1yuisy0wsos6ngph.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F859d1yuisy0wsos6ngph.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffhg5yvx5kvf0s8k88f54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffhg5yvx5kvf0s8k88f54.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsyf6srbpmzg0nl9qstiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsyf6srbpmzg0nl9qstiy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh6eymvymzdwk3n9wyq0c.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh6eymvymzdwk3n9wyq0c.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fi4pejaffexr4p7xdozak.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fi4pejaffexr4p7xdozak.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So after a few months of exploring UE I had to make a decision on which engine to use moving forward.  One major sticking point of UE was that all scripting is in C++.  Which I found very slow to get used to, on top of learning all UE4's c++ macros.  Being a long time .NET developer I am extremely comfortable in C# which is Unity's base scripting language.  Combined with the impressive updates in Unity 2019 and the fact that I much prefer C# over C++ I decided to (once again) start prototyping back in Unity.  Now dont get me wrong, I love Unreal Engine and everything it offers and I will be back to it at some point.  But im looking for familiarity to help speed up the dev process and Unity offers that.&lt;/p&gt;

&lt;p&gt;I am very happy with my move back to Unity.  I have started trying to flush out a style and color scheme as well as work on the early parts of the story.  Below are a few of the newer design.  You can see how the art is moving from a realistic to a more stylized approach.  I am using the LWRP currently, which is great but also being so new that its cumbersome at times to get some older shaders to work correctly.  A majority of the models are done in Blender and I used Zbrush to help give them some different looks.&lt;/p&gt;

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

</description>
      <category>unity3d</category>
      <category>unreal</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Getting Started with Ruby and RVM</title>
      <dc:creator>Corey Schaf</dc:creator>
      <pubDate>Wed, 21 Aug 2019 10:48:26 +0000</pubDate>
      <link>https://forem.com/coreyjs/getting-started-with-ruby-and-rvm-ig7</link>
      <guid>https://forem.com/coreyjs/getting-started-with-ruby-and-rvm-ig7</guid>
      <description>&lt;p&gt;As of this writing we will be using ruby 2.5.1. I am going to be walking you through how to set up our basic ruby environment using RVM and how we can easily switch between different ruby installations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing RVM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://rvm.io/"&gt;RVM&lt;/a&gt; is a ruby environment manager. This is an optional step in starting ruby development, but highly recommended. This will allow us to have clean ruby environments for each of our projects, regardless of version/dependencies etc.&lt;/p&gt;

&lt;p&gt;Running the following cURL command will update our system with the latest stable RVM build.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$&amp;gt; \curl -sSL https://get.rvm.io | bash -s stable --ruby&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;RVM can show us all the available ruby versions that we can install on our system, from beta to stable to obsolete. Its an amazing way to handle switching different environments with ease. As of this post, the ruby install version is 2.5.1, so that is what we will be working with.&lt;/p&gt;

&lt;p&gt;Now we want to run the rvm helper script, that will adjust our RVM installation and our path. This allows us to run rvm at the command line.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; source /Users/corey/.rvm/scripts/rvm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; ruby -v&lt;br&gt;
ruby 2.5.1.p57&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will tell us our current ruby version, which for this example is sitting at &lt;code&gt;ruby 2.5.1p57&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now lets create a gemset, which is a unique environment that will house all our dependencies and gems.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; rvm gemset create rails-test-api&lt;br&gt;
ruby-2.5.1 - #gemset created /Users/coreyschaf/.rvm/gems/ruby-2.5.1@rails-test-api&lt;br&gt;
ruby-2.5.1 - #generating rails-test-api wrappers.......&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now lets switch to our newly created gemset&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; rvm gemset use rails-test-api&lt;br&gt;
Using ruby-2.5.1 with gemset rails-test-api&lt;/code&gt;&lt;br&gt;
&lt;code&gt;&amp;gt; rvm gemset name&lt;br&gt;
rails-test-api&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We are now using our newly created ruby environment. We will install some basic dependencies that we need going forward.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; gem install bundler&lt;br&gt;
fetching: bundler-1.16.5.gem (100%)&lt;br&gt;
Successfully installed bundler-1.16.5&lt;br&gt;
Parsing documentation for bundler-1.16.5&lt;br&gt;
Installing ri documentation for bundler-1.16.5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This installs bundler, which we will be using in our rails install in the next tutorial.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; gem install rails&lt;br&gt;
....&lt;br&gt;
...&lt;/code&gt;&lt;br&gt;
&lt;code&gt;&amp;gt; rails --version&lt;br&gt;
Rails 5.2.1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We have successfully installed our development environment and installed the newest Ruby on Rails framework.&lt;br&gt;
Let's create a quick dummy Rails application just to test our install.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; rails new demo-test&lt;br&gt;
Installing ....&lt;/code&gt;&lt;br&gt;
&lt;code&gt;&amp;gt; rails s&lt;br&gt;
=&amp;gt; Booting Puma ..&lt;br&gt;
....&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now if we go to our browser, and navigate to localhost:3000 we should see:&lt;/p&gt;

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

</description>
      <category>ruby</category>
      <category>rvm</category>
    </item>
  </channel>
</rss>
