Build Silly Apps for your Friends

A friend of mine runs a Horror podcast called Nite Shift Video, Horror Movie Reviews, Scary Stories, and Interviews with other people in the Spooky Community. One of the interview ice breakers he does is a scary version of MASH. No, not the old tv show about soldiers in the Korean war. The future telling paper and pen game from grade school.

Mash was a game where you picked some categories and filled them in with choices then people would pick a magic number through various means. Then you would count through and cross off every Nth choice until you were left with one choice in each category. Then that was supposed to be your future.

The host, Nite Shift Jay, would run a custom one they made in pen and paper and have the guest guess a number to decide their horror movie future. However, to cut down on the dead air time as he followed the algorithm of moving through the choices crossing out numbers, Jay asked me to make a website version, so he could just take the number and get the result to keep things running smooth.


With this request in mind, The Mash Website was built. This was a simple project, took me maybe a day to build and deploy once I sat down and did it. However, I did get to learn things even during a small project like this.

  • Utilize Docker to deploy on digital ocean
  • Use LetsEncrypt to secure a subdomain of my root domain.
  • Build a Dynamic Form builder, to allow users to decide how many categories and choices they want.
  • Automate log rotation, docker health checks and automated restarts.

All these things are simple in the grand scheme of things but very valuable to have done yourself. Most jobs you get hired at likely already have a lot of this done, or have someone who manages the DevOp side of things. So it feels good to take something and put it out for the world to use. Obviously, it could use a lot more cleanup and design, however, it served the purpose for Jay. Through the magic of google analytics as well, it seems as at least 24 other people have used it as well. While it’s not changing the world or making me millions, I hope it made someone smile.


Mash Website: https://mash.p3rishable.com/games

Nite Shift Video: https://www.instagram.com/niteshiftvideo/

New Year, New Me!

This is typically a phrase uttered by people who come into the new year with resolutions that are vague, and without a plan. “I want to lose weight” and ” I want to achieve inner peace”. They buy a gym membership, go for a few days, wander on a treadmill or lift a barbell or two. Then the next week they are back to sleeping in and back to old habits.

We are what we repeatedly do. Excellence, then, is not an act, but a habit.

Aristotle

Resolutions are almost built to fail, instead, let’s set some S.M.A.R.T Goals. Specific, Measurable, Achievable, Realistic, and Time-Bound.

  • Specific: Well defined, clear, and unambiguous
  • Measurable: With specific criteria that measure your progress toward the accomplishment of the goal
  • Achievable: Attainable and not impossible to achieve
  • Realistic: Within reach, realistic, and relevant to your life purpose
  • Time-Bound: With a clearly defined timeline, including a starting date and a target date. The purpose is to create urgency.

To achieve these goals, building good habits will be key. To do this I utilize an app called HabitNow, to track and evaluate my progress on Habit-based goals. For example, I can create a habit to walk 3 times a week, and this app will prompt each day, and give a quick glance at the status of my daily habits.

Finally, find an accountability buddy, whether it’s a spouse, friend, colleague or even publicizing your goals via social media or a blog. Find support where you can to ensure that you stay accountable, or build out a reward or even punishment system if you diverge from the new path you planning. If you lose 50 pounds you get a new wardrobe or donate a dollar to charity for every time you didn’t meditate once a day. If you thrive on competition find some friends who want to achieve the same goals and make it a game. The lowest steps for the week, they have to cook dinner for the other players. There are so many motivators, you just have to find what works for you.

Until I find an accountability buddy who aligns with my goals, I’ll use this blog. So down below are my goals for 2022. They are lofty, yet still attainable. The simple ones are easily boiled into habits, the bigger ones will require work and might be more nuanced but still are there to build drive, and all of them will help build off each other to ideally create a more enhanced version of me.

My 2022 Goals

  1. Sound Mind – Meditate Daily using a meditation app.
  2. Sound Body – Lose 20 lbs.
    1. Start tracking calories whenever I eat something using a food diary.
    2. Walk 3 times a week for 30 mins.
  3. Blog Once a Week
  4. Knowledge Growth – Read more books using the 10% Rule.
    1. Details in this previous blog post.
  5. Create a Product or service with 100 users.

I would love to hear what goals you have set for the new year, and I encourage you to share them below. If you have questions about S.M.A.R.T. goals or habit building feel free to reach out in the comments or on socials. Best of luck in the new year, and let’s stay committed to improvement together.

10% Rule & My Reading List for 2022

I’m going to try to read 34 books this year. I know it seems like quite a bit, and honestly, it is. However, I read a really interesting article about the 10% rule recently. Basically, it’s an easy way to break books up into daily percentage chunks so you can have small and attainable goals to accomplish each day.

The rules are easy:

  1. Create a backlog of books – for this, I selected from several different lists of suggested reads for Rails developers, Management, Startup, and Philosophy books. I took these suggestions and randomized them into an ordered list and decided that is my reading order for the year.
  2. Start Reading – Load them onto your Kindle or borrow them from your local library, and start reading 10% each day. Utilizing the downtime or wasted time, that exists during my day. Whether it’s while I’m waiting for my coffee to brew, or sitting in the dark waiting for my son to fall asleep because his newfound separation anxiety requires I stay in the room until he drifts off.

If you want to join me I’ve included my list below along with Amazon links, or you can use your public library, most have their own app to borrow digital copies of books for free.

  1. Drive: The Surprising Truth About What Motivates Us
  2. Patterns of Enterprise Application Architecture
  3. The Pragmatic Programmer: Your Journey To Mastery, 20th Anniversary Edition (2nd Edition)
  4. Being Geek: The Software Developer’s Career Handbook
  5. A Guide to the Good Life: The Ancient Art of Stoic Joy
  6. Shape Up – Ryan Singer
  7. Effective Programming – Jeff Atwood
  8. Getting Real – Basecamp
  9. Rework
  10. Design Patterns: Elements of Reusable Object-Oriented Software
  11. Ruby Cookbook: Recipes for Object-Oriented Scripting
  12. Ruby Best Practices: Increase Your Productivity – Write Better Code
  13. Zero to One: Notes on Startups, or How to Build the Future
  14. The Happiness Project, Tenth Anniversary Edition: Or, Why I Spent a Year Trying to Sing in the Morning, Clean My Closets, Fight Right, Read Aristotle, and Generally Have More Fun
  15. The Pragmatic Programmer: Your Journey To Mastery, 20th Anniversary Edition (2nd Edition)
  16. The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers
  17. Thank You for Being Late: An Optimist’s Guide to Thriving in the Age of Accelerations (Version 2.0, With a New Afterword)
  18. Remote: Office Not Required
  19. Flow: The Psychology of Optimal Experience (Harper Perennial Modern Classics)
  20. Clean Code: A Handbook of Agile Software Craftsmanship
  21. Rails AntiPatterns: Best Practice Ruby on Rails Refactoring (Addison-Wesley Professional Ruby) (Addison-Wesley Professional Ruby Series)
  22. Domain-Driven Design: Tackling Complexity in the Heart of Software
  23. Maverick Startup: 11 X-Factors to Bootstrap From Zero to Six Figures and Beyond
  24. Creativity, Inc.: Overcoming the Unseen Forces That Stand in the Way of True Inspiration
  25. Turn the Ship Around!: A True Story of Turning Followers into Leaders
  26. How to stop sucking and be awesome instead – Jeff Atwood
  27. The Well-Grounded Rubyist
  28. Psycho-Cybernetics: Updated and Expanded
  29. Peopleware: Productive Projects and Teams
  30. Practical Object-Oriented Design: An Agile Primer Using Ruby
  31. Refactoring: Improving the Design of Existing Code (2nd Edition) (Addison-Wesley Signature Series (Fowler))
  32. It Doesn’t Have to Be Crazy at Work
  33. Eloquent Ruby (Addison-Wesley Professional Ruby Series)
  34. Meditations: A New Translation

I would love to hear what books you plan on reading this year, and if you have any book suggestions to be added to my list for 2023. Feel free to let me know in the comments or on my socials. I will try to give some quick reviews on the books after I finish them, as well as update my progress throughout the year. Until then Happy Reading!

Asking for Help is Not a Weakness

“Never let your ego get in the way of asking for help when in desperate need. We have all been helped at a point in our lives.” – Edmond Mbiaka

Developers often don’t ask for help soon enough. They sit and spin their tires determined to try to prove they can solve the problem themselves without any help. This can lead to shoddy code, wasted time, and frustration. This feeling can likely be traced back to the imposter syndrome that most developers feel no matter which stage of their career. That itching feeling that everyone knows that you have no clue what you are doing, that you don’t belong here, and if they find out that you can’t solve everything, fast and perfectly you might get fired. The truth is, everyone struggles and the most successful developers know where to find that line between a valiant attempt to solve a problem, and stubborn time-wasting out of fear and pride. 

Asking for help is not only good for you and solving the problem that is impacting the progress. It is also a valuable experience for the person whom you ask. The process of explaining the problem and finding a solution forces both of you to think deeply about how the system works to communicate it clearly.  

While we teach, we learn. – Seneca

The Roman philosopher Seneca said, “While we teach we learn”. This is what is known as the Protege effect. A study was conducted that found that students who tutored were more inclined to learn and retain knowledge at a higher rate than those who did not.  Obviously, we can’t ask for everyone to go out and find an apprentice like in olden times to teach the craft to. However, We find ways to teach through other means: Pair Programming, Blogging, making videos, journaling and tutoring. 

However, when you do ask for help it is important to keep a few things in mind. Asking for help can’t just be about you relying solely on the other person to fix your problem. It is still your responsibility to contribute, ask questions along the way. Ask for explanations of how the system works, why your attempts didn’t work, and how you could have approached the problem better in the future. There is nothing worse than someone saying they need help than sitting in silence or on their phone next to you while you complete their task. It is very reminiscent of school group projects when the one person doesn’t help and just adds their name to the title slide. Don’t be that guy. 

So don’t be afraid to reach out for help. Most of the time people will happily help you because it validates them in their own position in the field. Knowing someone comes to you for an answer makes you feel solidified and helps push down those feelings of imposter syndrome. 

Don’t Be Afraid to Get an Internship

This is an article I’m writing for my college-age self and anyone else who is uncertain if they are ready for an internship. Around my sophomore year, I was working at multiple odd jobs at the university, Mailroom, Kitchen, and Maintenance, when I started talking with my professor about finally getting an internship as our degree path required internship credits. At that time, I had only done some CS classes and our project classes. None of which I thought qualified me to work in the professional field as an Intern. However, I decided to just see what the interview process would be. I sent my resume to three different places, the college website, a local software house, and a travel insurance search engine company. Going through the interview process I felt super discouraged, I didn’t know a lot of what they were asking, but I did my best to show interest, and ask questions. A few weeks after all 3 interviews I had only heard back from the campus website position and they wanted to bring me on! I was super excited and was headed over to sign paperwork and set my schedule with them. Halfway through I got a phone call from the travel insurance search engine company and received an even better offer, which I accepted. 

Once I was there I was forged in the fire under the CTO’s supervision. Making me commit code that I could see in production on day one, really helped boost my confidence that I could do this. Throughout the process, I realized that being an intern is not necessarily about the value that you bring immediately to the company. Instead, it’s a perfect opportunity for a company to take a blank slate that hasn’t learned any bad habits, train them in the best way they seem possible in the hopes of securing a well-trained developer post-graduation. They might pay you, but you will learn more in a good internship than you will in the generic CS classes at college, and they will pay you decently to do it!

In summary, be brave, get out there, and get an internship! You will gain so much real-world knowledge and be able to test out the type of industries that you might be interested in, it’s like dating for your future job. Due to my great internship, I fell in love with Ruby on Rails and have used that experience to progress successfully through my career. I will always be eternally grateful for the opportunity given to me as well as the great mentorship I received. 

Effectively Deal with Recruiters

So as a software developer I get a lot of different communications from recruiters. Linkedin, emailing, and cold calling are the worst culprits. Now sometimes there can be a good opportunity amongst the slew of people just buckshotting jobs that require skills  that are not even applicable to your own skill set. I hope to share some good practices to optimize your time, and success in finding a good opportunity amongst the sea of spam. 

Pre-Screening: 

This means on that initial reach out. Whether it’s a “wow you’re a great fit for our company” Linkedin blast or a cold call. You as a person have just as much a right to pre-screen companies as they have to do the same for potential hires.

1. Always ask for a job description 

This will cut a lot of wasted time. There are so many times where I have gotten a message saying you’d be a great fit, we have cool culture and cookies come join us. Then when you reach out and ask for what kind of technology you would be working with. They say Java, or Cobalt or some other technology that is nowhere on your Linkedin, resume, or even your reading list. Getting a job description will immediately get you a vibe of what the company is looking for, if your skills are applicable and if it’s a tech stack that you are interested in working in. 

2. Ask for a pay band. 

Most places won’t tell you any actual numbers, and typically you don’t want to reveal yours either for negotiating reasons. However a pay band is perfectly acceptable. This will also help weed out offers. I live in the second cheapest city in the United States. So when I get contacted by a local company I can pretty much rule them out, because if you work remotely for companies in California or New York the normalized pay scale is so drastically different. So finding out a pay band is basically a polite way of finding out if it’s worth your time to keep the conversation going. 

During the call :

A basic checklist of things that you should always have covered with your first call with the recruiter to get you set up for success moving forward or bailing out. 

  1. What will I be working on, What is the company or product about, what would my part be in it. 
  2. What technology will I be using, LAMP, MEAN, Rails. This can give you a better idea what to freshen up on before the first interview. 
  3. What is this company’s interview process like? With how drastic some interview processes have gotten now in the developer community from Take home Projects to Live coding in front of a panel. Knowing how many and what the rounds will be is a good way to judge if you want to expend the energy on this company.
  4. Benefits and Extras  – Health coverage, Snack Budget, Company Tesla, Jetpack allowance. All things that are important when judging multiple offers or the value of your current workplace. 
  5. TimeFrame to hire. This will give you an idea of how fast they want to move and can give you a plan on how to plan your exit in a successful interview process. 

I hope you find this checklist and tips helpful. If you have any tips to share or if you try it out let me know how it goes in the comments down below!

Run Rake tasks on a server with Capistrano and Rake

I ran into the issue the other day of getting my Jenkins to be able to
run rake tasks on a remote server. So I decided to write a rake task
that allowed it to offload the connection to the remote box onto
Capistrano. This nifty little Rake task will allow you to run Rake tasks
in a production environment on a remote server using the Dynamic Duo of
Capistrano 3 and Rake.

desc "Easily Run rake task on a remote server"
  task :server_side_rake do
    on roles(:app), in: :sequence, wait: 5 do
      within release_path do
      with rails_env: :production do
      execute :rake, ENV['task'], "RAILS_ENV=production"
      end
    end
  end
end

Then you can run your one off rake task with the following command:

cap production server_side_rake task=one_time_rake_task --trace

Easy as that!

Check for Compiled Assets Existence.

Have you ever run into a situation where you wanted to check if an asset exists in Rails. Then when you deploy to production, it doesn’t work. That is because Rails by default compiles assets which changes the path and file name.

We found this out the hard way, luckily it was just the first deploy so
it didn’t affect any customers. So I thought I would share the solution we found.

Inside of a helper add the following code:

def asset_exist?(path)
  if Rails.configuration.assets.compile
    Rails.application.precompiled_assets.include? path
  else
    Rails.application.assets_manifest.assets[path].present?
  end
end

Then in your view or controller:

if asset_exist?('test.png')
  puts "Asset found!"
else
  puts "Asset not found!"
end

There you have it!

Mobile Testing on Rails

If you have worked on making a website, in this mobile age you have probably run into the issue of testing local code on external devices, such as your cell phone or tablet. I’ll show you a really quick way to all your Rails server to be exposed to other devices on your network.

– Ensure Both Devices are on the same network.
– Then start your rails server using the following command:

rails s -b 0.0.0.0

Next find your local ip:

Mac
This can be found in your System Preferences -> Network and will be shown in tiny print under the status of your connection.

Linux
Use ifconfig to find your address

ifconfig

If you’re lazy you can use this command to just give you back what you want.

ifconfig | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

Finally on your mobile browser and go to the url YOUR_IP:PORT

Easy Blogging with Rake and Jekyll

Fresh out of College, I read everything on how to make yourself more marketable. Several places suggested, write a blog to get your name out there. However, as a graduate, I was not looking to drop money on a hosted blog or pay for a server to run my own. Also there is something awkward about dot wordpress dot com sites, that just makes people run away from them.

In walks GitHub pages. A useful tool for you to make a simple site for a project, but as you can work on yourself, You could argue that you are your biggest project. So while building this blog I decided to use Jekyll since GitHub will allow me to host it for free on their servers.

In order to make the process easier I created a Rake file too easily create new Posts.

# Ask for title
def ask message
  print message
  STDIN.gets.chomp
end
title = ask('Title: ')

#Create new a post
desc "Default 'rake' command creates a new post"
task :default do
  filename = "#{Time.now.strftime('%Y-%m-%d')}-#{title.gsub(/\s/, '_').downcase}.markdown"
  path = File.join("_posts", filename)
  if File.exist? path; raise RuntimeError.new("File exists #{path}"); end
  File.open(path, 'w') do |file|
    file.write <<-EOS
---
layout: post
title: #{title}
date: #{Time.now.strftime('%Y-%m-%d %k:%M:%S')}
---

Content goes here
    EOS
  end

  # open the file in vim
  sh "vim #{path}"

end

Then to create a new blog post you just run:

rake